网站大量收购闲置独家精品文档,联系QQ:2885784924

编译方法、技术与实践 课件 第四章 中间代码生成(二).pdf

编译方法、技术与实践 课件 第四章 中间代码生成(二).pdf

  1. 1、本文档共88页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

第四章中间代码生成(二)

运行时刻环境

◼中间表示

◼类型与声明

◼表达式的翻译

◼控制流与回填

编译器前端的逻辑结构

◼静态类型检查和中间代码生成的过程都可

以用语法制导的翻译来描述和实现

◼对于抽象语法树这种中间表示的生成,第

五章已经介绍过

三地址代码(1)

◼每条指令右侧最多有一个运算符

一般情况可以写成x=yopz

◼允许的运算分量

名字:源程序中的名字作为三地址代码的地址

常量:源程序中出现或生成的常量

编译器生成的临时变量

三地址代码(2)

◼指令集合(1)

运算/赋值指令:x=yopzx=opy

复制指令:x=y

无条件转移指令:gotoL

条件转移指令:ifxgotoLifFalsex

gotoL

条件转移指令:ifxrelopygotoL

三地址代码(3)

◼指令集合(2)

过程调用/返回

◼paramx1//设置参数

◼paramx2

◼…

◼paramxn

◼callp,n//调用子过程p,n为参数个数

带下标的复制指令:x=y[i]x[i]=y

◼注意:i表示离开数组位置第i个字节,而不是数组的

第i个元素

地址/指针赋值指令:

◼x=yx=*y*x=y

三地址代码实例

◼语句

doi=i+1;while(a[i]v);

三地址指令的四元式表示方法

◼在实现时,可以使用四元式/三元式/间接三元式来

表示三地址指令

◼四元式:可以实现为纪录(或结构)

◼格式(字段):oparg1arg2result

op:运算符的内部编码

arg1,arg2,result是地址

x=y+z+yzx

◼单目运算符不使用arg2

◼param运算不使用arg2和result

◼条件转移/非条件转移将目标标号放在result字段

四元式的例子

◼赋值语句:a=b*-c+b*-c

三元式表示

◼三元式(triple)oparg1arg2

◼使用三元式的位置来引用三元式的运算结果

◼x[i]=y需要拆分为两个三元式

求x[i]的地址,然后再赋值

◼x=yopz需要拆分为(这里?是编号)

(?)opyz

=x?

◼问题:在优化时经常需要移动/删除/添加三

元式,导致三元式的移动

三元式的例子

间接三元式

◼包含了一个指向三元式的指针的列表

◼我们可以对这个列表进行操作,完成优化

功能;操作时不需要修改三元式中的参数

静态单赋值(SSA)

◼SSA中的所有赋值都是针对不同名的变量

◼对于同一个变量在不同路径中定值的情况,

可以使用φ函数来合并不同的定值

if(flag)x=-1;elsex=1;y=x*a

if(flag)x=-1;elsex=1;

您可能关注的文档

文档评论(0)

balala11 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档