簡體   English   中英

將Java編譯器后端重用於新JVM語言的有效方法

[英]Efficient ways to reuse a Java compiler's backend for a new JVM language

我正在寫針對JVM的語言,目前正在將編譯器放在一起。 對我來說,很明顯,從邏輯上講,我的新語言在創建字節碼時與Java具有許多相同的需求。 僅舉幾個例子:

  • 找出由點分隔的標識符序列是什么:abc可以引用局部變量a,字段a,類a或類ab
  • 轉換基本類型以進行算術運算:對於intVar * doubleVar,必須將intVar強制轉換為double
  • 查找一組參數的匹配方法:具有適當的繼承和與上述相同的原始轉換
  • 在相關說明中,自動裝箱
  • 通用類型檢查,例如List<X<? super Y>> l = new List<X<Z>>(); List<X<? super Y>> l = new List<X<Z>>(); 兼容

可能還有更多,我不知何故不想重新發明這些輪子(制作一種新語言,當然我已經在重新發明一些輪子了……),所以我想知道什么是最好的重用方法(部分內容)現有的Java編譯器,並將上面需要的AST片段傳遞給它。

我已經有了lexer和parser(ANTLR),所以我真的在尋找有關哪些編譯器的建議,這將使我相對容易地使用它們(例如,我對ECJ進行了一些研究,但是如果有人告訴我它不具備我想要的功能,或者使用另一個編譯器會更容易使用,那就太好了。

概括地說,這是一個肯定的問題:那里有哪個Java編譯器具有易於訪問的后端,適合與非Java JVM語言的前端一起使用?

這是我在閱讀學術論文時聽說的兩個可擴展的編譯器后端:

對於特定領域的語言工程,我建議

這些項目似乎已經成熟。 我從沒近距離看過他們,但我真的很想;)

冒着有點鈍的危險,我的答案是斯卡拉。

Scala是一種基於JVM的語言,自最新版本起,它具有宏系統 宏(當它們比與C關聯的函數更強大時)是一種在現有語言之上構建特定於域的語言的技術,而無需從頭開始。 宏系統使您可以用現有語言編寫代碼,並通過新的構造進行增強,並將新的構造編譯為基礎語言。

如果您想直接構建Java,可能值得考慮使用Java Syntax Extender ,但是JSE並未得到廣泛使用,並且可能相當粗糙。 (實際上,我可能還沒有聽說過更成熟的Java宏系統。)

暫無
暫無

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

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