三地址码(示例)
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的一些偏好:
- 没有隐含的失败;所有 basic blocks 都以标签开头,并以
goto
或 if
(或 return
,未显示)结尾。
- 在分支点,
if
指令包含 true 和 false 目标,无需后续 goto
。在指令选择器上也更好。
我如何描述合适的代码来实现:
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的一些偏好:
- 没有隐含的失败;所有 basic blocks 都以标签开头,并以
goto
或if
(或return
,未显示)结尾。 - 在分支点,
if
指令包含 true 和 false 目标,无需后续goto
。在指令选择器上也更好。