三地址码(示例)

Three address code (example)

我如何描述合适的代码来实现:

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

首先请注意,三地址代码不存在 "specification" 这样的东西。它通常用于指代具有一些共同属性的中间表示系列——最值得注意的是,缺少像 ((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。在指令选择器上也更好。