【问题标题】:Three address code (example)三地址码(示例)
【发布时间】:2015-05-27 13:18:18
【问题描述】:

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

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

【问题讨论】:

    标签: compiler-construction compiler-optimization


    【解决方案1】:

    首先,请注意,没有三地址代码的“规范”。它通常用于指代具有一些共同属性的中间表示系列 - 最值得注意的是,缺少像 ((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 指令同时包含真目标和假目标,从而无需后续goto。指令选择器也更好。

    【讨论】:

    • 谢谢,非常感谢!
    • 如果这回答了您的问题,请将其标记为已接受。否则,现在是时候提出后续问题了。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 2011-09-15
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多