【问题标题】:Generating Bytecode for Program for which a Compiler was build using ANTLR 4 with Java为使用 ANTLR 4 和 Java 构建编译器的程序生成字节码
【发布时间】: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


【解决方案1】:

这不是一个 ANTLR4 问题,但是方法相对简单:研究执行器,它稍后将执行您的字节码。查找描述此特定机器的字节码的文档。然后编写一个侦听器或访问者来溢出该代码。

这里的评论者似乎假设您想要生成 Java 字节码,但我实际上并不确定,因为您仅在解析上下文中提到 Java,而不是代码生成。

【讨论】:

  • 我想补充一点,最好的起点是手动生成一些字节码,以了解事情是如何工作的。比尝试使您的语言语法适合所学概念。
  • 我已经使用 ANTLR4(访问者方法)创建了解释器,但我现在要做的是针对我正在解释的语言,能够加载用该语言编写的代码的文件并生成该代码的字节码,以后可以执行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
  • 2014-03-05
  • 1970-01-01
相关资源
最近更新 更多