【发布时间】:2011-08-18 11:49:32
【问题描述】:
如果我想为 Java 创建一种新语言,我应该制作一个能够生成与 JVM 规范兼容的字节码的编译器,对吗?也适用于 JDK 库?
我在哪里可以找到一些信息?
谢谢。
【问题讨论】:
如果我想为 Java 创建一种新语言,我应该制作一个能够生成与 JVM 规范兼容的字节码的编译器,对吗?也适用于 JDK 库?
我在哪里可以找到一些信息?
谢谢。
【问题讨论】:
我将从生成 Java 源代码的编译器开始。您可能会发现这更容易阅读/理解/调试。稍后您可以对其进行优化以生成字节码。
编辑:
如果您有无法轻松转换为 Java 代码的功能,您应该能够使用 Jasmin 创建少量字节码类,这些类具有您可以测试到死的所有奇特功能。从生成的 Java 代码来看,这看起来像是一个普通的方法调用。 JVM 仍然可以内联该方法,因此这可能根本不会影响性能。
【讨论】:
goto 必须在 Java 中使用循环和棘手的 continue/break 来实现,可能还需要一个开关。在字节码中有一个 goto 操作码,所以没问题。)
我认为这对实践没有多大帮助,但它有很多甜蜜的理论知识,我认为你会发现它们很有用。
【讨论】:
用于字节码生成/操作的优秀库是 ASM:http://asm.ow2.org。
它非常通用和灵活。但是请注意,它的 API 基于事件(类似于 Sax 解析器)——它读取 .class 文件并在遇到新实体(类声明、方法声明、语句等)时调用方法。起初这可能看起来有点尴尬,但它节省了大量内存(与替代方案相比:库读取输入,吐出完全进化的树结构,然后您必须对其进行迭代)。
【讨论】:
取决于您所说的“为 Java 创建一种新语言”是什么意思——您是指一种可以编译为字节码的语言,并且它生成的代码可以从任何 Java 应用程序(例如 Groovy)或解释语言(为此你想用Java写一个解析器)? 如果是前者,那么@Joachim 是对的,请查看 JVM 规范;对于后者,请查看 JavaCC 之类的工具来为您的语言语法创建解析器。
【讨论】:
Java Virtual Machine Spec 应该可以满足您的大部分需求。
【讨论】: