我想将简单的三地址代码文件翻译成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是一个堆栈机器,而不是寄存器)。
答案 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