【发布时间】:2013-09-09 06:42:48
【问题描述】:
我看到3地址指令和2地址指令都用作前端和后端之间的IR,因为它们非常相似,它们各自的优点和缺点是什么?
【问题讨论】:
标签: compiler-construction compiler-optimization
我看到3地址指令和2地址指令都用作前端和后端之间的IR,因为它们非常相似,它们各自的优点和缺点是什么?
【问题讨论】:
标签: compiler-construction compiler-optimization
三地址是一种显示SSA主要原则的形式,即中间体始终是不可变的。 (如果你总是为一个新的中间人分配一个新的虚拟寄存器)。
当然,基于机器的分配器也可以轻松转换并与其他形式一起使用。三地址代码只是对 SSA 进行建模和解释的一种易于概括的简单方法。
【讨论】:
我觉得2地址和3地址指令集是天壤之别。有很多因素可以决定使用哪个。
+--------------------------------------------------------- | C instruction | 2 address | 3 address | 4 address | +----------------+-----------+-------------+-------------+ | r = x; | mov r,x | mov r,x | mov r,x | +----------------+-----------+-------------+-------------+ | r = x + y; | mov r,x | add r,x,y | add r,x,y,0 | | | add r,y | | | +----------------+-----------+-------------+-------------+ | r = x + y + z; | mov r,x | add q,x,y | add r,x,y,z | | | add r,y | add r,q,z | | | | add r,z | | | +----------------+-----------+-------------+-------------+
易于优化。如前所述,具有 3 个以上地址计数的指令集允许 SSA 实现和分析,这大大简化了许多编译时优化。
易于翻译成目标代码。这取决于您将 IR 翻译成什么。将 4 个地址代码翻译成基于堆栈的语言会很麻烦。将 2 地址代码转换为通用 CISC 架构(如 x86 程序集)可能会导致代码效率非常低。
【讨论】: