《编译原理实践及应用》PPT教学课件-第8章 代码生成.ppt

《编译原理实践及应用》PPT教学课件-第8章 代码生成.ppt

  1. 1、本文档共47页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第八章 代码生成 本章要求 主要内容:目标代码生成的任务,设计目标代码生成器需要考虑的主要问题,简单的代码生成器,Sample语言目标代码生成器的设计 重点掌握:代码生成要考虑的主要问题,寄存器的分配,基本块的代码生成,以及从DAG生成代码 代码生成器的作用 各种代码的形式 中间代码: 后缀式,三地址代码,四元式 符号表中的项:名字,类型,嵌套深度,偏移量 目标代码:绝对机器代码,可重定位代码,汇编 代码生成器的输出必须是正确和高质量的 产生最优化代码的问题是不可判定的 8.2 代码生成器设计中的问题 代码生成器依赖于目标机器和操作系统 要充分发挥目标机器的能力:充分利用目标机器的资源 代码生成器固有的问题 存储管理 指令选择 寄存器分配 计算次序选择 可移植的代码生成器 机器描述 代码生成器的输入 符号表信息 决定中间代码中名字所代表的数据对象的运行地址 偏移量 作用域 可能在动态时刻作为调试信息存在 中间代码 代码生成的很多技术是可以用于不同的中间代码 代码生成前,中间代码记录了足够详细的程序信息 名字的值可以表示为目标机器能够直接操作的数 类型检查已经完成 明显的语义错误已经发现 代码生成器的输出:目标程序 绝对机器语言 可以放在内存中固定地方,并立即执行 小程序、需要迅速编译和执行 可重定位的机器语言 程序可以分为多个目标模块,分别编译 需要连接装配器将一组可重定位模块一起装入执行 需要额外的开销,但灵活:可分别编译子程序和从目标模块中调用其它先前编译好的程序模块 如果目标机器不能自动处理重定位,则编译器必须提供显式的重定位信息给装配程序 汇编语言 代码生成的过程容易 避免了重复汇编器的工作 存储管理 把程序中的名字映射到运行时的目标对象的地址是由前端和代码生成器共同完成的 语言中过程的语义决定了运行时刻名字如何与存储空间相联系 对名字的引用通过符号表 记录了名字在过程数据区的相对地址 所需要的存储空间 运行时活动记录的管理 运行时活动记录的分配和释放作为过程调用和返回序列的一部分 call(调用),return(返回) halt(暂停),其它语句 存储管理分静态、栈式和堆式存储分配 一个代码生成器的输入 其中,arr,i,j是过程s中定义的数据;buf和n是过程p定义的数据 指令地址的决定 通过一个计数器决定每个指令的地址 标号的处理:j: goto i /*j是当前语句的号码*/ 如果i小于j i出现在j之前,目标地址是i对应的三地址代码的第一条指令地址 如果i大于j i出现在j之后,目标地址此时不可知,可以利用回填的技术解决 指令选择 目标机器指令系统的性质决定了指令选择的难易程度 指令系统的一致性和完整性是重要因素 如果目标机器不能以一致的方式支持各种数据类型,则每种例外都要专门的处理 指令的速度和机器的特点是另一些重要的因素 如果不考虑目标程序的效率,则指令选择是直截了当的 代码的质量取决于它的执行速度和长度 可以从多种指令中选择合适的:a=a+1 MOV a , R0 ADD #1 , R0 INC a MOV R0 , a 时间信息对代码序列是重要的,但不是任何时候都精确的 指令选择的例子 逐条语句地产生代码的方法常常产生低质量的代码 寄存器分配 利用寄存器放置运算对象的指令比运算对象在内存中的指令短些 执行也快些 充分利用寄存器对高质量的代码生成是重要的 寄存器分配(续) 寄存器使用的两个子问题 寄存器分配:为程序的某一点选择驻留在寄存器中的一组变量 寄存器指派:挑出变量将要驻留的具体寄存器 寄存器分配的最优化是NP完全的 特定要求的满足 计算次序选择 计算执行的次序会影响目标代码的效率 选择最佳次序是一个NP完全问题 MOV R1 , A MOV R1 , A ADD R1 , R0 MUL R2 , R3 MUL R2 , R3 ADD R1 , R0 ADD R1 , R2 ADD R1 , R2 代码生成的途径 代码生成器的目的 正确的代码:最重要的目标 易于实现、调试和维护 代码生成需要多方面的信息 流信息 依赖信息 … … 代码生成的可移植性也是要考虑的一个问题 将机器相关部分和不相关部分区分开 8.3 目标机器 熟悉目标机器和它的指令系统 是设计一个好的代码生成器的先决条件 但不存在通用的有效的机器描述 目标机器 字节可寻址机器,4字节为一个字 有n个通用寄存器R0 , R1 , … , R(n-1) 指令形式: 目标机器的地址方式 指令代价 如果把指令代价取成1,加上上述的地址模式的附加代价,就是对应指令的长度(以字计算) 寄存器地址模式的代价为0 含内存单元和常量的地址模式的代价是1,因为这种运算对象必须和指令存在一起 如果空间至关重要,则应使指令

文档评论(0)

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

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

1亿VIP精品文档

相关文档