创build一个JVM编程语言
我在C语言中创build了一个编译器(使用lex&bison),用于支持循环,函数内部函数声明,recursion调用等的dynamictypes编程语言。我还创build了一个运行由编译器创build的中间代码的虚拟机。
我现在想的不是编译到我自己的中间代码,而是编译成java字节码。
我看到关于创build一个JVM语言的问题已经被问到,但我没有find答案非常丰富。
所以这是我的问题:
- 我想为JVM创build一种语言,一定要阅读JVM规范书,你还可以build议哪些其他的书(当然除了Dragon Book)? 我主要关心如何创buildJVM语言的书籍或教程,而不是一般的编译器。
- 有许多Java库可以读取,写入和更改.class文件,如jclasslib , bcel , gnu字节码等。您会build议哪一个? 另外,你是否知道做相同工作的C库?
- 我正在考虑看看另一种针对JVM的语言,比如Clojure,Jython或者JRuby。 但是所有这些语言都是非常高级和复杂的(为它们创build一个编译器)。 我正在寻找一个更简单的(我不介意如果它是未知的或未使用的)编程语言,目标的JVM和它的编译器是开源的。 有任何想法吗?
我也推荐ASM,但看看Jasmin ,我用它(或:不得不使用它)为一个大学项目,而且工作得很好,我写了一个词法分析器/分析器/分析器/优化器/发生器组合一个使用java和jasmin的编程语言,因此生成JVM代码。 我在这里上传了代码,有趣的部分应该是源代码本身 。 在文件夹“bytecode / InsanelyFastByteCodeCreator.java”中,您可以find一些代码,将AST树转换为jasmin汇编程序的input格式。 非常简单
源语言(由Lexer + Parser + Analyzer转换为AST)是称为MiniJava的Java子集。 它缺乏一些“复杂”的function,如inheritance,构造函数,静态方法,私人领域/方法。 这些function都不难实现,但是另外一个任务是编写一个X86后端(所以要生成机器组装者),如果没有处理某些事情的JVM,这些东西就会变得困难。
如果您想知道这个奇怪的类名:大学项目的任务是将AST转换为一个SSA图(如图所示的input代码),然后优化图,然后将图转换为java字节代码。 这大约是该项目工作的3/4,而InsanlyFastByteCodeCreator只是testing一切的捷径。
看看Jon Meyer和Troy Downing的“Java虚拟机”一书。 本书重点介绍了Jasmin-Assembler,对于理解JVM内部机制非常有帮助。
上个学期我参加了“编译器构build”课程。 我们的项目正是你想要做的。
我用来写我的语言的语言是Scala 。 它运行在JVM上,但支持Java不支持的许多高级function(仍然完全兼容纯Java JVM)。
输出java字节码我已经使用了Scala CAFEBABE库 。 有良好的文档logging,你不必深入Java类,以了解要做什么。
除了这本书,我想你可以通过我们在课程中所做的实验来find很多的信息。
ASM可以成为生成字节码的解决scheme。 要开始,请检查手册中有关生成元素的主题。
我正在考虑另外一种针对JVM的语言,比如Clojure,Jython或者JRuby。 但是所有这些语言都是非常高级和复杂的(为它们创build一个编译器)。
build议:你可以看看Lua编程语言 ,还有像LuaJ这样的JVM实现。
为J2ME和J2SE编写的轻量级 ,快速,以Java为中心的Lua 解释器 ,包含基本,string,表,包,math,io,os,debugging和协同程序包, 编译器 ,luajava绑定和JSR-233可插拔脚本引擎绑定。
(不要与LuaJava和JNI方法一起使用本地库)。
上个周末,我问自己同样的问题,把我的玩具语言移植到JVM上。
我只花了几个小时来search信息,所以请带上一点盐的参考。
-
语言实施模式 。 我讨厌antlr,但这本书看起来非常好。 如果你不喜欢antlr,parsing“分析技术。实用指南”是非常好的。
学习构buildconfiguration文件读取器,数据读取器,模型驱动的代码生成器,源到源翻译器,源代码分析器和解释器。 您不需要计算机科学的背景知识 – ANTLR的创build者Terence Parr将语言实现分解为最常见的devise模式。 通过模式模式,您将学习实现自己的计算机语言所需的关键技能。
第10章覆盖30页(以快速IMO)这个话题。 但是还有其他一些章节可能你会感兴趣。
- 10build立字节码解释器
- 10.1编程字节码解释器。 。
- 10.2定义汇编语言语法
- 10.3字节码机器结构。 。 。 。 。
- 10.4从哪里去。 。 。 。 。 。 。 。 。 。
- P.26。 字节码汇编。 。 。 。 。 。 。 。 。 。 。
- P.27。 基于堆栈的字节码解释器。 。 。
- P.28。 基于寄存器的字节码解释器
http://pragprog.com/titles/tpdsl/language-implementation-patterns
-
Lua 5.0的实现这是关于基于寄存器的字节码机器的一个很好的文章。 为了这个目的,去读一下吧。
-
小件的Lisp。 本书教授如何编写一个可编译为C的两个可比较的比较器。从本书可以学到很多经验教训。 我拥有这本书的副本,对于任何有趣的人来说都是非常好的,但也许不是你的一杯茶。
这是Lisp,Scheme和相关方言在内的整个Lisp系列语义和实现的综合说明。 它描述了11个口译员和2个编译器…
http://www.amazon.com/Lisp-Small-Pieces-Christian-Queinnec/dp/0521562473
- 10build立字节码解释器
检查基于寄存器的虚拟机Dalvik7。 DVM运行从Java编译器编译的Java类文件转换而来的字节码。
有一个关于这个主题,jvm语言的邮件列表。
你打算把代码上传到任何地方吗? 我想看看。
我build议你先学习JVM组件的工作方式,如果你还不知道的话。
许多说明书的forms?name
,在哪里?
是i
如果指令处理一个整数types和a
如果它与一个引用types工作。
基本上,JVM是一个没有寄存器的堆栈机器,所以所有指令都直接在堆栈上处理数据。 您可以使用?push/?pop
推送/popup数据,并使用?store/?load
在本地variables(由偏移量引用的堆栈位置)和堆栈顶部之间移动数据。 其他一些重要的指令是invoke???
if_???
。
对于我的大学的编译器课程,我们使用Jasmin来组装程序。 我不知道这是否是最好的方法,但至less这是一个容易开始的地方。
以下是 JVM旧版本的指令参考 ,其中可能包含比新版本更less的指令。
开始的最佳资源可能是Ola Bini的介绍 。 抓住幻灯片以及。
首先,我会退后一步,修改我的编译器,输出实际的Java代替Java字节代码(这意味着创build更多的翻译器而不是编译器),然后用任何Java环境编译Java输出(这可能会生成更好的目标代码比我自己的编译器)。
您可以使用相同的技术(例如,编译为C#)来生成CLI字节代码,或者编译为Pascal来生成P代码等。
目前还不清楚为什么你要考虑使用Java代码而不是使用你自己的虚拟机,但是如果是为了性能,当然你也应该考虑编译成实际的机器代码。