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



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

以这段代码为例,它由"龙书"中可用的编译器前端生成:

L1:L3:  i = i + 1
L5:     t1 = i * 8
        t2 = a [ t1 ]
        if t2 < v goto L3
L4:     j = j - 1

它在字节码中会是什么样子?我是否需要重建符号表才能进行翻译?如果有人能像 blackcompe 在这个答案中那样描述它,那将非常有帮助(我知道 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

如前所述,这是一个非常开放的问题。例如,上面的代码显式地将临时变量存储到本地插槽中,也称为"寄存器",以便与代码完全匹配。但是您可以通过重新排列内容来简化代码以避免临时性,如下所示

; 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

最新更新