如何将三地址代码 (TAC) 转换为 Java 字节码?

How to translate Three Address Code(TAC) to Java Bytecode?

我想将普通的三地址代码文件翻译成 Java 字节码。已经有一些与此主题相关的问题,但要么没有得到回答 or the question 远远超出了我正在寻找的范围。

以"Dragon Book":

中可用的前端编译器生成的这段代码为例
L1:L3:  i = i + 1
L5:     t1 = i * 8
        t2 = a [ t1 ]
        if t2 < v goto L3
L4:     j = j - 1

在字节码中它会是什么样子?我是否需要重建符号 table 来进行翻译?如果有人能像 blackcompe 在此 answer 中那样描述它,那将非常有帮助(我知道 JVM 是堆栈机器,而不是寄存器机器)。

以下是我如何用字节码编写您的代码。但这只是一种方法,而且问题是开放式的。我假设所有变量都是整数,除了 a。如果它们是不同的类型,所需的代码显然看起来不同。

; assume i, j, a, and v are in slots 0-3 respectively
L3: 
iinc 0 1
iload_0
bipush 8
imul
; store t1 in a variable for simplicity - you could simplify the code by eliminating the temporary
istore 4
aload_2
iload 4
iaload
istore 5
iload 5
iload_3
if_lt L3
iinc 1 -1

如前所述,这是一个非常开放的问题。例如,上面的代码显式地将临时变量存储到局部槽中,也就是 "registers" 以便与代码完全匹配。但是您可以通过重新排列事物来简化代码以避免如下所示的临时对象

; assume i, j, a, and v are in slots 0-3 respectively
L3: 
iinc 0 1
aload_2
iload_0
bipush 8
imul
iaload
iload_3
if_lt L3
iinc 1 -1