编译原理第十二单元.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
编译原理第十二单元

第12章 代码生成 本章将介绍以具体计算机指令作为目标代码的代码生成器的设计,以一个计算机模型为例介绍一个简单的代码生成器需要考虑的问题,在代码生成时要考虑充分利用寄存器,以减少对内存的存取次数以提高目标程序运行速度。 为此,本章将给出寄存器分配的原则,并使用待用信息链表法的代码生成算法,最后给出中间语言的选择需要考虑的问题。 主要内容 代码生成概述 一个简单的代码生成器 几种常用的的代码生成程序的开发方法 全局存储器分配 代码生成程序的自动构造 12.1代码生成概述 代码生成是把某种高级程序设计语言经过语法语义分析或优化后的中间代码作为输入,将其转换成特定机器的机器语言或汇编语言作为输出,这样的转换程序称为代码生成器,因此,代码生成器的构造与输入的中间代码形式和输出的目标代码的机器结构密切相关。特别是高级程序设计语言和计算机硬件结构的多种多样性为代码生成的理论研究和实现技术带来很大的复杂性。 一、代码生成程序的基本问题  由于一个高级程序设计语言的目标代码需反复使用,因而,代码生成器的设计要着重考虑目标代码的质量问题。衡量目标代码的质量主要从占用空间和执行效率两个方面综合考虑。到底产生什么样的目标代码取决于具体的机器结构、指令格式、字长及寄存器的个数和种类,并与指令的语义和所用操作系统、存储管理等都密切相关。又由于目标代码的执行效率在很大程度上依赖于寄存器的使用,所以本节将着重介绍目标代码生成的一些共同问题,如寄存器的分配算法,而不讨论某个特定机器的目标代码生成问题。对寄存器分配的算法仅限定在一个基本块的范围内,以四元式的中间代码作为输入,以一个称作M的模型机的汇编语言作为输出。 _tmp0 = 56 ; _tmp1 = _tmp0 – b ; a = _tmp1 ; 二、寄存器分配的原则 ① 当生成某变量的目标代码时,尽量让变量的值或计算结果保留在寄存器中 直到寄存器不够分配时为止,这样引用变量值时可减少对内存的存取次数,以提高运行速度。 ② 当到基本块出口时,将变量的值存放在内存中,因为一个基本块可能有多个后继结点或多个前驱结点,同一个变量名在不同前驱结点的基本块内出口前存放的R可能不同,或没有定值,所以应在出口前把寄存器的内容放在内存中,这样从基本块外入口的变量值都在内存中。 ③ 对于在一个基本块内后边不再被引用的变量所占用的寄存器应尽早释放,以提高寄存器的利用效率。 12.2 一个简单的代码生成程序 一、计算机模型 二、指令说明 三、待用信息链表法 在一个基本块中,变量A在四元式i中被定值,在i后面的四元式j中要引用A值,且从i到j之间没有其它对A的定值点,这时我们称j是四元式i中对变量A的待用信息或称下次引用信息,同时也称A是活跃的,若A被多处引用则可构成待用信息链与活跃信息链。 考虑到处理的方便,可假定对基本块中的变量在出口处都是活跃的,而对基本块内的临时变量可分为两种情况处理。   a) 对于没经过数据流分析且中间代码生成的算法中临时变量不允许在基本块外引用,则临时变量在基本块出口处都认为是不活跃的。   b) 如果中间代码生成时的算法允许某些临时变量在基本块外引用时,则假定这些临时变量也是活跃的。 四、待用信息的计算方法 ① 对各基本块的符号表中的“待用信息”栏和“活跃信息”栏置初值,即把“待用信息”栏置“非待用”,对“活跃信息”栏按在基本块出口处是否为活跃而置成“活跃”或“非活跃”。 现假定变量都是活跃的,临时变量都是非活跃的。 ② 从基本块出口到基本块入口由后向前依次处理每个四元式。对每个四元式i:A:=B op C,依次执行下述步骤: a) 把符号表中变量A的待用信息和活跃信息附加到四元式i上。 b) 把符号表中变量A的待用信息栏和活跃信息栏分别置为 “非待用” 和 “非 活跃”。 由于在i中对A的定值只能在i以后的四元式才能引用,因而对i以前的四元式来说A是不活跃也不可能是待用的。 c) 把符号表中B和C的待用信息和活跃信息附加到四元式i上。 d) 把符号表中B和C的待用信息栏置为“i”,活跃信息栏置为“活跃”。 注意,以上a)和b),c)和d)的次序不能颠倒。 示例 例 若用A,B,C,D表示变量,用T,U,V表示中间变量,有四元式如下:   (1) T∶=A-B   (2) U∶=A-C   (3) V∶=T+U   (4) D∶=V+U   其名字表中

文档评论(0)

panguoxiang + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档