编译原理与技术讲义-第10章.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文档。上传文档
查看更多
编译原理与技术 主要内容 代码生成器设计的基本问题 虚拟计算机模型 语法制导的目标代码生成 基本块和待用信息 一个简单代码生成器 代码生成技术小结 10.1 代码生成器设计的基本问题 代码生成在整个编译过程的位置 10.1 代码生成器设计的基本问题 目标程序 绝对机器代码,程序所有的内存地址,特别是程序的起始地址,在编译时都已经固定。这种代码的优点是装入机器后就可以立即执行,对于小程序可以快速编译和运行。 可重定位机器代码(可重定位目标模块),代码装入内存的起始地址可以任意改变。一组可重定位的若干目标模块,经过连接和装配后才可以运行。尽管这些工作增加了程序运行的代价,但是,可重定位机器代码的优点是灵活性。这种技术允许程序分模块编写,独立地编译成目标模块,并且从目标模块库中调用其它已经编译好的模块,便于程序开发。通常,可重定位机器代码中包含可重定位信息和连接信息。 如果目标代码是汇编语言程序,还需要汇编后才能运行。只要地址可以由偏移址及符号表中的其它信息计算得到,代码生成器就可以产生程序中名字的绝对地址或可重定位地址。这样生成代码的好处是不用生成二进制的机器代码,而是产生符号指令并用宏机制来帮助产生机器代码,使得代码生成过程变得容易。 为了可读性,本章采用汇编语言作为目标语言。 10.1 代码生成器设计的基本问题 指令选择 一个编译程序可以看成是一个转换系统,它把源程序转换成等价的目标代码,也就是说,对源语言种各种语言结构,依据语义确定相应的目标代码结构,即确定源语言于目标语言之间的对应关系,确保正确实现语义。显然,能否建立这样的关系直接影响到编译程序的质量。 目标机器指令系统的性质决定了指令选择的难以程度,指令系统的一致性和完备性直接影响到这种对应关系的建立。如果目标机器能一致地支持各种数据类型和寻址方式,不需特别处理例外,这种对应关系的建立就容易得多。 指令执行速度和机器特点对产生目标代码的质量也十分重要。显然,如果指令集合丰富的目标机器对于某种操作可提供集中处理的时候,应该选择效率高、执行速度快的一种。 10.1 代码生成器设计的基本问题 寄存器选择 计算机存储单元之间通常都是通过寄存器联系。寄存器可以保存计算的中间结果,而且运算对象在寄存器的指令一般都比运算对象在内存的指令要短且运算的快。因此,充分合理地利用寄存器对生成高质量的代码十分重要。对于寄存器的使用,应该考虑程序中的哪些变量驻留在寄存器中、驻留多长时间。进一步,哪个变量驻留在哪个寄存器。这些问题可以划分成两个子问题: 在寄存器分配期间,为程序的某一点选择驻留在寄存器中的一组变量; 在随后的寄存器指派阶段,选择变量要驻留的具体寄存器。 选择最优的寄存器指派方案极其困难,从数学以上讲,这是一个NP完全问题。如果考虑到目标机器的硬件、操作系统对寄存器使用的一些要求时,这个问题就变得更加复杂。 10.1 代码生成器设计的基本问题 计算顺序的选择 计算执行的顺序会影响目标代码的质量。改变运算的执行顺序可以减少需要用来保存中间结果的寄存器的个数,从而提高代码的效率。计算顺序最优选择也是一个非常困难的问题,一个NP完全问题。 本书不讨论求值顺序问题,简单地就按照源程序或中间代码生成的顺序生成目标代码。 10.2 虚拟计算机模型 作为目标代码生成阶段地址分配的依据 这个目标计算机模型具有n个通用寄存器R0,R1,…,Rn-1,它们既可以作为累加器,也可以作为变址器。 假设目标机器按字节编址,4个字接组成一个字。我们用op表示运算符,用字母M表示内存单元,用字母C表示常量,用星号*表示间址方式存取。这台机器指令的一般形式为 操作码 op 源数据域,目的数据域 的二地址指令,表示源数据域和目的据域经过op运算以后的结果存到目的数据域。 10.2 虚拟计算机模型 指令按照地址模式分为四类,见表10.1 10.2 虚拟计算机模型 当用作源或目的时,内存单元M和寄存器R都代表自身,例如,指令 MOV R1, M 采用直接地址寻址方式,将寄存器R1的内容存入内存单元M。 MOV 4(R1),M 采用变址寻址方式,把寄存器R1的偏移4的单元的内容存入内存单元M,即表中(4+R1))? M。 表中的间接变址寻址方式用前缀?表示。例如,指令 MOV ?4(R1),R2 把地址(4+(R1))中内容所指单元的内容装入寄存器R2中。 常数用前缀#表示,下面的指令采用立即数寻址方式,把常数10装入寄存器R1: MOV #10, R1 10.3 语法制导的目标代码生成 利用属性文法和语法制导技术,直接产生目标代码。基本原理和技术同第9章介绍的语法制导的中间代码翻译类似,只是产生的目标语言是机器指令。 本节只讨论如何用翻译模式把源程序语言的简单

文档评论(0)

一天一点 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档