龙书流控语句生成中间码的困惑

问题描述 投票:0回答:1

龙书(Compilers: Principles, Techniques, and Tools 2nd Edition)第6.6.3节介绍了如何将

if
/
if-else
/
while
等控制流语句翻译成中间代码

例如,

if (B) S1
的翻译由
B.code
后跟
S1.code
组成。
B.code
内是基于
B
值的跳跃。如果
B
为真,控制流向
S1.code
的第一条指令,如果
B
为假,控制流向紧跟在
S1.code
之后的指令。

B.code
S.code
中跳跃的标签是使用继承来管理的 属性。 使用布尔表达式
B
,我们关联两个标签:
B.true
,如果
B
为真,控制流向的标签;以及
B.false
,如果
B
为假
,控制流向的标签。对于语句
S
,我们将继承属性
S.next
关联到紧跟在
S
代码之后的指令标签。

我理解翻译。它让

B
根据
goto
的值生成
B
跳跃。由于
B
本身不知道跳到哪里。因此,我们将它与节点
B.true
.
提供的两个继承属性
B.false
S

相关联

我想知道这个翻译是否不必要地复杂?为什么不

S
根据
branch
的值生成
B
指令
。类似地,继承属性
S.next
是否必要?

compiler-construction control-flow codegen
1个回答
0
投票

我在《Engineering a Compiler (2nd Edition)》一书7.4.1节找到答案:

传统上,已经为布尔值提出了两种表示形式:数字编码位置编码。前者为 true 和 false 分配特定的值,并使用目标机器的算术和逻辑运算来操纵它们。后一种方法将表达式的值编码为可执行代码中的位置。它使用比较和条件分支来评估表达式;不同的控制流路径代表评估的结果。每种方法都适用于某些示例,但不适用于其他示例。

龙书使用位置编码.

© www.soinside.com 2019 - 2024. All rights reserved.