4

我正在编写一种针对 JVM 的语言,我目前正在将编译器放在一起。对我来说很明显,从逻辑上讲,在创建字节码方面,我的新语言与 Java 有许多相同的需求。仅举几个例子:

  • 找出以点分隔的标识符序列指的是什么:abc 可以指局部变量 a、字段 a、类 a 或类 ab
  • 转换算术运算的原始类型:对于 intVar*doubleVar,必须将 intVar 强制转换为 double
  • 找到一组参数的匹配方法:具有正确的继承和与上面相同的原始转换
  • 在相关说明中,自动装箱
  • 泛型类型检查,例如是否List<X<? super Y>> l = new List<X<Z>>(); 兼容

可能还有更多,而且我不知何故不想重新发明这些轮子(制作一门新语言,当然我已经在重新发明一些轮子了......),所以我想知道重用的最佳方法是什么(部分) 一个现有的 Java 编译器,将其传递给它需要弄清楚上述内容的 AST 片段。

我确实已经有了词法分析器和解析器(ANTLR),所以我真的在寻找关于那里有哪些编译器的建议,这样我就可以相对容易地使用它们(例如,我对 ECJ 进行了一些研究,但是如果有人告诉我它不能满足我的要求,或者另一个编译器会更容易使用,那就太好了)。

总结一个明确的问题:哪些 Java 编译器具有易于访问的后端,适合与非 Java JVM 语言的前端一起使用?

4

2 回答 2

3

以下是我在阅读学术论文时听说的两个可扩展编译器后端:

对于特定领域的语言工程,我建议

这些项目看起来很成熟。我从来没有仔细看过他们,但我真的很想;)

于 2012-09-19T06:48:11.163 回答
2

冒着有点迟钝的风险,我的答案是 Scala。

Scala 是一种基于 JVM 的语言,在最新版本中具有宏系统。宏(当它们比与 C 相关的宏更强大时)是一种在现有语言之上构建特定领域语言的技术,无需从头开始。宏系统允许您使用现有语言编写代码,并通过新结构进行增强,并将新结构编译成基础语言。

如果您想直接从 Java 构建,可能值得考虑Java Syntax Extender,但是 JSE 没有被广泛使用,并且可能非常粗糙。(事实上​​,可能还有我没听说过的更成熟的 Java 宏系统。)

于 2012-09-19T00:06:52.427 回答