三个地址码(示例)

时间:2015-05-27 13:18:18

标签: compiler-construction compiler-optimization

如何描述要实施的合适代码:

Sum :=0;
for i from 1 to n do sum+= i endfor;

1 个答案:

答案 0 :(得分:2)

首先,请注意,没有"规范"对于三地址代码。它通常用于指代具有一些共同属性的一系列中间表示 - 最值得注意的是,缺少像((x + 5) * z - y)这样的复杂表达式。

关于这一点,以下是一个例子,说明它是如何构成我刚刚编写的三地址代码

  ; ... preceding code ...
  sum := 0
  i   := 1
  goto loop_header

loop_header:
  if i > n then loop_end else loop_body

loop_body:
  sum := sum + i
  i   := i + 1
  goto loop_header

loop_end:
  ; ... rest of function ...

外卖是:

  • 在三地址代码中,复杂表达式必须简化为一系列简单表达式,引入临时变量以根据需要保存中间结果。例如,我们可能将表达式x = ((x + 5) * z - y)翻译成:

     t0 := x + 5
     t1 := t0 * z
     x  := t1 - y
    

    请注意,您的示例仅包含简单表达式。

  • 循环被替换为标签之间的简单跳转。这使IR更接近最终将被转换为的机器代码。

代码格式反映了我个人对低级别IR的一些偏好:

  1. 没有隐含的堕落;所有basic blocks都以标签开头,以gotoif(或return(未显示)结尾。
  2. 在分支点,if指令包含true和false目标,无需后续goto。它在指令选择器上也更好。