如何将三个地址代码(TAC)翻译成Java字节码?

时间:2017-11-10 04:18:41

标签: java compiler-construction bytecode

我想将简单的三地址代码文件翻译成Java字节码。已经有一些与此主题相关的问题,但要么没有回答properly,要么question超出我想要的范围。

以这段代码为例,使用编译器前端生成的" Dragon Book":

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

字节码中的外观如何?我是否需要重建符号表才能进行翻译?如果有人可以像在这个answer中的blackcompe那样描述它,那将是非常有用的(我知道JVM是一个堆栈机器,而不是寄存器)。

1 个答案:

答案 0 :(得分:2)

这是我如何用字节码编写代码。但这只是一种方法,问题是开放性的。我假设所有变量都是整数,除了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

如上所述,这是一个相当开放的问题。例如,上面的代码将临时变量显式地存储到本地插槽中,即#34;寄存器&#34;为了完全匹配代码。但是你可以通过重新安排事情来简化代码,以避免临时性,如下所示

; 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