有没有Java字节码生成指南?

5
我们正在编写一种从Pascal到JVM Bytecode的编译器。我们已经实现了表达式树生成,下一步应该是创建.class文件。你能否建议一些指导/教程,以便至少从一些静态数据中生成任何.class文件?因为我已经谷歌搜索了2个小时并阅读了JVM规范,但我真的需要一些最简单的例子来开始开发整个项目。
4个回答

6

已经有人编写了一个广泛使用的字节码生成库:CGLIB

如果您能想出如何将您的AST放入CGLIB中,那么问题就迎刃而解了。


谢谢!唯一遗憾的是没有关于代码生成的教程 :( 只有关于 .class 文件操作的教程。不管怎样,我会尝试想出一些解决方案。 - Uko
如果您能够想出如何将Pascal AST映射到Java Beans,那么它会起作用吗?这是困难的部分,因为据我所知,Pascal不支持对象。CGLIB无法帮助您解决这个问题;没有库可以自动完成这项工作。这就是您和您的领域知识发挥作用的地方。 - duffymo
Pascal不支持对象?这是几十年来的谎言。 - avra
写这个代码已经几十年了,所以那是我的错误。我不知道源代码有多少面向对象,除了 OP 之外,也没有其他人知道。 - duffymo
avra: Pascal不支持,Object Pascal(苹果公司后来的Turbo Pascal和Delphi)支持。 - Marco van de Voort
@avra 对象 Pascal 真是糟糕,它似乎是 Pascal 的前 Delphi 时代 :) 此外,在处理非面向对象编程时,生成 Java .class 文件相当容易,只需将所有过程/函数放入方法中,将所有应用程序代码放入 main 方法中,并将所有变量作为类字段 :) - Uko

4
实际上,您可以在下载的ASM文件夹中找到一个示例文件。它名为Helloworld,位于examples子文件夹中。它展示了如何编译(从头开始生成)对应于简单hello world应用程序的.class文件。它还展示了如何从.class文件中获取日期,但这是另一件事情。
也许这不是最好的方法,但当您需要开始使用Java字节码生成并且需要一些基本示例时,查看ASM和标准包中捆绑的示例是个好主意。
此外,Groovy使用ASM来生成其代码 :)

2

我不知道你是否了解,但是FPC有一个后端可以生成符合JDK 1.5标准的字节码。该开发看起来相当新(2011年11月)。你应该看一下。


请注意,尽管它是GPL许可的,但如果您想销售结果,则不是理想的源。 - Marco van de Voort
谢谢,这真是有趣的东西。我不会出售它。这是在大学编译器课程期间制作的项目。但由于我们所有的学校都教授 Pascal,也许我会制作一些 NetBeans 模块,这样学生们就会有一个不错的 IDE。 - Uko
为什么不直接使用Lazarus呢?它是可定制的,而且他们正在开发教育版。http://lazarus.freepascal.org http://wiki.freepascal.org/Lazarus_for_education - Marco van de Voort

1

有几个广泛使用的字节码生成项目。

ASM和CGLib可能是两个最好的例子。

您可能不想从头开始构建自己的生成库-这是很多工作,很难做到正确,并且可能没有太多优势超过使用现有项目。

ASM在JVM上被非Java语言广泛使用,具有还算可以的文档,不太难入手。

我没有像使用CGLib那样经常使用它,但我发现它不太容易入门。

最后一点数据是,Java 8团队正在使用ASM原型测试一些新的Java特性(包括lambda表达式)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接