当前位置:
文档之家› 编译原理 第十一章 目标代码生成
编译原理 第十一章 目标代码生成
1.代码生成算法
对每个四元式 i: A := B op C ,依次执行如下步骤:
1. 对A分配寄存器
2. 确定变量B和C现行 值的存放位置B’和C’
若本也活利AB若调G其变块不跃V’EA用B用T返不量中是变L’RU地函E回为或B不基量EG或[址数值再本,BLo(RCC]描DpiR’的被块和:即述为现引出ARRA为V数,,:行用口AR=所L组BBC值,之U’求’Eo在后[p寄C基的]C存)器
《编译原理和技术》(第二版) 陈意云 中国科学技术大学出版社 第8章 第2节
《编译原理及实践》 Kenneth C. Louden (美) 冯博琴 等 译 机械工业出版社 第8章 第7节
Compilers :principles, techniques, and tools (2001),
Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman. 第9章 第2节
《编译原理和技术》(第二版) 陈意云 中国科学技术大学出版社 第8章 第5节
《编译原理及实践》 Kenneth C. Louden (美) 冯博琴 等 译 机械工业出版社 第8章 第8节
Compilers :principles, techniques, and tools (2001),
Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman. 第9章 第6节
如将:(4+(R1))之值所指存储 单L元D内R容0 装, 入#1寄存器R0中
将常数1装入寄存器R0中
类型
指令形式
意义
直接地址型 寄存器型 变址型
间接型
op Ri , M op Ri , Rj op Ri , c(Rj) op Ri , *M op Ri , *Rj op Ri , *c(Rj)
(Ri) op (M)
高目级标语代言码
目标代码 中间代码
A :=(1)(LDB +R,BC ) * D + E
(2)ADD R,C
(1)LD R,B
T(21)A:=DDBR+,C C
(3)ST R,T1 (4)LD R,T1 (5)MUL R,D
T(32)M:=ULT1R,*D D
(4)ADD R,E
A(5):S=T TR2,A+ E
中间 代码优化器
代码
目标程序
中中间间
代代码码 代码生成
符号表
代码生成器的输入包括:
源程序的中间表示
各种中间语言:后缀式、四 元式、图表示法、语法树
符号表中的信息
据此可确定数据区中的 相对地址,
进而可以决定名字所指示的 数据对象的运行时地址
代码生成器的输出为目标程序,其有多种形式:
绝对机器代码 可再定位机器代码 汇编语言程序
Crafting a Compiler with C(1991), Charles N. Fischer, Richard J. LeBlanc Jr. 第15章 第3节、第15章 第4节
《现代编译程序设计》 冯博琴等译 第4章 第2节 第4小节
一.引例 二.待用信息 三.寄存器描述和地址描述 四.代码生成算法
3.示例
1 T:= A-BB
序号图例:左值 左操作数
1
(3,y)
(2,y)
2 ( (x3,y), x ()^,^)
3
(4,y)
(^,^)
4 待(用^,信y息) 活跃(^信,^息)
右操作数
(^,^) (^,^) (4,y) (^,^)
2 U:= AA-CC 3 V:= T+U 4 W:=VV+UU
变量i 名待用信息(下待一用个信引息用及点活)跃信息
RVALUE
R0中有T
R0中有T R1中有U R0中有V R1中有U R0中有W
AVALUE
T在R0中
T在R0中 U在R1中 V在R0中 U在R1中 W在R0中
因为VT的当前值在R0中,且RVALUE[R0]只包含TV,, 因为U给之且U后T且因因因分分V不T为为为之配之配再ATAV后寄后寄’被’不存不存为不引不为再器再器R为用为R被0,被,0,RR,引R1引R0故故,0,1用用未未生将生故故,,分分成U成生生故故配占配一一成成将将,用,条条两两RR故的故中0中条0条分将分寄将间间目目配R配存R代代标0标1给给分器分码码代代WV配R配码码1给释给T放U 掉
3. 生成目标代码
则寄令将存B或器删C优除占先A用VA的LU寄E[存B]器或释者
4. 更新A的地址描述
放B出’ 就来AVA是。AVLAULREU[EA[]C=]{中R}的R
RVALoUpE[RR],={AC}’
5. 去除非必要的寄存器占用
2.过程GETREG的算法
314.2..从如给如已果出果分BR有,的配尚返现的未回行寄分值存配在器的某中寄寄选存存取器器,Ri则中从,中RV选AL取UE一[个RiR]i只为包所含需B 的寄存器,转4 满足条件: 或者B与A是同一标识符 占用Ri的变量的值,也同时存放在改变 量或的者主B的存现单行元值中之后不会再引用
1.寄存器描述 寄存器分配时,寄存器的情况有:
空闲
已分配给某个变量
已分配给某几个变量(程序中含有复写时)
故建立寄存器描述数组RVALUE 动态记录各寄存器的上述信息。
1.地址描述 代码生成时,变量所处位置有:
仅在某寄存器中
仅在某内存单元中
既在某寄存器中,也在某内存单元中
故建立变量地址描述数组AVALUE 动态记录各个变量现行值的存放位置。
方法:
从后向前扫描,对每个变量建立相应的待用信息链 和活跃信息链。
2.算法
此处 颠倒原算法(1)、(2), 则会出错
2.1.从初基始本化块:的出口到入口由后向前依次处理各个四元式: i: A := A op C
i:(A1):=处将B理各o引p变用C量A、的C符号此表处C中原1和此处)3的活有处)理、待把跃的(跃完4用符信1待))不信信后号息、用息表附可息A(信2栏待中加颠为)不填息变 到用倒“为可量四与信,活“元A颠活息的否跃非式倒跃待为则待”i,用上信i用丢,信因息”失活息B、
J
X
无条件跳转到X J = X 如CT为1,转X
比较指令,
CMP A , B 并根据结果设置
CT
J ≠ X 如CT不为1,转X J > X 如CT为2,转X J ≥ X 如CT为2或1,转X
《程序设计语言 编译原理》(第二版) 陈火旺等 国防工业出版社 第11章 第2节
《编译原理和技术》(第一版) 陈意云 中国科学技术大学出版社 第8章 第6节
在基本块中要在最远的将来才会引用到 则选取或Ri者为不所会需引的用寄到存器,并转4
尽量避免产生读写内存单元的操作代码
3.示例
中间代码 T:=A-B
U:=A-C
V:=T+U
W:=V+U
目标代码
LD SUB LD SUB ADD
R0, A R0, B R1, A R1, C R0, R1
ADD R0, R1
Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman. 第9章 第1节
Crafting a Compiler with C(1991),
Charles N. Fischer, Richard J. LeBlanc Jr. 第15章 第1节
《现代编译程序设计》 冯博琴等译
(Ri)
(Ri) op (Rj )
(Ri)
(Ri) op ((Rj)+c) (Ri)
(Ri) op ((M)) (Ri)
(Ri) op ((Rj )) (Ri)
(Ri) op (((Rj)+c)) (Ri)
指令
意义
指令
意义
LD Ri , B 取数指令(B)Ri J < X 如CT为0,转X
ST Ri , B 存数指令Ri (B) J ≤ X 如CT为0或1,转X
(6)ST R,T2
(7)LD R,T2 (8)ADD R,E (9)ST R,A
此是引考后处引用虑,入,L了目D的故效标指临S率代令T时和码指是变充较令多量分 优也余,利 。是的此用多,后寄余且不存的由会器于被后T12
1.概念
在一个基本块中,四元式i对A定值,四元式j要 引用A值,而从i到j之间,没有A的其他定值,那 么,我们称j是四元式i的变量A的待用信息(即 下一个引用点)。
Crafting a Compiler with C(1991), Charles N. Fischer, Richard J. LeBlanc Jr. 第15章 第2节
《现代编译程序设计》 冯博琴等译 第4章 第2节 第7小节
一.指令的执行代价 二.计算节省的执行代价 三.目标代码的生成
每条指令的执行代价 = 每条指令访问主存单元次数+1
(2) 在随后的寄存器指派阶段,挑出变 量将要驻留的具体寄存器
选择最优的寄存器指派方案是困难的。这是NP完全问题。
计算完成的顺序会影响目标代码的有效性 可改变计算顺序来优化目标代码
《程序设计语言 编译原理》(第二版) 陈火旺等 国防工业出版社 第11章 第1节
《编译原理和技术》(第一版) 陈意云 中国科学技术大学出版社 第8章 第2节
((21))处处根理理据定定出值值口AA的活跃信息2信3信处))填息息把理活为分把和符完跃B别符活号、信后置号跃表息C到为将表信中也栏“代中息AA有的 非待变附码可代待量加用i上用用到B能信和信”四是息C息和元的Ai附和“式待活非i用加上跃活
(2)处理引用B、C
跃”
即此值时,代此这码A处4置是原)i引为1错有把i用),、误的符代活2的待号)码跃不表。用信i可的中信息B颠定息和均倒C置与的,为活待“否跃用活则信信跃丢息息”均失