龙书(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
是否必要?
我在《Engineering a Compiler (2nd Edition)》一书7.4.1节找到答案:
传统上,已经为布尔值提出了两种表示形式:数字编码和位置编码。前者为 true 和 false 分配特定的值,并使用目标机器的算术和逻辑运算来操纵它们。后一种方法将表达式的值编码为可执行代码中的位置。它使用比较和条件分支来评估表达式;不同的控制流路径代表评估的结果。每种方法都适用于某些示例,但不适用于其他示例。
龙书使用位置编码.