先决条件–中级代码生成
三地址代码是一种易于生成且可以轻松转换为机器代码的中间代码类型,它最多使用三个地址和一个运算符来表示一个表达式,并将每条指令计算出的值存储在临时变量中由编译器生成。编译器决定由三个地址代码给定的操作顺序。
一般代表–
a = b op c
其中a,b或c代表名称,常量或编译器生成的临时值之类的操作数,而op代表运算符
示例1:将表达式a * –(b + c)转换为三个地址代码。
示例2:为以下代码编写三个地址代码
for(i = 1; i<=10; i++)
{
a[i] = x * 5;
}
实施三个地址代码–
三个地址代码有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