编译技术编译原理 (41).pdf
编译技术中 间 代 码 生 成编译器2词法分析器语法分析器语义分析器源程序中间代码生成器代码优化器代码生成器目标程序出错管理器符号表管理器前端后端前端:依赖于源语言,独立于目标机器。后端:依赖于目标机器,独立于源语言。中 间 代 码 生 成中间代码:介乎源语言与目标代码之间,比源语言简单,比目标代码复杂。区分编译器的前端与后端,方便提出针对新机器的编译器。可以设计针对中间代码的优化器。语法分析静态语义检查中间代码生成器中间代码记号流代码生成器中 间 代 码 生 成使用中间代码的优点 与机器无关,便于移植。便于进行独立于机器的代码优化。几种常用的中间表示 后缀表示 图形表示 三地址代码用语法制导定义和翻译方案的方法将源程序翻译成中间形式后 缀 表 示表达式E的后缀表示可以如下递归定义 如果E是变量或常数,那么E的后缀表示就是E本身。如果E 是形式为E1 opE2的表达式,那么E 的后缀表示是E1E2op,其中E1和E2分别是E1和E2的后缀表示。如果E是形式为(E1)的表达式,那么E1的后缀表示是E的后缀表示。后缀表示不需要括号后缀表示图形表示三地址代码E1 op E2uop EE1 E2 opE uopid numid num(E)E(8 4)+28 4 2+表达式E后缀式E 最大优点:便于计算机处理表达式(8 4)+2的后缀表示是8 4 2+运行时!注意区分运行与编译的区别。后 缀 表 示返回值和参数控制链访问链和机器状态局部数据临时数据返回值和参数局部数据临时数据 控制链访问链和机器状态top_spbase_sp栈8后缀表示图形表示三地址代码最大优点:便于计算机处理表达式(8 4)+2的后缀表示是8 4 2+后 缀 表 示返回值和参数控制链访问链和机器状态局部数据临时数据返回值和参数局部数据临时数据 控制链访问链和机器状态top_spbase_sp栈84后缀表示图形表示三地址代码最大优点:便于计算机处理表达式(8 4)+2的后缀表示是8 4 2+后 缀 表 示返回值和参数控制链访问链和机器状态局部数据临时数据返回值和参数局部数据临时数据 控制链访问链和机器状态top_spbase_sp栈84-即 8-4=4844后缀表示图形表示三地址代码最大优点:便于计算机处理表达式(8 4)+2的后缀表示是8 4 2+后 缀 表 示返回值和参数控制链访问链和机器状态局部数据临时数据返回值和参数局部数据临时数据 控制链访问链和机器状态top_spbase_sp栈42后缀表示图形表示三地址代码最大优点:便于计算机处理表达式(8 4)+2的后缀表示是8 4 2+后 缀 表 示返回值和参数控制链访问链和机器状态局部数据临时数据返回值和参数局部数据临时数据 控制链访问链和机器状态top_spbase_sp栈84-2+即 8-4+2=6426后缀表示图形表示三地址代码图 形 表 示语法树是一种图形化的中间表示有向无环图也是一种中间表示assigna+bcdcduminus(a)语法树assigna+bcduminus(b)daga:=(b+cd)+cd的图形表示后缀表示图形表示三地址代码图 形 表 示构造赋值语句语法树的语法制导定义修改构造结点的函数可生成有向无环图修改构造结点的函数可生成有向无环图后缀表示图形表示三地址代码产产 生生 式式语语 义义 规规 则则S id:=ES.nptr:=mknode(assign,mkleaf(id,id.entry),E.nptr)E E1+E2E.nptr:=mknode(+,E1.nptr,E2.nptr)E E1 E2E.nptr:=mknode(,E1.nptr,E2.nptr)E E1E.nptr:=mkunode(uminus,E1.nptr)E (E1)E.nptr:=E1.nptrE id E.nptr:=mkleaf(id,id.entry)一般形式:一般形式:x:=y op z表达式x+y z翻译成的三地址语句序列是t1:=y zt2:=x+t1临时变量还记得活动记录中局部变量下面的临时数据区吗?返回值和参数局部数据临时数据 控制链访问链和机器状态栈后缀表示图形表示三地址代码三 地 址 代 码三 地 址 代 码assigna+bcdcduminus(a)语法树assigna+bcduminus(b)dag三地址代码是语法树或三地址代码是语法树或dag的一种线性表示的一种线性表示a:=(b+c d)+c d语法树的代码语法树的代码dag的代码的代码t1:=bt1:=bt2:=c dt2:=c dt3:=t1+t2t3:=t1+t2t4:=c dt4:=t3+t2t5:=t3+t4a:=t4a:=t5后缀表示图形表示三地址代码三 地 址 代 码本书常用的三地址语句 赋值语句x:=y op z,x:=op y,x:=y 无条件转移goto L 条件转移if x relop y goto L 过程调用param x 和call p,n 过程返回 return y 索引赋值x:=yi和 xi:=y 地址和指针赋值x:=&y,x:=y和x:=y后缀表示图形表示三地址代码一种便于某些代码优化的中间表示静 态 单 赋 值 形 式和三地址代码的主要区别所有赋值指令都是对不同名字的变量的赋值三地址代码静态单赋值形式p=a+bp1=a+bq=p cq1=p1 cp=q dp2=q1 dp=e pp3=e p2q=p+q q2=p3+q1一种便于某些代码优化的中间表示静 态 单 赋 值 形 式和三地址代码的主要区别一个变量在不同路径上都定值的解决办法if(flag)x=1;else x=1;y=x*a;改成if(flag)x1=1;else x2=1;x3=(x1,x2);/由flag的值决定用x1还是x2编译技术中 间 代 码 生 成