我用C语言(使用Lex &野牛)为动态类型编程语言创建了一个编译器,它支持循环、函数内的函数声明、递归调用等。我还创建了一个虚拟机,用于运行编译器创建的中间代码。
我想把它编译成Java字节码而不是我自己的中间代码。
我看到关于创建JVM语言的问题已经是asked了,但是我没有发现答案是非常有用的。
所以我的问题是:
1.我想创建一个JVM语言必须阅读JVM specification书,你还能推荐什么书(当然除了Dragon Book)?我主要关心的是关于如何创建JVM语言的书或教程,而不是一般的编译器。
1.有许多Java库可以读取、写入和更改.class
文件,如jclasslib、bcel、gnu bytecode等。您会推荐哪一个?另外,您是否知道有C库可以做同样的工作?
1.我想看看其他面向JVM的语言,比如Clojure、Jython或JRuby。但是所有这些语言都是非常高级和复杂的(为它们创建编译器)。我在寻找一种更简单的(我不介意它是未知的或未使用的)面向JVM的编程语言,并使用开源编译器。有什么想法吗?
8条答案
按热度按时间qvk1mo1f1#
我也会推荐ASM,但是看一下Jasmin,我在一个大学项目中使用过它(或者说,不得不使用它),它运行得相当好。我使用Java和Jasmin为一种编程语言编写了词法分析器-解析器-分析器-优化器-生成器组合,因此它生成JVM代码。有趣的部分应该是source code itself。在文件夹
bytecode/InsanelyFastByteCodeCreator.java
中,您可以找到一段代码,它可以将AST树转换为Jasmin汇编程序的输入格式。它非常简单。源语言(由词法分析器-语法分析器-分析器转换为AST)是Java的一个子集,称为MiniJava。它缺少一些“复杂”的特性,如继承、构造函数、静态方法、私有字段和方法。这些特性都不难实现,但要编写一个x86后端还有一个任务(因此要生成机器汇编程序),如果没有JVM来处理其中的一些事情,这些事情往往会变得很困难。
InsanlyFastByteCodeCreator
只是测试所有内容的捷径。请看一下Jon Meyer和Troy Downing的“Java虚拟机”一书。这本书大量引用了Jasmin汇编程序;这对理解JVM的内部结构非常有帮助。
68de4m5k2#
上学期我参加了一个“编译器构造”课程。我们的项目正是你想做的。
我用来编写我的语言的语言是Scala,它运行在JVM上,但支持许多Java所不支持的高级特性(仍然完全兼容纯java JVM)。
为了输出java字节码,我使用了Scala CAFEBABE library。文档很好,你不需要深入java类来理解该怎么做。
除了这本书之外,我想你还可以通过我们在课程中学习的labs找到很多信息。
pgvzfuti3#
ASM可以作为生成字节码的一个解决方案。要开始,请查看有关从manual生成 * 元素 * 的主题。
yh2wf1be4#
上周末,我问自己同样的问题,把我的玩具语言移植到JVM。
我只花几个小时搜索信息,所以对这篇参考文献持保留态度。
*语言实现模式。我讨厌antlr,但这本书看起来很好。如果你也不喜欢antlr,有一本关于解析的很好的“解析技术。实用指南”
学习构建配置文件读取器、数据读取器、模型驱动代码生成器、源代码到源代码转换器、源代码分析器和解释器。您不需要计算机科学背景-ANTLR创建者Terence Parr通过将语言实现分解为最常见的设计模式来揭开语言实现的神秘面纱。通过一个模式一个模式地学习,您将学习实现您自己的计算机语言所需的关键技能。
第10章涵盖在30页(以快速海事组织)这个主题。但还有其他章节,可能你会感兴趣。
http://pragprog.com/titles/tpdsl/language-implementation-patterns
*Lua 5.0的实现这是一篇关于基于寄存器的字节码机器的很棒的论文。2即使是为了它,也要去读一读。
***Lisp在小片段。**这本书教如何写一个2 schme compailers编译到C。这么多的教训可以从这本书中学到。我自己的一本这本书,它真的很好,任何人感兴趣的是lisp,但也许不是你的茶。
这是对整个Lisp语言家族,即Lisp,Scheme和相关方言的语义和实现的全面说明。它描述了11个解释器和2个编译器...
http://www.amazon.com/Lisp-Small-Pieces-Christian-Queinnec/dp/0521562473
检查Dalvik 7 VM,这是一个基于寄存器的VM。DVM对字节码进行操作,这些字节码是从Java编译器编译的Java类文件转换而来。
有一个关于jvm-languages主题的邮件列表。
你打算把代码上传到任何地方吗?我想看看。
64jmpszr5#
我想看看另一种面向JVM的语言,比如Clojure、Jython或JRuby。但是所有这些语言都是非常高级和复杂的(为它们创建编译器)。
建议:您可以看一下Lua Programming Language,它有一些JVM实现,如LuaJ。
轻量级、快速、以Java为中心的Lua解释器,专为J2 ME和J2 SE编写,包含基本、字符串、表格、包、数学、io、操作系统、调试和协同程序包的库、编译器、luajava绑定和JSR-233可插拔脚本引擎绑定。
nbewdwxp6#
如果您还不了解JVM汇编的工作原理,我建议您首先了解它。
许多指令的格式为
?name
,其中?
是i
(如果指令使用整数类型),a
是a
(如果指令使用引用类型)。基本上,JVM是一个没有寄存器的堆栈机器,所以所有的指令都直接在堆栈上处理数据。你可以用
?push/?pop
推/出数据,也可以用?store/?load
在局部变量(由偏移量引用的堆栈位置)和堆栈顶部之间移动数据。其他一些重要的指令是invoke???
和if_???
。对于my university's compiler course,我们使用Jasmin来组装程序。我不知道这是否是最好的方法,但至少它是一个容易开始的地方。
Here is an instruction reference,表示旧版本的JVM,其中包含的指令可能比新版本少。
bfnvny8b7#
当然,我曾经可以使用Java编写一种新语言。使用Java反射API,您可以获得很多成就。如果速度不是太重要,我会给予Java而不是ASM。使用Java (恕我直言) 编程更容易,也更不容易出错。看看RPN语言7th。它完全是用Java编写的。
ctrmrzij8#
首先,我会退一步,修改我的编译器以输出实际的Java而不是Java字节码(这意味着创建更多的翻译器而不是编译器),并使用任何方便的Java环境编译Java输出(这可能会生成比我自己的编译器更好的目标代码)。
您可以使用相同的技术(例如,编译为C#)生成CLI字节代码,或编译为Pascal生成P代码,等等。
目前还不清楚您为什么要考虑使用Java代码而不是使用自己的VM,但如果是为了提高性能,那么您当然也应该考虑编译为实际的机器代码。