编译原理笔记1
编译原理笔记1
IR (Intermediate Representation)
简而言之,编译器任何完整的中间输出都是 中间代码表示形式 常见类型有: * 后缀表示 * 语法树或DAG图 * 三地址码(TAC) * LLVM IR是TAC类型 * 静态单赋值形式(SSA)
计算顺序 | 结果存放 | 可移动性 | 临时变量 | |
---|---|---|---|---|
四元式 | 按照编号顺序计算 | 结果存放在result | 方便移动,计算顺序容易调整 | 大量引入临时变量 |
三元式 | 按照编号顺序计算 | 结果由编号代表 | 不方便移动 | 在代码生成时,进行临时变量分配 |
间接三元式 | 按照指令列表的顺序计算 | 结果由编号代表 | 方便移动,计算顺序容易调整 | 在代码生成时,进行临时变量分配 |
SSA: 和三地址代码的主要区别: * 所有赋值指令都是对不同名字的变量的赋值 * 同一个变量在不同的控制流上面都被确定值 改为: 1
2if(flag) x=-1;else x=1;
y=x*a1
2
3if(flag) x1=-1; else x2=1;
x3= phi(x1,x2)
y=x3*a