编译原理笔记1

编译原理笔记1

IR (Intermediate Representation)

简而言之,编译器任何完整的中间输出都是 中间代码表示形式 常见类型有: * 后缀表示 * 语法树或DAG图 * 三地址码(TAC) * LLVM IR是TAC类型 * 静态单赋值形式(SSA)

计算顺序 结果存放 可移动性 临时变量
四元式 按照编号顺序计算 结果存放在result 方便移动,计算顺序容易调整 大量引入临时变量
三元式 按照编号顺序计算 结果由编号代表 不方便移动 在代码生成时,进行临时变量分配
间接三元式 按照指令列表的顺序计算 结果由编号代表 方便移动,计算顺序容易调整 在代码生成时,进行临时变量分配

SSA: 和三地址代码的主要区别: * 所有赋值指令都是对不同名字的变量的赋值 * 同一个变量在不同的控制流上面都被确定值

1
2
if(flag) x=-1;else x=1;
y=x*a
改为:
1
2
3
if(flag) x1=-1; else x2=1;
x3= phi(x1,x2)
y=x3*a

基本块