📜  Compiler中的三个地址码

📅  最后修改于: 2021-09-28 09:21:13             🧑  作者: Mango

先决条件 – 中级代码生成

三地址码是一种易于生成且易于转换为机器码的中间码。它最多使用三个地址和一个运算符来表示一个表达式,并将每条指令计算的值存储在临时变量中由编译器生成。编译器决定三个地址代码给出的操作顺序。

一般代表 –

a = b op c 

其中 a、b 或 c 表示操作数,如名称、常量或编译器生成的临时变量,op 表示运算符

Example-1:将表达式a * – (b + c) 转换为三个地址代码。

Example-2:为以下代码编写三个地址代码

for(i = 1; i<=10; i++)
 {
  a[i] = x * 5;                                       
 } 

三地址码的实现——
三个地址码有3种表示方式,即

  1. 四人房
  2. 三人组
  3. 间接三元组

1. 四倍——
它是由 4 个字段组成的结构,即 op、arg1、arg2 和 result。 op 表示运算符,arg1 和 arg2 表示两个操作数,result 用于存储表达式的结果。

优势 –

  • 易于重新排列代码以进行全局优化。
  • 可以使用符号表快速访问临时变量的值。

坏处 –

  • 包含大量临时文件。
  • 临时变量的创建增加了时间和空间的复杂性。

示例 –考虑表达式 a = b * – c + b * – c。
三地址代码为:

t1 = uminus c
t2 = b * t1
t3 = uminus c
t4 = b * t3 
t5 = t2 + t4
a = t5  

2. 三人组——
这种表示不使用额外的临时变量来表示单个操作,而是在需要对另一个三元组值的引用时,使用指向该三元组的指针。因此,它仅包含三个字段,即 op、arg1 和 arg2。

坏处 –

  • 临时代码是隐含的,很难重新排列代码。
  • 优化很困难,因为优化涉及移动中间代码。当一个三元组被移动时,任何其他引用它的三元组也必须更新。借助指针可以直接访问符号表条目。

示例 –考虑表达式 a = b * – c + b * – c

3. 间接三元组 –
这种表示使用指向所有对计算的引用的列表的指针,这些引用是单独进行并存储的。与四重表示相比,它的效用相似,但需要的空间比它少。临时文件是隐式的,更容易重新排列代码。

示例 –考虑表达式 a = b * – c + b * – c

问题 –写出以下表达式的四元组、三元组和间接三元组:(x + y) * (y + z) + (x + y + z)

说明——三个地址代码是:

t1 = x + y
t2 = y + z
t3 = t1 * t2
t4 = t1 + z
t5 = t3 + t4