代码生成哈工大王宏志.ppt
《代码生成哈工大王宏志.ppt》由会员分享,可在线阅读,更多相关《代码生成哈工大王宏志.ppt(58页珍藏版)》请在三一办公上搜索。
1、第9章 代码生成,School of Software Harbin Institute of Technology,重点:代码生成器设计中的问题,目标语言,一个简单的代码生成器,寄存器的分配和指派难点:寄存器的分配和指派,2023/10/9,2,第9章代码生成,9.1 代码生成器设计中的问题9.2 目标语言9.3 一个简单的代码生成器9.4 窥孔优化9.5 寄存器分配与指派9.6 本章小结,2023/10/9,3,第9章代码生成,代码生成是编译的最后一个阶段,由代码生成器完成。其任务是把中间代码转换为等价的、具有较高质量的目标代码,以充分利用目标机器的资源。当然,代码生成器本身也必须具有较高
2、的运行效率。目标代码可以是绝对地址的机器代码,或相对地址的机器代码,也可以是汇编代码。本章用微型机的汇编指令来表示目标代码。,2023/10/9,4,9.1 代码生成器设计中的问题,虽然代码生成器的具体实现依赖于目标机器的体系结构、指令系统和操作系统,但存储管理、指令选择、寄存器分配和计算顺序等问题却是设计各种代码生成器都要考虑的问题,本节讨论这类共性问题。,2023/10/9,5,9.1.1 代码生成器的输入,代码生成器的输入包括中间代码和符号表信息,符号表信息主要用来确定中间代码中的变量所代表的数据对象的运行时地址。假设在代码生成前,编译器的前端已经将源程序扫描、分析和翻译成为足够详细的中
3、间代码,其中变量的值已经可以表示为目标机器能够直接操作的量(位、整数、实数、指针等);已经完成了必要的类型检查;在需要的地方已经插入了类型转换符;明显的语义错误(如试图把浮点数作为数组下标)也都已经被检测出来了。,2023/10/9,6,9.1.2 目标代码的形式,代码生成器的输出是目标代码。目标代码的形式主要有如下3种:绝对机器语言代码。所有地址均已定位,可以立即被执行。适于小程序的编译,因为它们可以迅速地被执行。可重定位的机器语言代码。允许分别将子程序编译成一组可重定位模块,再由连接装配器将它们和某些运行程序连接起来,转换成能执行的机器语言程序。好处是比较灵活,并能利用已有的程序资源,代价
4、是增加了连接和装配的开销。汇编语言代码。生成汇编语言代码后还需要经过汇编程序汇编成可执行的机器语言代码,但其好处是简化了代码生成过程并增加了可读性。,2023/10/9,7,9.1.3 指令选择,所谓指令选择是指寻找一个合适的机器指令序列来实现给定的中间代码。目标机器指令系统的性质决定了指令选择的难易程度指令系统的一致性和完备性是两个重要的因素特殊机器指令的使用和指令速度是另一些重要的因素,2023/10/9,8,9.1.3 指令选择,若不考虑目标程序的效率,指令的选择将非常简单:如:三地址语句x:=y+z翻译成如下代码序列:(x,y和z都是静态分配)MOVy,R0/*把y装入寄存器R0*/A
5、DDz,R0/*z加到R0上*/MOVR0,x/*把R0存入x中*/逐个语句地产生代码,常常得到低质量的代码,2023/10/9,9,9.1.3 指令选择,语句序列 a:=b+c d:=a+e的代码如下MOV b,R0ADD c,R0MOVR0,a-若a不再使用,第三条也多余MOVa,R0-多余的指令ADD e,R0MOVR0,d,2023/10/9,10,9.1.3 指令选择,如果目标机器有加l指令(INC),则a:a+1的最有效实现是:INC a而不是MOV a,R0ADD#1,R0MOV R0,a,2023/10/9,11,9.1.4 寄存器分配,将运算对象放在寄存器中的指令通常要比将运
6、算对象放在内存中的指令快且短,因此,要想生成高质量的目标代码,必须充分使用目标机器的寄存器,寄存器的使用包括:寄存器分配:为程序的某一点选择驻留在寄存器的一组变量寄存器指派:确定变量将要驻留的具体寄存器,2023/10/9,12,9.1.4 寄存器分配,选择最优的寄存器指派方案是一个NP完全问题,如果考虑到目标机器的硬件和(或)操作系统对寄存器的使用约束,该问题还会进一步复杂。有关寄存器分配和指派的策略将在9.5节再进行详细讨论。,2023/10/9,13,9.1.5 计算顺序选择,计算执行的顺序同样会影响目标代码的效率。后面将会看到,某些计算顺序比其它顺序需要较少的寄存器来保存中间结果,因而
7、其目标代码的效率也要高。选择最佳计算顺序也是一个NP完全问题。为简单起见,只讨论如何按给定的三地址码的顺序生成目标代码。,2023/10/9,14,9.2 目标语言,9.2.1 目标机模型选择可作为几种微机代表的寄存器机器字节寻址,四字节组成一个字,具有n个通用寄存器R0,R1,Rn-1。二地址指令:op源,目的MOV 将源移到目的中ADD 将源加到目的中SUB 在目的中减去源,2023/10/9,15,9.2 目标语言,寻址模式和它们的汇编语言形式及相关开销寻址模式 汇编形式 地址 增加的开销绝对地址 M M 1寄存器 R R 0下标 c(R)c+contents(R)1间址寄存器*Rcon
8、tents(R)0间址下标*c(R)contents(c+contents(R)1 直接量#c c 1,2023/10/9,16,9.2 目标语言,指令实例MOVR0,MMOV4(R0),Mcontents(4+contents(R0)MOV*4(R0),Mcontents(contents(4+contents(R0)MOV#1,R0,2023/10/9,17,9.2 目标语言,9.2.2 程序和指令的开销指令开销:=1+源和目的寻址模式的附加开销指令开销MOV R0,R1 1MOV R5,M 2ADD#1,R3 2SUB 4(R0),*12(R1)3,2023/10/9,18,程序和指令的
9、开销,a:=b+c,a、b和c都静态分配内存单元MOV b,R0ADD c,R0开销=6MOV R0,a,2023/10/9,19,程序和指令的开销,a:=b+c,a、b和c都静态分配内存单元MOV b,R0ADD c,R0开销=6MOV R0,aMOV b,aADD c,a开销=6,2023/10/9,20,程序和指令的开销,a:=b+c,a、b和c都静态分配内存单元若R0,R1和R2分别含a,b和c的地址,则MOV*R1,*R0ADD*R2,*R0开销=2,2023/10/9,21,程序和指令的开销,a:=b+c,a、b和c都静态分配内存单元若R0,R1和R2分别含a,b和c的地址,则MO
10、V*R1,*R0ADD*R2,*R0开销=2若R1和R2分别含b和c的值,并且b的值在这个赋值后不再需要,则ADD R2,R1MOV R1,a开销=3,2023/10/9,22,9.2.3 变量的运行时刻地址,存储分配策略以及过程的活动记录中局部数据的布局决定了如何访问变量所对应的内存位置前面假设三地址码中的变量实际上是一个指向符号表表项的指针,在代码生成阶段,变量必须被替换为运行时的内存地址例9.1 考虑三地址码x:=0,假设处理完过程的声明部分之后,x在符号表中的相对地址为12,2023/10/9,23,9.2.3 变量的运行时刻地址,如果x被分配在一个地址从static开始的静态内存区域
11、中,则x的运行时刻地址为static+12。如果静态区从地址100开始,x:=0的目标代码为:MOV#0,112。如果采用栈式存储分配策略,则只有等到运行时刻才能知道一个过程的活动记录位置。此时,x:=0的目标代码为:MOV#0,12(SP)。,2023/10/9,24,9.3 一个简单的代码生成器,依次考虑基本块的每个语句,为其产生代码假定三地址语句的每种算符都有对应的目标机器算符假定计算结果留在寄存器中尽可能长的时间,除非:该寄存器要用于其它计算,或者到达基本块末尾后续的目标代码也要尽可能地引用保存在寄存器中的变量值,2023/10/9,25,9.3.1 后续引用信息,为了在代码生成过程中
12、能充分合理地使用寄存器,应把基本块中还会再被引用的变量的值尽量保留在寄存器中,而把基本块内不会再被引用的变量所占用的寄存器及早释放。为此,对于每个形如a:=b op c的三地址码,需要知道变量a、b和c在基本块内是否还会再被引用以及会在哪里被引用,这些信息称为后续引用信息。,2023/10/9,26,9.3.1 后续引用信息,如果在一个基本块中,语句i定义了x,语句j要引用x的值,且从i到j之间没有x的其它定义,则称i中x的定义能够到达j。从j所能到达的每一个x的引用点都称为i点定义的变量x的后续引用信息,所有这样的j所组成的引用链则称为变量x的后续引用信息链。,2023/10/9,27,后续
13、引用信息的计算,初始时,将基本块中各变量的符号表表项的后续引用信息域置为“无后续引用”,并根据该变量在基本块的出口是否活跃,将其活跃信息域置为“活跃”或“不活跃”;从基本块出口向入口反向扫描,并对每个形如i:a:=b op c的三地址码依次执行如下操作:将符号表中a的后续引用信息和活跃信息附加到i上 将符号表中a的后续引用信息和活跃信息分别置为“无后续引用”和“不活跃”将符号表中b和c的后续引用信息和活跃信息附加到i上 将符号表中变量b和c的后续引用信息均置为i,活跃信息均置为“活跃”注意,上述次序不能颠倒,因为b和c也可能就是a。此外,因为过程调用可能带来副作用,所以在划分基本块时将过程调用
14、也作为基本块的入口。,2023/10/9,28,9.3 一个简单的代码生成器,在没有收集全局信息前,暂且以基本块为单位来生成代码,2023/10/9,29,9.3.2 寄存器描述符与地址描述符,例:对a:=b+c如果寄存器Ri含b,Rj含c,且b此后不再活跃产生ADD Rj,Ri,结果a在Ri中如果Ri含b,但c在内存单元,b仍然不再活跃产生ADD c,Ri,或者MOV c,RjADD Rj,Ri若c的值以后还要用,第二种代码比较有吸引力,2023/10/9,30,9.3.2 寄存器描述符与地址描述符,在代码生成过程中,需要跟踪寄存器的内容和名字的地址寄存器描述符记录每个寄存器当前存的是什么在
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 代码 生成 哈工大 王宏志
链接地址:https://www.31ppt.com/p-6240502.html