欢迎来到天天文库
浏览记录
ID:34049345
大小:184.75 KB
页数:14页
时间:2019-03-03
《7 北航本科编译原理课件 张莉》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第七章源程序的中间形式••波兰表示波兰表示••N-元表示N-元表示••抽象机代码抽象机代码北京航空航天大学计算机学院17.1波兰表示一般编译程序都生成中间代码,然后再生成目标代码,主要优点是可移植(与具体目标程序无关),且易于目标代码优化。有多种中间代码形式:波兰表示N-元组表示抽象机代码波兰表示算术表达式:F*3.1416*R*(H+R)转换成波兰表示:F3.1416*R*HR+*赋值语句:A:=F*3.1416*R*(H+R)波兰表示:AF3.1416*R*HR+*:=北京航空航天大学计算机学院2#a+b#ab++操作符栈##优先
2、级最低算法:设一个操作符栈;当读到操作数时,立即输出该操作数,当扫描到操作符时,与栈顶操作符比较优先级,若栈顶操作符优先级高于栈外,则输出该栈顶操作符,反之,则栈外操作符入栈。北京航空航天大学计算机学院3if语句的波兰表示label1label2if语句:ifthenelse12波兰表示为:BZBR1122BZ:二目操作符若的计算结果为0(false),则产生一个到的转移1BR:一目操作符产生一个到3、>的转移2北京航空航天大学计算机学院4波兰表示为:BZBR1122由if语句的波兰表示可生成如下的目标程序框架:BZlabel11BRlabel2label:12label:2其他语言结构也很容易将其翻译成波兰表示,使用波兰表示优化不是十分方便。北京航空航天大学计算机学院57.2N-元表示在该表示中,每条指令由n个域组成,通常第一个域表示操作符,其余为操作数。常用的n元表示是:三元式四元式三元式操作符左操作数右操作数表达式的三元式:w*4、x+(y+z)第三个三元式中的操作数(1)(1)*,w,x(2)表示第(1)和第(2)+,y,z(2)条三元式的计(3)+,(1),(2)算结果。北京航空航天大学计算机学院6条件语句的三元式:ifx>ythenz:=x;elsez:=y+1;(1)-,x,y(2)BMZ,(1),(5)其中:(3):=,z,xBMZ:是二元操作符,测试第二(4)BR,,(7)个域的值,若≤0,则按(5)+,y,1第3个域的地址转移,(6):=,z,(5)若>0,则顺序执行。(7)BR:一元操作符,按第3个域:作无条件转移。:北京航空航天大学计算机学院75、使用三元式不便于代码优化,因为优化要删除一些三元式,或对某些三元式的位置要进行变更,由于三元式的结果(表示为编号),可以是某个三元式的操作数,随着三元式位置的变更也将作相应的修改,很费事。间接三元式:为了便于在三元式上作优化处理,可使用间接三元式三元式的执行次序用另一张表表示,这样在优化时,三元式可以不变,而仅仅改变其执行顺序表。北京航空航天大学计算机学院8例:A:=B+C*D/EF:=C*D用间接三元式表示为:操作三元式1.(1)(1)*,C,D2.(2)(2)/,(1),E3.(3)(3)+,B,(2)4.(4)(4):=,A,(6、3)5.(1)(5):=,F,(1)6.(5)北京航空航天大学计算机学院9四元式表示操作符操作数1操作数2结果结果:通常是由编译引入的临时变量,可由编译程序分配一个寄存器或主存单元。例:(A+B)*(C+D)-E+,A,B,T1式中T1,T2,T3,T4+,C,D,T2为临时变量,由四*,T1,T2,T3元式优化比较方便一,T3,E,T4北京航空航天大学计算机学院107.3抽象机代码许多pascal编译系统生成的中间代码是一种称为P-code的抽象代码,P-code的“P”即“Pseudo”抽象机:寄存器保存程序指令的存储器堆栈式数据7、及操作存储北京航空航天大学计算机学院11寄存器有:1.PC-程序计数器2.NP-New指针,指向“堆”的顶部。“堆”用来存放由New生成的动态数据。3.SP-运行栈指针,存放所有可按源程序的数据声明直接寻址的数据。4.BP-基地址指针,即指向当前活动记录的起始位置指针。5.其他,(如MP-栈标志指针,EP-极限栈指针等)北京航空航天大学计算机学院12计算机的存储大致情况如下:栈底运行栈P-code指令BP当前模块活SP动记录(数据段)NPPC堆堆底常量区程序指令存储器北京航空航天大学计算机学院13运行P-code的抽象机没有专门的运算8、器或累加器,所有的运算(操作)都在运行栈的栈顶进行,如要进行d:=(a+b)*c的运算,生成P-code序列为:栈底:运行栈取aLODa取bLODba单元+ADDb单元取cLODcc单元*MULSPd单元送dSTOdaP
3、>的转移2北京航空航天大学计算机学院4波兰表示为:BZBR1122由if语句的波兰表示可生成如下的目标程序框架:BZlabel11BRlabel2label:12label:2其他语言结构也很容易将其翻译成波兰表示,使用波兰表示优化不是十分方便。北京航空航天大学计算机学院57.2N-元表示在该表示中,每条指令由n个域组成,通常第一个域表示操作符,其余为操作数。常用的n元表示是:三元式四元式三元式操作符左操作数右操作数表达式的三元式:w*
4、x+(y+z)第三个三元式中的操作数(1)(1)*,w,x(2)表示第(1)和第(2)+,y,z(2)条三元式的计(3)+,(1),(2)算结果。北京航空航天大学计算机学院6条件语句的三元式:ifx>ythenz:=x;elsez:=y+1;(1)-,x,y(2)BMZ,(1),(5)其中:(3):=,z,xBMZ:是二元操作符,测试第二(4)BR,,(7)个域的值,若≤0,则按(5)+,y,1第3个域的地址转移,(6):=,z,(5)若>0,则顺序执行。(7)BR:一元操作符,按第3个域:作无条件转移。:北京航空航天大学计算机学院7
5、使用三元式不便于代码优化,因为优化要删除一些三元式,或对某些三元式的位置要进行变更,由于三元式的结果(表示为编号),可以是某个三元式的操作数,随着三元式位置的变更也将作相应的修改,很费事。间接三元式:为了便于在三元式上作优化处理,可使用间接三元式三元式的执行次序用另一张表表示,这样在优化时,三元式可以不变,而仅仅改变其执行顺序表。北京航空航天大学计算机学院8例:A:=B+C*D/EF:=C*D用间接三元式表示为:操作三元式1.(1)(1)*,C,D2.(2)(2)/,(1),E3.(3)(3)+,B,(2)4.(4)(4):=,A,(
6、3)5.(1)(5):=,F,(1)6.(5)北京航空航天大学计算机学院9四元式表示操作符操作数1操作数2结果结果:通常是由编译引入的临时变量,可由编译程序分配一个寄存器或主存单元。例:(A+B)*(C+D)-E+,A,B,T1式中T1,T2,T3,T4+,C,D,T2为临时变量,由四*,T1,T2,T3元式优化比较方便一,T3,E,T4北京航空航天大学计算机学院107.3抽象机代码许多pascal编译系统生成的中间代码是一种称为P-code的抽象代码,P-code的“P”即“Pseudo”抽象机:寄存器保存程序指令的存储器堆栈式数据
7、及操作存储北京航空航天大学计算机学院11寄存器有:1.PC-程序计数器2.NP-New指针,指向“堆”的顶部。“堆”用来存放由New生成的动态数据。3.SP-运行栈指针,存放所有可按源程序的数据声明直接寻址的数据。4.BP-基地址指针,即指向当前活动记录的起始位置指针。5.其他,(如MP-栈标志指针,EP-极限栈指针等)北京航空航天大学计算机学院12计算机的存储大致情况如下:栈底运行栈P-code指令BP当前模块活SP动记录(数据段)NPPC堆堆底常量区程序指令存储器北京航空航天大学计算机学院13运行P-code的抽象机没有专门的运算
8、器或累加器,所有的运算(操作)都在运行栈的栈顶进行,如要进行d:=(a+b)*c的运算,生成P-code序列为:栈底:运行栈取aLODa取bLODba单元+ADDb单元取cLODcc单元*MULSPd单元送dSTOdaP
此文档下载收益归作者所有