創建自己的編程語言(I)

編程語言的演變

在寫完第一篇文章之後 如何創建自己的操作系統,有人告訴我,如果我可以寫一篇 如何創建編程語言。 最初,我並沒有特別注意,但是現在和通過其他方式,我對編程語言的創建有了更多的了解。 所以做吧 基本的編程語言,可以輕鬆嵌入其他程序中,並且可以與我們還將設計的虛擬機一起使用。 今天,我們必須製造最基本的虛擬機。

您可能想知道: «虛擬機? 但這不是很困難,它還會使程序變慢嗎?” 相反,簡單的虛擬機非常簡單且相對較快。 我已經選擇 作為虛擬機的語言。 那是什麼 ?

它是一種專注於執行安全性的編程語言,因此使用它幾乎不可能使某人能夠關閉虛擬機。 它是開發人員開發的一種編譯語言 Mozilla的. 伺服,替代 壁虎,正在他身上發展。 您仍然可以更改語法,但是我要使用的代碼將一直保留到第一個穩定版本。

安裝在 Linux 以一種簡單的方式。 但是,沒有官方包裹。 的用戶 Ubuntu 可以添加這兩個 PPA: ppa:hansjorg / rust  y ppa:cmrx64 /貨物,的用戶 可以使用 AUR (貨物-吉特 是安裝所有內容的軟件包)。 其餘的可以使用:

curl -s https://static.rust-lang.org/rustup.sh | sudo sh

虛擬機如何工作?

如果您知道彙編程序世界是如何工作的,那麼對於堆棧還是堆棧,它們是完全相同的。 如果沒有,我將向您解釋。 讓我們想像以下代碼:

打印2 + 3

計算機不了解2 + 3的含義,也不知道遵循的順序。 計算機使用電池或電池堆工作,在其中累積並連續提取數據。 我們的虛擬機中的代碼應如下所示:

推2推3添加打印

基本上,我們會將2放在棧頂,也將3放在棧頂。 ADD會拉(即從堆棧中刪除並獲得其值)堆棧中的最後2個項目,並將結果添加到堆棧頂部。 PRINT會拿走堆棧中的最後一個項目,並用它來顯示給我們。 現在讓我們來做 .

我們必須首先為 字節碼,我們可以使用現有的 Java的CLR .NET / Mono,但我們將創建一個更基本的版本。

https://gist.github.com/a01de8904fd39a442c20

我們為每條指令使用十六進製表示法。 高,我們把 #[派生(FromPrimitive)],是 它將幫助我們以後能夠直接將枚舉與字節進行比較。

現在,我們必須創建一個執行所有這些指令的函數。 為此,我們必須讀取一個字節並將其與枚舉中的指令進行比較。 如果找到任何存在的內容,則必須執行操作。

https://gist.github.com/8950ce212a2de2f397f9

我們這樣做是為了分別讀取每個字節並執行它們:

https://gist.github.com/12e24a1f0dd65e4cd65d

如您所見,我們區分之前是否給過PUSH命令(我們的INTEGER命令),下一個字節將被完全帶入堆棧。 在這裡,我們使用了兩個我沒有教過的功能, self.pop() y self.push(),顯然負責處理堆棧。

https://gist.github.com/54147f853a8a2b8c01d9

它們不是很複雜,但是pop函數具有錯誤檢測機制。 實際上,在 ,如果我們刪除這些機制,則會給我們帶來編譯錯誤。 現在我們只需要調用一個程序 佩林 (我們的虛擬機)並執行字節碼。

https://gist.github.com/99b1ab461318b3a644d0

該字節碼可以從文件中讀取,但是為了簡單起見,我將其存儲在變量中。 如果執行它,它將給我們預期的結果:

Perin v0.1 Perin VM執行FlopFlip字節碼啟動PerinVM實例PerinVM v0.1.0整數值5

所有代碼均可在 GitHub上Apache許可2.0: https://github.com/AdrianArroyoCalle/perin。 要進行編譯,他們必須具備 貨物 安裝並放置:

收費構建&& ./target/main

在下一章中,我們將更多地了解我們的編程語言。


發表您的評論

您的電子郵件地址將不會被發表。 必填字段標有 *

*

