【发布时间】:2019-11-25 12:55:11
【问题描述】:
我目前正在使用 ANTLR 4 和 Java 为特定编程语言开发编译器,现在我想为使用该特定语言编写的任何程序生成字节码或 CIL,但我不知道从哪里开始。
我搜索了很多页面,但找不到任何教程,而且我找到的任何示例都不能正确解释程序。我看到一个有用的库是asm,但我不明白它的实现。
任何人都可以通过一个可能的示例帮助我了解首选库及其实现吗?
【问题讨论】:
-
一个技巧是首先生成 java,编译它并使用 javap 反编译它,然后使用它创建第二个带有 ASM 的字节码编译器。然而,仅仅用 javap 反编译也可以。您可以使用 ASM 来替换类的部分内容。示例代码您必须自己搜索。编写 ASM cde 来拦截某些测试类的调用可能是一个很好的切入点。
-
@JoopEggen 问题是我没有要编译的 java 文件。我所拥有的是一个文件,其中包含来自另一种语言的代码,我在其中开发了一个使用 ANTLR 4 的编译器,该编译器验证并执行该代码。现在我想做的是能够为该语言的指令生成字节码。
-
我只是建议可以先写一个java编译器,反编译它的产品,这样每个结构都清楚,然后再写一个编译器到字节码。或者编写小型 java 代码 sn-ps,编译和反编译以获得工作目标代码,以与 ASM 一起使用。否则有两个问题:1.你应用ASM是否正确,2.生成的代码是否正确。
-
起点是The Java® Virtual Machine Specification,因为你必须了解它是如何工作的,才能为它生成代码。它包含对类文件格式的描述(第 4 章)以及 Java 构造如何映射到字节码的一些示例(第 3 章),这些示例可以帮助您正确思考。我从未使用过有关该主题的任何教程。他们只重复信息(在最好的情况下)。有时它们不正确、草率或过时,无论如何您都必须参考权威来源。
-
tomassetti.me/generating-bytecode> 上有一个非常好的教程,生成字节码是整个系列的第 8 部分,它将引导您完成所有内容。代码在 kotlin 中,但应该很好地映射到 java。
标签: java compiler-construction antlr4 bytecode cil