Compiler construction 3地址指令与2地址指令的比较

Compiler construction 3地址指令与2地址指令的比较,compiler-construction,compiler-optimization,Compiler Construction,Compiler Optimization,我看到3地址指令和2地址指令都被用作前端和后端之间的IR,它们的优点和缺点是什么,因为它们如此相似?三地址是一种形式,显示了SSA的主要原理,即中间始终是不可变的。(如果您总是为新的中间层分配新的虚拟寄存器) 当然,基于机器的分配器也可以轻松地转换和使用其他形式。三地址代码只是一种可概述且简单的建模和解释SSA的方法。我觉得2地址指令集和3地址指令集大不相同。在决定使用哪一种时,有很多因素可以发挥作用 代码复杂度与代码大小。操作数少意味着每条指令更容易表示和实现。更多的操作数意味着单个指令可以

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

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


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

我觉得2地址指令集和3地址指令集大不相同。在决定使用哪一种时,有很多因素可以发挥作用

  • 代码复杂度与代码大小。操作数少意味着每条指令更容易表示和实现。更多的操作数意味着单个指令可以表示更多的功能。以下面的比较为例:
  • 易于优化。如前所述,具有3+地址计数的指令集允许SSA实现和分析,这大大简化了许多编译时优化

  • 易于翻译为目标代码。这取决于您将IR转换为什么。将4地址代码转换为基于堆栈的语言将是一件麻烦事。将2地址代码转换为通用CISC体系结构(如x86汇编)可能会导致非常低效的代码

+---------------------------------------------------------
| 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   |             |             |
+----------------+-----------+-------------+-------------+