0

我看到3地址指令和2地址指令都用作前端和后端之间的IR,因为它们非常相似,它们各自的优点和缺点是什么?

4

2 回答 2

1

三地址是一种显示 SSA 主要原则的形式,即中间始终是不可变的。(如果您总是为新的中间体分配一个新的虚拟寄存器)。

当然,基于机器的分配器也可以轻松转换和使用其他形式。三地址代码只是建模和解释 SSA 的一种简单易懂的方法。

于 2013-09-09T12:24:18.767 回答
1

我觉得 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 程序集)可能会导致代码效率非常低。

于 2013-09-09T18:17:08.507 回答