编译原理第十单元.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文档。上传文档
查看更多
编译原理第十单元

第十章 代码生成 代码生成概述 构造代码生成程序的几种方法 代码生成概述 代码生成阶段 构造代码生成程序要考虑的因素 一个简单的代码生成程序的构造 代码生成器(程序)的位置 代码生成   将经过语法分析或优化后的中间代码,转换成特定机器的目标代码。 代码生成器   完成代码生成这一过程的程序称为代码生成器,如图所示。 目标代码一般有三种形式: 能够立即执行的机器语言代码,所有地址均已定位 待装配的机器语言模块。当需要执行时,由连接装入程序把它们和某些运行程序连接起来,转换成能执行的机器语言代码 汇编语言代码。尚需经过汇编程序汇编,转换成可执行的机器语言代码                  返回  构造代码生成器所要考虑的主要问题 代码生成所要考虑的主要问题 如何使生成的目标代码较短 如何充分利用计算机的寄存器,减少目标代码中访问存储单元的次数                   返回    代码生成的主要成份 指令选择 寻找一个合适的目标机指令以实现给定的中间表示 寄存器分配 确定在程序的哪个点将哪些值放在寄存器中比较有益 指令调度 确定程序指令的执行顺序 三者的关系    指令选择 如:中间代码 a:=a+1:   实现1:INC a  实现2:LD R0,a ADD R0, #1 ST R0,a 指令选择(续) 主要功能   多数CPU的指令集合具有冗余性,也即,同一计算可用两个或多个不同的指令序列完成。指令选择器选择其中之一以产生最好的代码。 指令选择的基本原则 减小产生代码的尺寸 减小目标代码的执行时间                           返回                    目标机器的地址方式 a:=b+c 1. MOV b, R0 ADD c, R0 cost=6 MOV R0, a 2. MOV b, a ADD c, a cost=6 假定R0, R1和R2中分别存放了a, b和c的地址, 采用: 3. MOV *R1, *R0 ADD *R2, *R0 cost=2 假定R1和R2中分别包含b和c的值, 并且b的值在这个赋值以后不再需要, 则还可有 4. ADD R2, R1 MOV R1, a cost=3 寄存器分配 通常情况下,指令在寄存器中访问操作数的开销要比在内存中访问小。且许多指令不能直接访问内存。如果操作数在内存中,需要显式地取入到寄存器中。由此可见,将经常使用的操作数保存在寄存器中是比较有利的。然而,寄存器是比较稀少的资源,计算机程序所需要的寄存器要比可用的寄存器多。寄存器分配负责确定在程序的哪个点将哪些值放在寄存器中比较有益。 寄存器分配(续) 寄存器的分配可以分成两个子问题: 在寄存器分配期间,为程序的某一点选择驻留在寄存器中的一组变量; 在随后的寄存器指派阶段,挑出变量将要驻留的具体寄存器。 寄存器分配原则 生成某变量的目标代码时,尽量让变量的值或计算结果保留在寄存器中直到寄存器不够分配为止。这样,访问变量值时可减少对内存的存取次数,以提高运行速度; 当到基本块出口时,将变量的值存放在内存中,因为一个基本块可能有多个后继结点或多个前驱结点,同一变量名在不同前驱结点的基本块内出口前存放的R可能不同,或没有定值,所以应在出口前把寄存器的内容放在内存中,这样从基本块外入口的变量值都在内存中; 在同一基本块内后边不再被引用的变量所占用的寄存器应尽早释放,以提高寄存器的利用率。 寄存器分配与寄存器赋值  寄存器分配 确定在程序的某个点将哪些值放在寄存器中 寄存器赋值 确定分配有寄存器的值应该在哪个寄存器中。由于一些目标机可能具有不同类型的寄存器,因此,对寄存器使用的一致性方面也存在着一定的约束。                   返回   指令调度 对具有流水线限制的体系结构,这个阶段是必须的。如:RISC体系结构一个通用的流水线限制为:从内存中取入寄存器中的值在随后的某几个周期中是不能用的。在这几个周期期间,调不依赖于该取入值的指令来执行是很重要的。 必须找一个指令(与被取值无关)在取指令之后立即执行,如果找不到相应的指令,这些周期就会被浪费。 指令调度(续) 不同在于指令顺序和寄存器的赋值                 返回  在代码生成过程中,这三者的关系非常密切。在进行寄存器分配和指令调度之时,假定指令选择已经完成; 若先进行调度,寄存器趋向于过度分配;若先进行寄存器分配,对于给定的寄存器分配,可供调度的指令可能太少,可能不包含任何好的调度。       

文档评论(0)

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

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

1亿VIP精品文档

相关文档