簡體   English   中英

為JVM編寫語言

[英]Writing languages for the JVM

假設我編寫了一種編程語言; 對於同名,我會稱之為

為了開始寫的漫長旅程,我決定開始寫自己的語言。 我實際上無法運行它,因為沒有什么可以運行自己運行的程序。

所以我首先在Java中為lang編寫另一個編譯器。 這一次,當我完成后,我決定將其轉換為字節碼,然后將其保留。 我現在有一個工作的編譯器,它將我所有的lang代碼轉換為Bytecode。

所以我決定將我的自編譯器插入到我剛剛用Java編寫的編譯器中。 然后我將自編譯器轉換為Bytecode,並丟棄Java編譯器。 我現在有一個lang編譯器,純粹自己編寫,轉換成字節碼,隨時可以使用。

這創建了一個可靠的程序,我理解所有這些,但我的問題是,相對於JVM的編譯器設計, 如果我決定發布我的語言更新怎么辦? 我如何更新字節碼? 我是否只是在舊版本中重新編寫該語言的更新版本?

我問這個是因為這就是我想要做的。 編寫一個不存在的語言,然后首先通過Java創建編譯器將其引導到JVM。

它與使用C ++完成的操作相同。 寫了C with Classes,然后編寫了C ++,最后C with Classes被放棄了,用於引導的C ++。 但那么他們究竟如何更新語言呢?

我將從您開發中的兩種可能情況中回答這個問題。 使用任何字節碼語言,您可以隨時更新虛擬機或語言。

假設您首先要更新語言以獲得新語法或更改當前語義。 然后,您將使用lang (編譯器A )編寫當前編譯的編譯器並編輯其源代碼,以便它可以正確編譯您的新功能。 然后使用給出編譯器B的舊編譯器編譯編譯器。 如有必要,您現在可以重寫編譯器以使用新功能,然后使用編譯器B對其進行編譯以為您提供編譯器C.

如果JVM發生變化怎么辦? 那么在這種情況下,您將保留舊版本的JVM,調整編譯器以應對新的字節碼更改,然后使用舊版本進行編譯(這類似於之前的編譯器B )。 這將為您提供一個編譯器,編譯為新的字節碼,但在舊的VM上運行。 下一步是讓它自己編譯,現在你有了一個在新VM上運行的新編譯器(類似於編譯器C )。

我不認為你的編譯器是最好的方法。

我從語言的語法開始。

接下來是詞法分析器/解析器,用於將我語言中的表達式轉換為抽象語法樹(AST)。 AST是表達式的正確中間表示。

您可以通過編寫遍歷AST的代碼生成器為您選擇的虛擬機或處理器發出字節碼或匯編語言指令。

您的更新在哪里發生?

如果它是語言基礎,則必須修改語法和字節碼發射。

如果要優化字節碼或移植到新處理器,則必須修改代碼生成器。

第一個lang編譯器可以用lang子集編寫。 而且你只需要一個子集(bootstrap)編譯器(甚至是interoreter)。 這可以用java編寫。

之后,可以用lang編寫更廣泛的編譯器。 較新的版本也可以。


您甚至可以編寫一個將lang程序轉換為java的轉換器,並使用它在lang中創建第一個轉換器,然后將其轉換為字節碼編譯器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM