- 1、本文档共13页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第十二章 代码生成
课前索引
【课前思考】 在第2章PL/0语言编译程序的实现中,产生的目标代码是一种与机器无关的假想栈式计算机器汇编语言类PCODE,它的执行需要用具体机器配置的语言编写一个解释程序。本章将介绍的代码生成是把某种高级程序设计语言经过语法语义分析或优化后的中间代码作为输入,将其转换成特定机器的机器语言或汇编语言作为输出,这样的转换程序称为代码生成器,因此,代码生成器的构造与输入的中间代码形式和输出的目标代码的机器结构密切相关。本章将主要介绍生成具体机器汇编语言为目标代码时需要考虑的一些共同问题和中间语言的选择考虑。 建议学员考虑如何把PL/0语言编译程序的目标代码类PCODE翻译成你所熟悉的具体机器的汇编语言,作为学习代码生成的预习思考。 【学习目标】 本章将介绍以具体计算机指令作为目标代码的代码生成器的设计,以一个计算机模型为例介绍一个简单的代码生成器需要考虑的问题,在代码生成时要考虑充分利用寄存器,以减少对内存的存取次数以提高目标程序运行速度,为此,本章将给出寄存器分配的原则,并使用待用信息链表法的代码生成算法,最后给出中间语言的选择需要考虑的问题。 【学习指南】 由于代码生成的目标代码与具体计算机的结构有关, 如指令格式、字长及寄存器的个数和种类,并与指令的语义和所用操作系统等都密切相关,因此实现非常困难。通过本章学习,仅为学员初步了解一个高级程序设计语言编译程序目标代码生成需要考虑的问题和解决这些问题的基本原则和方法,为今后应用打下初步基础。 要想真正掌握代码生成技术的细节,最好的方法是实现一个代码生成器,建议学员学习本章后,用第2章PL/0语言的中间代码类PCODE为输入,选择一个自己熟悉的汇编语言为输出,编写一个代码生成器。 【难 重 点】 重点:衡量目标代码的质量主要从占用空间和执行效率两方面考虑,而寄存器的合理分配对解决这两方面的问题起着重要的作用,因此要求学员了解寄存器的分配原则很重要,一个要求执行效率高的编译器对寄存器的分配可能要进行优化。另外对中间语言的选择也很重要,希望有较强可移植性,就要求选择的中间语言能适用较多种类的高级语言和多种不同的具体计算机指令。 难点:原则好讲实践困难,对具体要求和现实环境需要具体分析综合考虑。 【知 识 点】
12.1 代码生成概述代码生成是把某种高级程序设计语言经过语法语义分析或优化后的中间代码作为输入,将其转换成特定机器的机器语言或汇编语言作为输出,这样的转换程序称为代码生成器,因此,代码生成器的构造与输入的中间代码形式和输出的目标代码的机器结构密切相关。特别是高级程序设计语言和计算机硬件结构的多种多样性为代码生成的理论研究和实现技术带来很大的复杂性。
由于一个高级程序设计语言的目标代码需反复使用,因而,代码生成器的设计要着重考虑目标代码的质量问题。衡量目标代码的质量主要从占用空间和执行效率两个方面综合考虑。到底产生什么样的目标代码取决于具体的机器结构、指令格式、字长及寄存器的个数和种类,并与指令的语义和所用操作系统、存储管理等都密切相关。又由于目标代码的执行效率在很大程度上依赖于寄存器的使用,所以本章将着重介绍目标代码生成的一些共同问题,如寄存器的分配算法,而不讨论某个特定机器的目标代码生成问题。对寄存器分配的算法仅限定在一个基本块的范围内,以四元式的中间代码作为输入,以一个称作M的模型机的汇编语言作为输出。
12.2 一个计算机模型假定一个M计算机具有n个通用寄存器为R0 ,R1,…,Rn-1。它们既可作为累加器又可作为变址器,如果用op表示运算符,用M表示内存单元,用变量名表示该变量所在的单元,C表示常量,*表示间址方式存取,指令形式可包含以下四种类型,见表12.1(a)。
表12.1(a) ? 类型
指令形式
意义(设op是二目运算符)
直接地址型寄存器型变址型间接型
op Ri,Mop Ri,Rjop Ri,c(Rj)op Ri,*Mop Ri,*Rjop Ri,*c(Rj)
(Ri)op(M)Ri(Ri)op(Rj)Ri(Ri)op((Rj)+c)Ri(Ri)op((M))Ri(Ri)op((Rj))Ri(Ri)op(((Rj)+c))Ri
如果op是一目运算符,则op Ri,M的意义为: op(M)Ri,其余类型可类推。 以上指令中的运算符(操作码)op包括一般计算机上常见的一些运算符。我们将某些指令的意义说明如表12.1(b)。
? 表12.1(b) ? 指令
意义
指令
意义
LD Ri,B.ST Ri,B.J XCMP A,B
把B单元的内容取到寄存器 Ri,即(B)Ri。把寄存器Ri的内容存到B单元,即(Ri)B。无条件转向
文档评论(0)