我用C语言(使用Lex & Bison)为动态类型编程语言创建了一个编译器,它支持循环、函数内部的函数声明、递归调用等。我还创建了一个虚拟机,用于运行编译器创建的中间代码。
我在考虑把它编译成Java字节码,而不是我自己的中间代码。
我看到关于创建JVM语言的问题已经在asked上出现了,但我觉得答案并不是很有意义。
所以我的问题是:
.class
文件,比如jclasslib、bcel、gnu bytecode等等。你会推荐哪一个?另外,你知道C库也可以做同样的工作吗?发布于 2010-08-02 04:35:52
我也推荐使用ASM,但是看看Jasmin,我在一个大学项目中使用过(或者说不得不使用),它工作得很好。我使用Java和Jasmin为编程语言编写了一个词法分析器-解析器-分析器-优化器-生成器组合,因此它可以生成JVM代码。我上传了代码here;有趣的部分应该是source code itself。在文件夹bytecode/InsanelyFastByteCodeCreator.java
中,您可以找到一段将AST Tree转换为Jasmin汇编程序输入格式的代码。这很简单。
源语言(由词法分析器转换为AST )是名为MiniJava的Java子集。它缺少一些“复杂”的特性,如继承、构造函数、静态方法、私有字段和方法。这些功能都不难实现,但还有另一个任务需要编写x86后端(以便生成机器汇编器),如果没有处理这些事情的JVM,这些事情往往会变得很困难。
如果您想知道这个奇怪的类名:大学项目的任务是将AST转换为图(表示输入代码),优化该图,然后将其转换为Java字节码。这大约是项目工作的3/4,而InsanlyFastByteCodeCreator
只是测试一切的捷径。
看看Jon Meyer和Troy Downing的“Java Virtual Machine”一书。这本书大量引用了Jasmin汇编程序;它对理解JVM的内部原理非常有帮助。
发布于 2010-08-03 05:10:46
上个学期我参加了一门“编译器构造”课程。我们的项目正是你想要做的。
我用来编写我的语言的语言是Scala。它在JVM上运行,但支持许多Java不支持的高级特性(仍然完全兼容纯java JVM)。
为了输出java字节码,我使用了Scala CAFEBABE library。有很好的文档,你不需要深入到java类中去理解要做什么。
除了这本书,我认为你可以通过阅读我们在课程中所做的labs找到很多信息。
https://stackoverflow.com/questions/3380498
复制相似问题