【发布时间】:2015-05-27 13:18:18
【问题描述】:
我如何描述合适的代码来实现:
Sum :=0;
for i from 1 to n do sum+= i endfor;
【问题讨论】:
标签: compiler-construction compiler-optimization
我如何描述合适的代码来实现:
Sum :=0;
for i from 1 to n do sum+= i endfor;
【问题讨论】:
标签: compiler-construction compiler-optimization
首先,请注意,没有三地址代码的“规范”。它通常用于指代具有一些共同属性的中间表示系列 - 最值得注意的是,缺少像 ((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 的一些偏好:
goto 或if(或return,未显示)结尾。if 指令同时包含真目标和假目标,从而无需后续goto。指令选择器也更好。【讨论】: