创建一个JVM编程语言

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (75)

我在C语言中创建了一个编译器(使用lex&bison),用于支持循环,函数内函数声明,递归调用等的动态类型化编程语言。我还创建了一个运行由编译器创建的中间代码的虚拟机。

我现在在想,不是编译到我自己的中间代码,而是编译成java字节码。

我看到有关创建JVM语言的问题已经被问到,但我没有找到答案非常丰富的答案。

所以这里是我的问题:

  1. 我想为JVM创建一种语言,必须阅读JVM规范书籍,您还可以推荐哪些其他书籍(当然除了Dragon Book)?我主要关心如何创建JVM语言的书籍或教程,而不是一般的编译器。
  2. 有许多Java库可以读取,写入和更改.class文件,如jclasslib,bcel,gnu字节码等。您会建议哪一个?另外,你是否知道做相同工作的C库?
  3. 我正在考虑看看另一种针对JVM的语言,如Clojure,Jython或JRuby。但是所有这些语言都是非常高级和复杂的(为它们创建一个编译器)。我正在寻找一个更简单的(我不介意它是未知的还是未使用的)编程语言,它的目标是JVM,它的编译器是开源的。有任何想法吗?
提问于
用户回答回答于

我也推荐ASM,但看看Jasmin,我用它(或:不得不使用它)来进行大学项目,并且它工作得很好,我写了一个词法分析器/分析器/分析器/优化器/生成器组合一种使用java和jasmin的编程语言,因此生成JVM代码。我在这里上传了代码,有趣的部分应该是源代码本身。在文件夹“bytecode / InsanelyFastByteCodeCreator.java”中,您可以找到一些代码,将AST树转换为jasmin汇编器的输入格式。非常直截了当。

源语言(由Lexer + Parser + Analyzer转换为AST)是Java的一个子集,称为MiniJava。它缺少一些“复杂”的功能,如继承,构造函数,静态方法,私人领域/方法。这些功能都不难实现,但是编写X86后端(以便生成机器汇编程序)还有另一个任务,如果没有处理某些事情的JVM,那么这些事情会变得很困难。

如果您想知道这个奇怪的类名:大学项目的任务是将AST转换为SSA图(表示输入代码的图),然后优化图,然后将图转换为java字节代码。这大约是该项目工作的3/4,而InsanlyFastByteCodeCreator只是测试一切的捷径。

查看Jon Meyer和Troy Downing的“Java虚拟机”一书。本书重点介绍了Jasmin-Assembler,对于理解JVM内部机制非常有帮助。

用户回答回答于

上学期我参加了“编译器构建”课程。我们的项目正是你想要做的。

我用来写我的语言的语言是Scala。它运行在JVM上,但支持许多Java不支持的高级功能(仍然完全兼容纯Java JVM)。

输出java字节码我已经使用了Scala CAFEBABE库。有良好的文档记录,你不必深入Java类来理解该做什么。

除了这本书,我认为你可以通过我们在课程期间完成的实验来找到很多信息。

扫码关注云+社区

领取腾讯云代金券