编译原理教程 第三版 教学课件 作者 胡元义 全书 第7章.ppt

编译原理教程 第三版 教学课件 作者 胡元义 全书 第7章.ppt

  1. 1、本文档共77页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
  代码生成是指把语法分析后或者优化后的中间代码 如四元式或三元式 变换成目标代码,所生成的目标代码一般有如下三种形式:    1 能够立即执行的机器语言代码,它们通常放在固定的存储区中并可直接执行,如PC机中后缀为?.COM或?.EXE的文件。    2 待装配的机器语言模块,其地址均为相对地址,所以不能直接执行。当需要执行时由连接装配程序把它们与其它运行程序和库函数连接起来,装配成可执行的机器语言代码,如PC机中后缀为?.OBJ的文件都属于待装配的模块 文件 。 3 汇编语言程序,必须通过汇编程序的汇编方可转换成可执行的机器语言代码,如PC机中后缀为?.ASM的文件即为汇编语言程序。   一个高级语言程序的目标代码要经常、反复使用,因此代码生成要着重考虑两个问题:一是如何使生成的目标代码较短,二是如何充分利用计算机的寄存器以减少目标代码中访问存储单元的次数。生成的目标代码越短,寄存器的利用越充分,目标代码的质量也就越高。   设计一个代码生成器需要考虑具体的机器结构、指令格式、字长及寄存器个数和种类,并且与指令的语义和所用的操作系统、存储管理等都密切相关。 我们首先介绍一个简单的代码生成器,此生成器依次把每条中间代码变换成目标代码,并且在一个基本块范围内考虑如何充分利用寄存器的问题。一方面,在基本块中,当生成计算某变量值的目标代码时,尽可能地让该变量的值保留在寄存器中 即不编出把该变量的值存到内存单元的指令 ,直到该寄存器必须用来存放其它变量的值或已达基本块出口为止;另一方面,后续的目标代码尽可能地引用变量在寄存器中的值而不访问内存。   例如,一C语言语句为A B+C *D+E,把它翻译为四元式G: T1? ?B?+?C T2? ?T1*D A? ?T2?+?E   如果不考虑代码的效率,可以简单地把每条中间代码 四元式 映射成若干条目标指令,如将x? ?y?+?z映射为    MOV AX, y /*AX为寄存器*/    ADD AX, z    MOV x, AX   其中,x、y、z均为数据区的内存变量。   这样,上述四元式代码序列G就可翻译为    1 ?MOV AX, B 2 ?ADD AX, C    3 ?MOV T1, AX    4 ?MOV AX, T1 5 ?MUL AX, D    6 ?MOV T2, AX    7 ?MOV AX, T2    8 ?ADD AX, E 9 ?MOV A, AX   虽然从正确性来看,这种翻译不存在问题,但它却存在冗余。在上述指令序列中, 4 和 7 两条指令是多余的;而T1、T2均是中间代码生成时产生的临时变量,它们在出了基本块后将不再使用,故 3 、 6 两条指令也可删去。因此,在考虑了效率和充分使用寄存器之后,应生成如下代码:    1 ?MOV AX, B 2 ?ADD AX, C    3 ?MUL AX, D    4 ?ADD AX, E 5 ?MOV A, AX   为了实现这一目的,代码生成器就必须了解一些信息:在产生T2? ?T1*D对应的目标代码时,为了省去指令MOV AX,T1,就必须知道T1的当前值已在寄存器AX中;为了省去MOV T1, AX,就必须知道出了基本块后T1不再被引用。 7.1.1 待用信息与活跃信息   在一个基本块内的目标代码中,为了提高寄存器的使用效率,应将基本块内还要被引用的值尽可能地保留在寄存器中,而将基本块内不再被引用的变量所占用的寄存器尽早释放。每当翻译一条四元式如A? ?B op C时,需要知道在基本块中还有哪些四元式要对变量A、B、C进行引用,为此,需要收集一些待用信息。在一个基本块中,四元式i对变量A定值,如果i后面的四元式j要引用A且从i到j的四元式没有其它对A的定值点,则称j是四元式i中对变量A的待用信息,同时也称A是活跃的。如果A被多处引用,则构成了A的待用信息链与活跃信息链。   为了取得每个变量在基本块内的待用信息和活跃信息,可从基本块的出口由后向前扫描,对每个变量建立相应的待用信息链与活跃信息链。如果没有进行数据流分析并且临时变量不允许跨基本块引用,则把基本块中的临时变量均看作基本块出口之后的非活跃变量,而把所有的非临时变量均看作基本块出口之后的活跃变量。如果某些临时变量能够跨基本块使用,则把这些临时变量也看成基本块出口之后的活跃变量。   假设变量的符号表内有待用信息和活跃信息栏,则计算变量待用信息的算法如下:    1 首先将基本块中各变量的符号表的待用信息栏置为“非待用”,对活跃信息栏则根据该变量在基本块出口之后是否活跃而将该栏中的信息置为“活跃”或“非活跃”。    2 从基本块出口到基本块入口由后向前依次处理各四元式。对每个四元式i

您可能关注的文档

文档评论(0)

118压缩包课件库 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档