编译原理讲义课件.ppt
《编译原理讲义课件.ppt》由会员分享,可在线阅读,更多相关《编译原理讲义课件.ppt(51页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、8 目标代码生成学时:6知识点:涉及的问题 基本块、程序流图 下次引用信息 代码生成算法18 目标代码生成n目标代码生成程序的任务将前端产生的中间代码转换为等价的目标代码n对目标代码生成器的要求:正确高质量1.有效地利用目标机器的资源2.所生成的目标代码应高效地运行n本章目标:介绍一个简单的代码生成器算法产生最优化代码问题是不可判定的,实践中能够产生好的(虽不是最优的)代码的启发式技术就很令人满意了2本章主要内容8.1 代码生成器设计中的问题8.2 目标机器8.3 运行时的存储管理8.4 基本块和流图8.5 下次引用信息8.6 简单的代码生成器 小 结 作 业38.1 代码生成器设计中的问题n
2、代码生成器的具体细节依赖于目标机器和操作系统n所有的代码生成器固有的问题代码生成器的输入代码生成器的输出存储管理指令选择寄存器分配计算顺序选择代码生成器的设计4一、代码生成器的输入n中间代码经过语法分析、语义检查之后得到的正确的n符号表记录了与名字有关的信息决定中间表示中的名字所代表的数据对象的运行地址n假定:前期工作结果正确、可信中间代码足够详细必要的类型转换符已正确插入明显的语义错误已经发现、且正确恢复5二、代码生成器的输出n目标代码n形式绝对机器代码可把代码放在内存中固定的地方、立即执行可重定位机器代码.obj(DOS)、.o(UNIX)开发灵活,允许各子模块单独编译需要由连接装配程序将
3、它们连接在一起,生成可执行文件汇编代码代码生成过程容易,但需要汇编6三、存储管理n从名字到存储单元的映射由前端和代码生成器共同完成n三地址代码中的名字指向该名字在符号表中位置的指针n符号表中的信息在处理声明语句时填入“类型”决定了它的域宽“地址”确定该名字在过程的数据区域中的相对位置上述信息用于确定中间代码中的名字对应的数据对象在运行时的地址n生成机器代码时,指令地址通过计数器来实现7例如:中间代码与目标代码的对应n对于四元式j:goto iij目标代码.0n四元式100的机器码 四元式 地址 长度.100 (,)101 (,)102 (,)103 (,).n121212n+12n+12四元式
4、101的机器码8 88n+20n+20四元式102的机器码161616n+36n+36四元式103的机器码4 44n+40.将四元式j的地址记入与i相关的链表中,等待回填四元式i的地址已有,可以直接生成机器指令8四、指令选择n机器指令系统的性质决定了指令选择的难易程度n代码质量取决于它的执行速度和长度n对每一类三地址语句,可以设计它的代码框架如:x:=y+z 的代码框架可以是:MOV y,R0ADD z,R0MOV R0,xa:=b+cd:=a+ea:=a+1MOV b,R0ADD c,R0MOV R0,aMOV a,R0ADD e,R0MOV R0,dMOV a,R0ADD#1,R0MOV
5、R0,aINC a9五、寄存器分配n充分利用寄存器可以生成好的代码n寄存器使用的两个问题哪些变量要放在寄存器中指定的变量放在哪个寄存器中n寄存器指派的困难可用寄存器专用寄存器通用寄存器寄存器对把寄存器指派给相应的变量变量需要什么样的寄存器操作需要什么样的寄存器选择最优的寄存器指派方案是一个NP完全问题10六、计算顺序的选择n计算顺序影响目标代码的效率n选择最佳计算次序是一个NP完全问题七、代码生成器的设计n设计原则能够正确地生成代码易于实现、便于测试和维护n只介绍一个简单的代码生成算法主要考虑寄存器的有效使用118.2 目标机器n设计代码生成器的必要条件:熟悉目标机器n一般信息编址方式:按字节
6、编址每个字有4个字节寄存器:n个通用寄存器:R0、R1、Rn-1指令形式:OP S,D其中 OP:MOV、ADD、SUB S:源操作数 D:目的操作数12寻址方式地址形式 汇编方式 地址 占用存储空间 绝对地址 M M 1 寄存器 R R 0 变址 c(R)c+contents(R)1 间接寄存器 *R contents(R)0 间接变址 *c(R)contents(c+contents(R)1 立即数#c 常数c 1n指令代价指令所占用存储单元字数=1+S寻址方式占用字数+D寻址方式占用字数13举例nMOV R0,R1将寄存器R0的内容复制到R1中代价:1nMOV R5,M将寄存器R5的内容
7、放到存储单元M中代价:2nADD#1,R3将寄存器R3的内容增加1代价:2nSUB 4(R0),*12(R1)将地址为(contents(12+contents(R1)的单元中的值减去contents(4+contents(R0),结果仍存放到地址为(contents(12+contents(R1)的单元中。代价:314三地址语句a:=b+c的代码(1)MOV b,R0ADD c,R0 指令代价为6MOV R0,a(2)MOV b,aADD c,a 指令代价为6(3)假定R0、R1和R2中分别存放了a、b和c的地址:MOV *R1,*R0ADD *R2,*R0 指令代价为2(4)假定R1和R2
8、中分别包含b和c的值,b的值以后不再需要:ADD R2,R1MOV R1,a 指令代价为315n过程的语义决定了运行时名字如何与存储单元相联系。n存储分配策略静态存储分配存储器中活动记录的位置在编译时刻已经确定栈式存储分配当开始执行一个过程时,一个新的活动记录压入栈顶当该过程的活动结束时,其活动记录从栈中弹出n活动记录的内容参数、返回值控制链、访问链、机器状态局部数据、临时变量8.3 运行时的存储管理n活动记录的分配和释放是调用序列和返回序列的一部分n讨论三地址语句 call returnhaltaction16静态存储分配情况三地址代码:三地址代码:/*S的代码*/action1call p
9、action2halt/*P的代码*/action3returnS的活动记录的活动记录(64字节字节):045660返回地址arrijP的活动记录的活动记录(88字节字节):04返回地址buf84n17n三地址语句call的目标机器指令:MOV指令:存放返回地址GOTO指令:将控制转移到被调用过程的目标代码 MOV#here+20,callee.static_areaGOTO callee.code_areahere:该MOV指令的地址20:call的机器指令的代价#here+20:返回地址被调用过程活动记录的开始地址被调用过程代码的第一条指令地址n三地址语句return的目标机器指令:GOT
10、O *callee.static_area代码结构18静态存储分配举例100:action1120:MOV#140,364132:GOTO 200140:action2160:HALT 200:action3220:GOTO *364 300:304:364:368:保存返回地址 调用过程P 返回到364存储单元里存放的地址 S的代码:的代码:P的代码:的代码:S的活动记录:(300-363)P的活动记录:(364-451)返回地址单元 返回地址单元局部数据单元局部数据单元140返回地址返回地址19栈式存储分配情况n活动记录分配在栈中n活动记录在栈中的位置,直到运行时才能确定n这个位置常被存放
11、在一个寄存器中n寄存器SP保存指向栈顶活动记录开始位置的指针当发生过程调用时,调用过程给SP一个增量,使之指向被调用过程的活动记录的开始位置,同时将控制转移到被调用过程;当控制返回到调用过程时,再将SP减去原来的增量,从而释放了被调用过程的活动记录。20代码结构n主程序的代码MOV#stackstart,SP第一个过程的代码HALT初始化控制栈n三地址语句call的机器代码ADD#caller.recordsize,SP MOV#here+16,SP GOTO callee.code_area SP指向下一个活动记录n三地址语句return的机器代码GOTO*0(SP)SUB#caller.r
12、ecordsize,SP间接变址,返回调用过程该指令在被调用过程的代码中SP指回调用过程的活动记录该指令在调用过程的代码中21程序说明三地址代码:/*S的代码*/action1call qaction2halt/*P的代码*/action3return/*q的代码*/action4call paction5call qaction6call qreturn各过程目标代码的起址:s:#100p:#200q:#300活动记录的大小:ssize=20psize=40qsize=60控制栈的开始位置:#60022100:MOV#600,SP108:action1128:ADD#ssize,SP136:
13、MOV#152,*SP144:GOTO 300152:SUB#ssize,SP160:action2180:HALT 200:action3220:GOTO *0(SP)栈式存储分配举例300:action4320:ADD#qsize,SP328:MOV#344,*SP336:GOTO 200344:SUB#qsize,SP352:action5372:ADD#qsize,SP380:MOV#396,*SP388:GOTO 300396:SUB#qsize,SP404:action6424:ADD#qsize,SP432:MOV#448,*SP440:GOTO 300448:SUB#qsize
14、,SP456:GOTO *0(SP)600:SPq初始化栈call qcall preturncall qcall qreturn23程序执行及栈的变化情况SP=600SS的活动记录20call qSP=620返回地址152q的活动记录60qcall pSP=680p的活动记录40返回地址344preturn返回地址344SP=620p的活动记录40call qSP=680q的活动记录60返回地址396qreturn返回地址396SP=620q的活动记录60call qSP=680q的活动记录60返回地址448qreturn返回地址448SP=620q的活动记录60return返回地址152S
15、P=600q的活动记录60haltS的活动记录2024运行时名字的地址n假定三地址语句为:x:=0n静态存储分配情况静态数据区的基址:staticx在数据区中的位置是 12x的实际地址应为:static+12尽管在编译时可确定static+12的值,但在生成中间代码时,static的值可能并不知道。这样,必须生成相应的三地址代码以“计算”static+12的值。赋值语句 x:=0 被翻译为如下三地址代码:static12:=0若 static=100,则相应的目标代码为:MOV#0,11225用display表存取非局部名字,该表存放在寄存器中x局部于一个活动记录,该活动记录的display表
16、指针在寄存器R3中将语句 x:=0 翻译成为如下三地址语句:t1:=12+R3*t1:=0n栈式存储分配情况t1中存放的是x的地址这个序列可由如下机器指令来实现:MOV#0,12(R3)268.4 基本块和流图n基本块具有原子性的一组连续语句序列。控制从第一条语句流入,从最后一条语句流出,中途没有停止或分支(末尾除外)n划分基本块的方法确定入口语句三地址代码的第一条语句条件/无条件语句转移到的语句紧跟在条件/无条件语句后面的语句确定基本块从一个入口语句(含该语句)到下一个入口语句(不含)从一个入口语句(含该语句)到停止语句(含该语句)27举例基本块:t1:=a*at2:=a*bt3:=2*t2
17、t4:=t1+t3t5:=b*bt6:=t4+t5(1)i:=m-1(2)j:=n(3)t1:=4*n(4)v:=at1(5)i:=i+1(6)t2:=4*i(7)t3:=at2(8)if t3v goto(9)(13)if i=j goto(23)(14)t6:=4*i(15)x:=at6(16)t7:=4*i(17)t8:=4*j(18)t9:=at8(19)at7:=t9(20)t10:=4*j(21)at10:=x(22)goto(5)(23)t11:=4*i(24)x:=at11(25)t12:=4*i(26)t13:=4*n(27)t14:=at13(28)at12:=t14(29
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 讲义 课件
限制150内