欢迎来到天天文库
浏览记录
ID:50337943
大小:283.50 KB
页数:84页
时间:2020-03-08
《编译原理——编译程序构造实践教程 教学课件 作者 张幸儿 戴新宇 602编译程序构造与实践教程第六章.ppt》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、6.4目标代码的生成对控制语句部分的翻译,将生成目标代码。目标代码生成部分一般称为代码生成程序。功能:生成目标代码。输入:源程序的中间表示。前提:无词法错误、无语法错误,且经历了语义分析(类型检查与若干静态语义检查)。输出:目标代码。6.4.1与目标代码生成相关的若干要点为了生成正确的目标代码,需关注下列方面:(1)目标机目标语言的确定(2)语言结构目标代码的确定(3)运行时刻存储管理(4)寄存器分配(5)求值顺序的选择(6)代码生成程序的设计1.目标机目标语言的确定可有下列选择:(1)目标机器代码形式又可以是绝对地址形式或目标模块结构形式。(2)汇编语言程序形式(3)虚拟机目标代码形
2、式为教学的目的,确定为:虚拟机目标代码形式2.语言结构目标代码的确定目标代码生成的关键:确定语言结构与目标代码之间的对应关系。例如,C语言赋值语句x=a+b*c;目标代码:对源语言中各类语言结构,依据语义确定相应的目标代码结构,通过确定源语言与目标语言之间的对应关系,保证正确实现语义。显然,能否建立这样的对应关系直接影响到编译程序的成败。选择虚拟机目标代码形式,将保证能成功。3.运行时刻存储管理当前的计算机都是冯.诺伊曼型的,其特征是变量—存储字,也就是用变量来访问存储字,变量名实际上是存储字的名字。为了存储分配的正确实现,除了考虑标识符的作用域问题外,还必须考虑字边界对齐问题,即对
3、于字节编址的计算机,必须注意对于不同类型的量所分配存储区域的起始编址都必须符合边界要求。为简单起见,不讨论字边界对齐问题4.寄存器分配寄存器用于存放中间结果,运算速度快,但个数有限。对于寄存器的使用,应该考虑在程序运行到某处时将有哪些变量占用哪些寄存器。要选择最优的寄存器分配方案是困难的,还可能因为目标机的硬件和/或操作系统可能要求寄存器的使用遵守一些约定而使问题进一步复杂化。合理、充分地使用寄存器,是编译实现中的一个重要方面,但为简单起见,不考虑寄存器使用的约定等。寄存器的个数对目标代码的生成有很大影响,但也往往假定有无限个。5.求值顺序的选择改变求值顺序,使得保存中间运算结果的寄存
4、器的个数较少。例如,C语言表达式(j++)*(j++)*(j++)的求值C语言函数调用中参数的计算顺序在不同的编译系统实现中,有不同的处理,因而有不同的结果值。将不讨论求值顺序问题。一般情况下,简单地就按源程序书写顺序或内部中间表示生成的顺序生成目标代码。6.代码生成程序的设计最重要的是产生正确的代码,此外,易于实现、测试和维护是代码生成程序的重要设计目标。6.4.2虚拟机假定按字节编址,1个指令占4个字节,有n个通用寄存器R0、R1、…、Rn-1。指令系统涉及:指令格式、寻址方式、操作码(种类)指令的格式:OP源,目标寻址方式形式地址附加代价绝对地址寄存器变址间接寄存器间接变址立即数
5、MRD(R)*R*D(R)#CMRD+contents(R)contents(R)contents(D+contents(R))常数C101121说明:1.因为1个指令占4个字节,同一指令中不可能同时包含2个存储地址。2.简单起见,这里附加代价指存取内存字的代价,存取一次代价为1指令形式:opR,MopM,RopR,RopR,*Rop*R,RopD(R),RopR,D(R)op#C,Mop#C,Rop*D(R),RopR,*D(R)当是控制转移指令时,可通过标号指明控制转移去处,也可用相对地址,例如,GO*+8表示把控制转向本指令的下面第2条指令。除了ADD与MOV等指令外,还将引进下
6、列指令:NEGT-contents(T)=>TSUBS,Tcontents(T)-contents(S)=>TMPYS,Tcontents(T)*contents(S)=>TDIVS,Tcontents(T)/contents(S)=>TCMPS,T比较contents(S)和contents(T)CJrelopT按关系运算relop为true转向TITOFS,T把整型的contents(S)转换成实型,然后将转换后的值传送给TGOTOT无条件转移控制到TRETURN返回CALLP,N以N个参数调用函数P赋值语句z=a*b+c*d,可有下列目标代码:MOVa,R0MPYb,R0MOVc
7、,R1MPYd,R1MOVR0,R2ADDR1,R2MOVR2,z请注意,与手工编写的区别。6.4.3控制语句的翻译1.赋值语句的翻译(1)赋值语句的语法定义形式V=E;(为简洁起见,省略其后的分号)(2)赋值语句的语义描述把右部表达式E的值赋给左部变量V,必要时,把右部表达式的值转换成左部变量的类型。(3)赋值语句的执行步骤1计算右部表达式E的值;步骤2必要时对E的值进行强制类型转换;步骤3计算左部变量V的地址;步骤4把(类型转换过的)E的值
此文档下载收益归作者所有