在寫完第一篇文章之後 如何創建自己的操作系統,有人告訴我,如果我可以寫一篇 如何創建編程語言。 最初,我並沒有特別注意,但是現在和通過其他方式,我對編程語言的創建有了更多的了解。 所以做吧 基本的編程語言,可以輕鬆嵌入其他程序中,並且可以與我們還將設計的虛擬機一起使用。 今天,我們必須製造最基本的虛擬機。
您可能想知道: «虛擬機? 但這不是很困難,它還會使程序變慢嗎?” 相反,簡單的虛擬機非常簡單且相對較快。 我已經選擇 銹 作為虛擬機的語言。 那是什麼 銹?
銹 安裝在 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
在下一章中,我們將更多地了解我們的編程語言。
有趣的好奇心,儘管在現實中雖然不是很有用,但知道這一點也無害。
宣傳Rust真是太好了,它是一種語言,它不僅保證了它比c ++更安全,而且(目前)在語法上更加清晰,這預示了很多東西。
至於照片,我不會考慮Java Evolution XD。
從fortran中,我從未使用過它,但是對此卻聽不見很多...
我願意,即使Python在不斷發展,它在工程設計中也特別有用。
Fortran也許是與C一起使用的另一種很棒的語言。即使到了今天,真正關鍵的問題還是其中之一。
Fortran是C的“進化論”是有爭議的,也許隨著C的更新,更新和更多可能性的出現,Fortran可能正相反。 儘管一個至少沒有與另一個分離。
儘管從某些角度來看,最終職位仍有待商bat。
+1到Java
讓我們看看我是否喜歡這種方式,我為編程提供了一些東西,但基本的目的是了解我是否了解更多。
創建一種新的編程語言的真正目的是什麼?在我看來,隱藏源代碼是一種策略。
朋友,“您自己的操作系統”的延續發生了什麼? 不要把它留在那裡,請繼續。
實際上,您是一位大師,僅這兩首歌就完全吸引了我的注意力,但我不希望它們停留一半。
我知道我們很多人都這麼認為,我們正在等待這些非常有趣的話題的延續和結論。
非常有趣,非常感謝。 🙂
我不認為Java是一種編程語言,而是命令解釋器,因為它不是可編譯的
[編程語言是一種正式的語言,旨在表達可以由計算機等機器執行的過程。]
因此,Java是一種編程語言。 甚至Bash語言(Linux Shell語言)本身就是一種編程語言。
有兩種類型的語言:
-編譯
-口譯
-混合(編譯虛擬機,本機庫並解釋功能代碼)
對於多平台而言,口譯員非常有用,並且不會造成災難性的影響。 Java,VB.NET,C ++ .NET,F#和C#都是混合語言。 bash語言,bat,PHP,Javascript等是解釋型語言。
如果您不認為Java是一種語言,因為它是經過解釋的(不是),則不應考慮用於製作程序的許多其他語言。 此外,根據這三個規則,您不應認為除了機器語言本身以外,沒有任何編程語言。
為什麼不呢?甚至機器語言也不能被認為是一種語言,因為它實際上只是處理器“解釋”的一組命令。
因為有效地,所有語言不過是處理器解釋的一組命令而已。
您可能或多或少地喜歡一種語言(在這種情況下為Java),似乎或多或少地有用且功能強大,但是您可以說它不是一種編程語言,因為它不是經過編譯的……它違背了所有編程語言的定義。
😐我希望我看起來不太粗魯
不安靜,你只是摧毀了我們的生活
哈哈哈哈哈,perdoooon。 這不是我的意圖xD
java是一種編程語言。 因為您可以開發應用程序,並且在編譯時製作一個由JVM解釋的.jar,然後根據您的python邏輯,它也不會被解釋,但是會被編譯為不同的可執行文件...
很好的信息
很好的信息,但我對此表示懷疑,是否有可能從頭創建新的編程語言而不必依賴其他類比或軟件。 我說的方式與製作其他語言(如Java或HTML)的方式相同。
非常感謝您在這個問題上的幫助。