Compiler construction 三地址代码(示例)

Compiler construction 三地址代码(示例),compiler-construction,compiler-optimization,Compiler Construction,Compiler Optimization,我如何描述合适的代码来实现: Sum :=0; for i from 1 to n do sum+= i endfor; 首先,请注意,没有三地址代码的“规范”。它通常用于指代一系列具有一些共同属性的中间表示,最显著的是缺少复杂表达式,如((x+5)*z-y) 有了这些,这里有一个例子,展示了我刚刚编造的三个地址代码的形式 外卖是: 在三地址代码中,复杂表达式必须简化为一系列简单表达式,根据需要引入临时变量来保存中间结果。例如,我们可以将表达式x=((x+5)*z-y)转换为: t0 :=

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

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

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

有了这些,这里有一个例子,展示了我刚刚编造的三个地址代码的形式

外卖是:

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

     t0 := x + 5
     t1 := t0 * z
     x  := t1 - y
    
    请注意,您的示例仅包含简单表达式

  • 循环将替换为标签之间的简单跳转。这使IR更接近最终将被翻译成的机器代码
代码的格式反映了我个人对低级IR的一些偏好:

  • 没有隐含的失败;所有标签均以标签开头,并以
    转到
    如果
    (或
    返回
    ,未显示)结尾
  • 在分支点,
    if
    指令同时包含真目标和假目标,从而无需执行以下
    goto
    。在指令选择器上也更好

  • 谢谢,非常感谢!如果这回答了您的问题,请将其标记为已接受。否则,现在是提出后续问题的时候了。:-)
     t0 := x + 5
     t1 := t0 * z
     x  := t1 - y