静态单赋值形式( Static Single Assignment Form, SSA) ·和三地址代码的主要区别 所有赋值指令都是对不同名字的变量的赋值 地址代码 静态单赋值形式 p= a +b 1=a+b 9=p-C pqpp pqe 3 g=p+q q2=p3+q1 原有变量被分成多个“版本
静态单赋值形式(Static Single Assignment Form, SSA) • 和三地址代码的主要区别 • 所有赋值指令都是对不同名字的变量的赋值 三地址代码 静态单赋值形式 p = a +b p1 = a +b q = p − c q1 = p1 − c p = q d p2 = q1 d p = e − p p3 = e − p2 q = p + q q2 = p3 + q1 原有变量被分成多个“版本
静态单赋值形式( Static Single Assignment Form, SSA) ·和三地址代码的主要区别 所有赋值指令都是对不同名字的变量的赋值 好处:简化许多编译优化(死代码消除,常量传播,…) 三地址代码 静态单赋值形式 p=2 9=p q1=p2 第一条赋值语句是无用的, 但要做到达-定值分析才 能知道
静态单赋值形式(Static Single Assignment Form, SSA) • 和三地址代码的主要区别 • 所有赋值指令都是对不同名字的变量的赋值 好处:简化许多编译优化(死代码消除,常量传播,…) 三地址代码 静态单赋值形式 p = 1 p1 = 1 p = 2 p2 = 2 q = p q1 = p2 第一条赋值语句是无用的, 但要做 到达-定值分析才 能知道
静态单赋值形式( Static Single Assignment Form, SSA) ·和三地址代码的主要区别 所有赋值指令都是对不同名字的变量的赋值 个变量在不同路径上都定值的解决办法 if ( flag x=1; else x=1 y=xa 改成 if (flag )X,=-1; else x,= 1; 3=φ(x1,x2;/(由fag的值决定用x还是x2
静态单赋值形式(Static Single Assignment Form, SSA) • 和三地址代码的主要区别 • 所有赋值指令都是对不同名字的变量的赋值 • 一个变量在不同路径上都定值的解决办法 if (flag) x = −1; else x = 1; y = x a; 改成 if (flag) x1 = −1; else x2 = 1; x3 = (x1 , x2 ); //由flag的值决定用x1还是x2 y1 = x3 a;
本章内容 ·介绍几种常用的中间代码表示√ 抽象语法树(上一章已介绍) 有向无环图 三地址代码 ·用语法制导定义和翻译方案来说明源语言的各种 构造怎样被翻译成中间表示 声明(和类型) 表达式和赋值 类型检查和类型转换 控制流 过程
本章内容 • 介绍几种常用的中间代码表示 • 抽象语法树(上一章已介绍) • 有向无环图 • 三地址代码 • 用语法制导定义和翻译方案来说明源语言的各种 构造怎样被翻译成中间表示 • 声明(和类型) • 表达式和赋值 • 类型检查和类型转换 • 控制流 • 过程
类型和声明 类型的用处 类型检查:保证运算分量的类型和运算符的预期类型 致(本章后面介绍) 翻译时:根据一个名字的类型,编译器确定这个名字 在运行时刻需要多大的存储空间 在过程或类中声明的变量,要考虑其存储空间的 布局问题 实际存储空间是在运行时刻进行分配的(下一章介绍) 编译时刻,用相对地址(相对于数据区域开始位置的 偏移量)进行布局
类型和声明 • 类型的用处 • 类型检查:保证运算分量的类型和运算符的预期类型 一致(本章后面介绍) • 翻译时:根据一个名字的类型,编译器确定这个名字 在运行时刻需要多大的存储空间 • 在过程或类中声明的变量,要考虑其存储空间的 布局问题 • 实际存储空间是在运行时刻进行分配的(下一章介绍) • 编译时刻,用相对地址(相对于数据区域开始位置的 偏移量)进行布局