*

  1. 負責數據:MiguelÁngelGatón
  2. 數據用途:控制垃圾郵件,註釋管理。
  3. 合法性:您的同意
  4. 數據通訊:除非有法律義務,否則不會將數據傳達給第三方。
  5. 數據存儲:Occentus Networks(EU)託管的數據庫
  6. 權利:您可以隨時限制,恢復和刪除您的信息。

  1.   路人 他說:

    有趣的好奇心,儘管在現實中雖然不是很有用,但知道這一點也無害。

    宣傳Rust真是太好了,它是一種語言,它不僅保證了它比c ++更安全,而且(目前)在語法上更加清晰,這預示了很多東西。

    至於照片,我不會考慮Java Evolution XD。

    1.    路人 他說:

      從fortran中,我從未使用過它,但是對此卻聽不見很多...

      1.    可笑的 他說:

        我願意,即使Python在不斷發展,它在工程設計中也特別有用。

      2.    約翰 他說:

        Fortran也許是與C一起使用的另一種很棒的語言。即使到了今天,真正關鍵的問題還是其中之一。

        Fortran是C的“進化論”是有爭議的,也許隨著C的更新,更新和更多可能性的出現,Fortran可能正相反。 儘管一個至少沒有與另一個分離。

        儘管從某些角度來看,最終職位仍有待商bat。

    2.    舊金山 他說:

      +1到Java

  2.   波塔羅 他說:

    讓我們看看我是否喜歡這種方式,我為編程提供了一些東西,但基本的目的是了解我是否了解更多。

  3.   用戶gnulinux 他說:

    創建一種新的編程語言的真正目的是什麼?在我看來,隱藏源代碼是一種策略。

  4.   耶利 他說:

    朋友,“您自己的操作系統”的延續發生了什麼? 不要把它留在那裡,請繼續。

    實際上,您是一位大師,僅這兩首歌就完全吸引了我的注意力,但我不希望它們停留一半。

    我知道我們很多人都這麼認為,我們正在等待這些非常有趣的話題的延續和結論。

  5.   克里斯蒂安·戴維(Cristian David) 他說:

    非常有趣,非常感謝。 🙂

  6.   免費 他說:

    我不認為Java是一種編程語言,而是命令解釋器,因為它不是可編譯的

    1.    馬里奧 他說:

      [編程語言是一種正式的語言,旨在表達可以由計算機等機器執行的過程。]

      因此,Java是一種編程語言。 甚至Bash語言(Linux Shell語言)本身就是一種編程語言。

      有兩種類型的語言:
      -編譯
      -口譯
      -混合(編譯虛擬機,本機庫並解釋功能代碼)

      對於多平台而言,口譯員非常有用,並且不會造成災難性的影響。 Java,VB.NET,C ++ .NET,F#和C#都是混合語言。 bash語言,bat,PHP,Javascript等是解釋型語言。

      如果您不認為Java是一種語言,因為它是經過解釋的(不是),則不應考慮用於製作程序的許多其他語言。 此外,根據這三個規則,您不應認為除了機器語言本身以外,沒有任何編程語言。

      為什麼不呢?甚至機器語言也不能被認為是一種語言,因為它實際上只是處理器“解釋”的一組命令。

      因為有效地,所有語言不過是處理器解釋的一組命令而已。

      您可能或多或少地喜歡一種語言(在這種情況下為Java),似乎或多或少地有用且功能強大,但是您可以說它不是一種編程語言,因為它不是經過編譯的……它違背了所有編程語言的定義。

    2.    馬里奧 他說:

      😐我希望我看起來不太粗魯

      1.    瑪麗亞·安東尼奧·德·曼紐拉·卡德納斯 他說:

        不安靜,你只是摧毀了我們的生活

      2.    馬里奧 他說:

        哈哈哈哈哈,perdoooon。 這不是我的意圖xD

    3.    卡洛斯 他說:

      java是一種編程語言。 因為您可以開發應用程序,並且在編譯時製作一個由JVM解釋的.jar,然後根據您的python邏輯,它也不會被解釋,但是會被編譯為不同的可執行文件...

  7.   埃里亞斯·蒙格洛斯(Elias Mongelos) 他說:

    很好的信息

  8.   卡洛斯·阿圖羅(Carlos Arturo) 他說:

    很好的信息,但我對此表示懷疑,是否有可能從頭創建新的編程語言而不必依賴其他類比或軟件。 我說的方式與製作其他語言(如Java或HTML)的方式相同。
    非常感謝您在這個問題上的幫助。