编译原理-之-代码生成(VIP专享)课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《编译原理-之-代码生成(VIP专享)课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VIP专享 编译 原理 代码 生成 VIP 专享 课件
- 资源描述:
-
1、第十二章第十二章 代码生成代码生成 代码生成概述代码生成概述 简单代码生成程序简单代码生成程序一个假想的计算机模型一个假想的计算机模型简单的代码生成算法简单的代码生成算法 代码生成器的自动生成技术代码生成器的自动生成技术12.1 代码生成概述代码生成概述 将经过语法分析或优化后的中间代码,转换成特定目标机器的机器语言或汇编语言,这样的转换程序称为代码生成程序.目标代码与具体的计算机体系结构、指令格式、字长、寄存器的个数和种类等,并和指令的语义、操作系统、存储管理相关,增大了代码生成程序的复杂性.一个简单的代码生成程序的构造.目标代码的执行效率很大程度依赖寄存器的使用.12.1.1 代码生成器代
2、码生成器(程序程序)在编译系统中的位置在编译系统中的位置将经过语法分析或优化后的中间代码,转换成特定机器的目标代码.完成代码生成这一过程的程序称为代码生成器,如图所示.图12.1 代码生成器在编译系统中的位置代码生成器的输入代码生成器的输入中间代码符号表中的信息1.能够立即执行的机器语言代码,所有地址均已定位,通常位于固定的存储区域中,编译后可直接运行.2.待装配的机器语言模块。当需要执行时,由连接装入程序把它们和某些运行程序连接起来,转换成能执行的机器语言代码.3.汇编语言代码。尚需经过汇编程序汇编,转换成可执行的机器语言代码.返回目标代码一般有三种形式:目标代码一般有三种形式:12.1.2
3、 代码生成要考虑的基本问题代码生成要考虑的基本问题目标代码与具体的目标机结构、指令系统、操作系统有关.代码生成要考虑存储管理、寄存器分配等方面的问题.代码生成要使生成的目标代码较短 充分利用计算机的寄存器,减少目标代码中访问存储单元的次数.1.代码生成程序的输入 中间代码.线性表示法(后缀式)、三地址(四元式)等.符号表中的信息.代码生成根据符号表中的信息来决定中间代码中的名字所指示的数据对象的运行时地址.有时需要作类型检查.2.指令选择指令选择-寻找一个合适的目标机指令序列以实现给定的中间表示.如果目标机不能支持指令集的所有类型,那么对每一种例外要做特别处理.多数CPU的指令集合具有冗余性,
4、也即,同一计算可用两个或多个不同的指令序列完成。指令选择器选择其中之一以产生最好的代码.例:“加1”的两种代码生成方式 如:中间代码a:=a+1:实现1:INCa 实现2:LDR0,a ADD R0,#1 ST R0,a 减小产生代码的尺寸 减小目标代码的执行时间 降低目标代码的能耗指令选择的基本原则3.寄存器分配 通常情况下,指令在寄存器中访问操作数的开销要比在内存中访问小。许多指令不能直接访问内存。如果操作数在内存中,需要显式地取入到寄存器中。将经常使用的操作数保存在寄存器中是比较有利的。3.寄存器分配 寄存器是比较稀少的资源,计算机程序所需要的寄存器要比可用的寄存器多。寄存器分配负责确定
5、在程序的哪个点将哪些值放在寄存器中比较有益。寄存器分配可以分成分配和指派两个阶段来考虑 在寄存器分配期间,为程序的某一点选择驻留在寄存器中的一组变量;在随后的寄存器指派阶段,挑出变量将要驻留的具体寄存器。寄存器分配原则生成某变量的目标代码时,尽量让变量的值或计算结果保留在寄存器中直到寄存器不够分配为止。这样,访问变量值时可减少对内存的存取次数,以提高运行速度;在同一基本块内后边不再被引用的变量所占用的寄存器应尽早释放,以提高寄存器的利用率;寄存器分配原则 当到基本块出口时,将变量的值存放在内存中,因为一个基本块可能有多个后继结点或多个前驱结点,同一变量名在不同前驱结点的基本块内出口前存放的R可
6、能不同,或没有定值,所以应在出口前把寄存器的内容放在内存中,这样从基本块外入口的变量值都在内存中.寄存器分配与寄存器赋值寄存器分配与寄存器赋值 寄存器分配寄存器分配确定在程序的某个点将哪些值放在寄存器中 寄存器赋值寄存器赋值确定分配有寄存器的值应该在哪个寄存器中。由于一些目标机可能具有不同类型的寄存器,因此,对寄存器使用的一致性方面也存在着一定的约束。例如,a:bc Ri中存放了b的值,而Rj中存放了c的值,且b在此语句之后不再活跃。ADD Rj,Ri 其开销为1,结果在Ri中.b存放在Ri中,而c在一个存储单元里,并假定b不再活跃。ADD c,Ri其开销为2 或者 MOV c,Rj ADD
7、Rj,Ri 其开销为34.指令调度 指令调度确定程序指令的执行顺序 对具有流水线限制的体系结构,这个阶段是必须的。如:RISC体系结构一个通用的流水线限制为:从内存中取入寄存器中的值在随后的某几个周期中是不能用的。在这几个周期期间,调出不依赖于该取入值的指令来执行是很重要的。必须找一个指令(与被取值无关)在取指令之后立即执行,如果找不到相应的指令,这些周期就会被浪费。在代码生成过程中,这三者的关系非常密切。在进行寄存器分配和指令调度之时,假定指令选择已经完成;若先进行调度,寄存器趋向于过度分配;若先进行寄存器分配,对于给定的寄存器分配,可供调度的指令可能太少,可能不包含任何好的调度。选择最优的
8、寄存器分配是困难的,这是NP完全问题(多项式条件下不可求解)指令选择指令选择,寄存器分配寄存器分配,指令调度间的关系指令调度间的关系12.2 一个简单的代码生成器一个简单的代码生成器 介绍一个简单的代码生成程序 以四元式的中间代码作为输入,将其转换成给定的M计算机的目标代码 讨论一个基本块内如何充分利用寄存器以提高目标代码的效率 给出寄存器分配的一般算法12.2.1 一个假想的计算机模型一个假想的计算机模型 设计一个好的代码生成器,必须熟习目标机器和它的指令系统 假定一种计算机由n个通用寄存器R0,R1,Rn-1 R既可作累加器也可作变址器 op表示运算符,M表示内存单元 C表示常量,*表示间
9、址方式存取机器指令类型类型指令形式意义(op是二目运算符)直接地址型 op Ri,M(Ri)op(M)Ri寄存器型op Ri,Rj(Ri)op(Rj)Ri变址型op Ri,c(Rj)(Ri)op(Rj)+c)Ri间接型op Ri,*M(Ri)op(M)Riop Ri,*Rj(Ri)op(Rj)Riop Ri,*c(Rj)(Ri)op(Rj)+c)Ri某些指令意义说明 如果op是一目运算符,op Ri,M的意义为op(M)Ri,其余类型类推 以上指令中的运算符(操作码)op包括一般计算机上的一些运算符 某些指令的意义说明见下表某些指令意义说明指令意义LD Ri,B把B单元的内容取到寄存器RiST
10、 Ri,B把寄存器Ri的内容取到B单元J X无条件转向X单元CMP A,B把A,B单元的值进行比较,并根据比较情况把机器内部特征寄存器CT置成相应状态.CT占两个进位.根据AB分别置成0,1,2某些指令意义说明(续)指令意义JX如CT=2,转向X单元JX如CT=1或CT=2,转向X单元12.2.2 待用信息链表法待用信息链表法在一个基本块范围内考虑如何充分利用寄存器问题:在一个基本块范围内考虑如何充分利用寄存器问题:尽可能地让该变量的值保留在寄存器中尽可能地让该变量的值保留在寄存器中 尽可能引用变量在寄存器中的值尽可能引用变量在寄存器中的值 待用信息待用信息:若在一个基本块中,变量:若在一个基
11、本块中,变量 A在四元式在四元式i中被定中被定值,在值,在i后面的四元式后面的四元式j中要引用中要引用A值,且从值,且从i到到 j之间没有其之间没有其它对它对A的定值点,这时我们称的定值点,这时我们称 j是四元式是四元式i中对变量中对变量A的的待用待用信息信息或称或称下次引用信息下次引用信息,同时也称,同时也称A是是活跃活跃的,若的,若 A 被多次被多次引用则可构成引用则可构成待用信息链与活跃信息链待用信息链与活跃信息链。可从基本块的出口由后向前扫描,对每个变量建立可从基本块的出口由后向前扫描,对每个变量建立相应的待用相应的待用信息链和活跃变量信息链。信息链和活跃变量信息链。计算待用信息的算法
12、:计算待用信息的算法:对各基本块的符号表中的对各基本块的符号表中的“待用信息待用信息”栏和栏和“活跃信息活跃信息”栏置初值,即把栏置初值,即把“待用信息待用信息”栏置栏置“非待用非待用”,对,对“活跃活跃信息信息”栏按在基本块出口处是否为活跃而置成栏按在基本块出口处是否为活跃而置成“活跃活跃”或或“非活跃非活跃”。这里假定变量都是活跃的,临时变量都是非这里假定变量都是活跃的,临时变量都是非活跃的。活跃的。符号表中增加符号表中增加“待用信息待用信息”栏和栏和“活跃信息活跃信息”栏栏 从基本块出口到基本块入口由后向前依次处理每个四元从基本块出口到基本块入口由后向前依次处理每个四元式。对每个四元式式
13、。对每个四元式i:A:=B op C,依次执行下述步骤:,依次执行下述步骤:a)把符号表中变量把符号表中变量A的待用信息和活跃信息附加到四元式的待用信息和活跃信息附加到四元式i上。上。b)把符号表中变量把符号表中变量A的待用信息栏和活跃信息栏分别置为的待用信息栏和活跃信息栏分别置为“非待用非待用”和和“非活跃非活跃”。(由于在(由于在i 中对中对A的定值只能的定值只能在在 i以后的四元式才能引用,因而对以后的四元式才能引用,因而对 i以前的四元式来说以前的四元式来说A是不活跃也不可能是待用的)是不活跃也不可能是待用的)c)把符号表中变量把符号表中变量B和和 C的待用信息和活跃信息附加到四元的待
14、用信息和活跃信息附加到四元式式 i上。上。d)把符号表中变量把符号表中变量B和和 C的待用信息栏置为的待用信息栏置为“i”,活跃信,活跃信息栏置为息栏置为“活跃活跃”。注意,以上注意,以上a)和)和b),),c)和)和d)的次序不能颠倒。)的次序不能颠倒。如果中间代码出现如果中间代码出现A=op BA=op B或者或者A=BA=B形式形式,以上步骤相同以上步骤相同,只是其只是其中不涉及到中不涉及到C C例:例:若用若用A,B,C,D表示变量,用表示变量,用T,U,V表示中间变量,有四元式如下:表示中间变量,有四元式如下:1.T:=A-B2.U:=A-C3.V:=T+U4.D:=V+U其名字表中
15、的待用信息和活跃信息如下表,其名字表中的待用信息和活跃信息如下表,用用“F”表示表示“非待用非待用”“”“非活跃非活跃”,用,用“L”表示活跃。表示活跃。(1)(2)(3)(4)表示四元式序表示四元式序号。号。D :=V +U变变量量名名 待用信息待用信息 活跃信息活跃信息初值初值 待用信息链待用信息链初值初值 活跃信息链活跃信息链A BCD T U V 表中表中“待用信息链待用信息链”与与“活跃信活跃信息链息链”的每列从左至右为每从后的每列从左至右为每从后向前扫描一个四元式时相应变量向前扫描一个四元式时相应变量的信息变化情况,空白处为没变的信息变化情况,空白处为没变化化.FFFFFFFLLL
16、LFFFFLFFFFFF(4)(4)LLV :=T +U(4)LFFFF(4)L(3)(3)LLU :=A -C (3)LFFFLFLT :=A -B(3)LFF(2)LFL(2)(2)LL(1)(1)LL寄存器描述和地址描述寄存器描述和地址描述寄存器描述数组寄存器描述数组RVALUE:描述每个描述每个寄存器当前的状况寄存器当前的状况,当对基本块进行当对基本块进行代码生成时代码生成时,每个寄存器在任一给定每个寄存器在任一给定时刻将保留零个或多个名字的值时刻将保留零个或多个名字的值.变量地址描述数组变量地址描述数组AVALUE:表示变:表示变量的存放情况量的存放情况,地址描述器记录在运地址描述器
17、记录在运行时刻的一个名字的当前值存放的一行时刻的一个名字的当前值存放的一个位置或多个位置个位置或多个位置.12.2.3 代码生成算法代码生成算法RVALUERi=A表示的现行值是变量表示的现行值是变量A的值的值RVALUERi=A,C表示的现行值是变量表示的现行值是变量A,C的值的值RVALUERi=表示表示Ri未分配未分配AVALUEA=A表示表示A的值在内存中的值在内存中AVALUEA=Ri,A表示表示A的值在内存中又在的值在内存中又在Ri中中AVALUEA=Ri表示表示A的值在的值在Ri中中寄存器分配算法寄存器分配算法GETREG函数函数R=GETREG(i:A:=B op C)1.如果
18、如果B的现行值在某个的现行值在某个Ri中,且该中,且该寄存器只包含寄存器只包含B的值,或者的值,或者B和和A是是同一标识符,或同一标识符,或B在该四元式后不在该四元式后不会再被引用,则可选取会再被引用,则可选取Ri为所需的为所需的寄存器寄存器R,并转,并转(4).2.如果有尚未分配的寄存器,则从中如果有尚未分配的寄存器,则从中选择一个选择一个Ri作为所需的作为所需的R,并转,并转(4).3.从已分配的寄存器中选择一个从已分配的寄存器中选择一个Ri作作为所需寄存器为所需寄存器R,选取原则为:占,选取原则为:占用用Ri的变量同时也在主存中,或者的变量同时也在主存中,或者在基本块中最远的地方才会引用
展开阅读全文