【正文】
F (3) (3) F (2) (2) F (1) (1) F L F F F L L L F L L L L F (4)DFL:=VFF+UFF (3)V(4)L:=TFF+U(4)L (2)U(3)L:=AFLCFL (1)T(3)L:=A(2)LBFL (4)D:=V+U (3)V:=T+U (2)U:=AC (1)T:=AB 26 ?表 “待用信息鏈”與“活躍信息鏈”的 每列 , 從左至右 為每當(dāng) 從后向前 掃描一個四元式時 相應(yīng)變量 的信息變化情 況, 空白處為沒變化 V U T D C B A 活躍信息鏈 初值 待用信息鏈 初值 活躍信息 待用信息 變量 L L F F F F F F F F F L L (4) (4) F (3) (3) F (2) (2) F (1) (1) F L F F F L L L F L L L L F ① ② ③ ④ ① ② ③ ④ (4)(3)(2)(1) ④ ③ ② ① DVUVTUUACTAB 27 三 .代碼生成算法 ?寄存器和內(nèi)存地址的描述: ?RVALUE[Ri]={A,C} 表示 Ri的現(xiàn)行值是變量 A, C的值 ?AVALUE[A]={A} 表示 A的值在內(nèi)存中 ?AVALUE[A]={Ri,A} 表示 A的值在 Ri中又在內(nèi)存中 ?AVALUE[A]={Ri} 表示變量 A的值在寄存器 Ri中 28 ?寄存器分配和代碼生成的具體算法: ?設(shè) RETREG是一個函數(shù)過程,它的參數(shù)是一個形如 i: A:=B op C的四元式,每次調(diào)用 GETREG(i: A:=B op C)則返回 一個寄存器 R,用以存放 A的結(jié)果值 ?對如何給出寄存器 R,要用到四元式 i上的待用信息,以使 寄存器分配合理,對每個四元式的代碼生成都要調(diào)用函數(shù) GETREG 29 ?GETREG分配寄存器的算法為: ( 1)如果 B的現(xiàn)行值在某寄存器 Ri中,且該寄存器只包含 B 的值,或者 B與 A是同一標(biāo)識符,或 B在該四元式后不會再被 引用,則可選擇 Ri為所需的寄存器 R,并轉(zhuǎn)( 4) 30 ( 2)如果有尚未分配的寄存器,則從中選用一個 Ri為所需的 寄存器 R,并轉(zhuǎn)( 4) 31 ( 3)從已分配的寄存器中選取一個 Ri作為所需寄存器 R, 其 選擇原則為: 占用該寄存器的變量值同時在主存中,或在基 本塊中引用的位置最遠(yuǎn),這樣對寄存器 Ri所含的變量和變量 在主存中的情況必須先做如下調(diào)整:即對 RVALUE[Ri]中的 每一變量 M,如果 M不是 A且 AVALUE[M]不包含 M, 則需完 成以下處理: ①生成目標(biāo)代碼 ST Ri, M;即把不是 A的變量值由 Ri中送 入內(nèi)存中 ②如果 M不是 B,則令 AVALUE[M]={M},否則,令 AVALUE[M]={M,Ri} ③ 刪除 RVALUE[Ri]中的 M 32 ( 4)給出 R,返回 33 ?這樣,一旦得到一個為四元式運(yùn)算的操作寄存器 R,就可 以進(jìn)行代碼生成,而當(dāng)目標(biāo)代碼生成完成后,則又需修改 寄存器的使用信息和地址信息 ?用圖 : 34 35 36 167。 幾種常用的代碼生成程序的開發(fā)方法 一 .解釋性代碼生成法 ?解釋性代碼生成文法 是建立一個代碼生成專用語言,用這 種語言以宏定義、子程序等形式描述代碼生成過程 ?通過這些宏定義和子程序把中間語言解釋為目標(biāo)代碼 ?這種方法使機(jī)器描述與代碼生成算法結(jié)合在一起,與機(jī)器 的聯(lián)系直接反映在算法中 ?機(jī)器描述是通過過程的形式提供的,如采用把源程序映像 成兩地址代碼序列的方法進(jìn)行代碼生成過程中,對加法的 代碼生成算法如下: 37 ?macro ADD x,y ?if type of x=integer and type of y=integer ?then IADD x,y ?else if type of x=float and type of y=float ?then FADD x,y ?else error 38 ?其中含有對 IADD與 FADD的宏調(diào)用,以生成目標(biāo)機(jī)上的 整數(shù)和浮點(diǎn)數(shù)加法指令,如對 IBM360機(jī), IADD可寫為: ?macro ADD a,b ?from a in R1,b in R2 ?emit (AR a,b) result in R1 ?from a in R,b in M ?emit(A a,b) result in R ?from a in M,b in R ?emit(A b,a) result in R 39 ?這種算法的局限性在于: ( 1)由于目標(biāo)機(jī)的多樣性、尋址方式、指令的差異等等, 給中間代碼的設(shè)計(jì)帶來困難 ( 2)代碼生成語言與機(jī)器密切相關(guān),可移植性受到限制 ( 3)目標(biāo)機(jī)的描述與代碼生成算法混在一起,當(dāng)描述改變 時,勢必引起算法的改變 ( 4)需進(jìn)行指令的選擇、指令的排序等低層次的繁瑣工作 ,產(chǎn)生的目標(biāo)代碼質(zhì)量依賴于設(shè)計(jì)者的經(jīng)驗(yàn)和能力 ( 5)代碼生成的視野有限,雖可進(jìn)行一定范圍的優(yōu)化,但 對協(xié)調(diào)上下文有關(guān)的優(yōu)化較困難 40 二 .模式匹配代碼生成法 ?模式匹配代碼生成方法是把對機(jī)器的描述與代碼生成的算 法分開 ?而對在解釋性代碼生成方法中,所需做的較繁重的具體情 況分析的解釋工作用模式匹配來代替 41 ?也就是建立一個代碼生成用的機(jī)器描述語言,用以形式地 描述目標(biāo)機(jī)的資源、指令及其語義等有關(guān)信息 ?代碼生成程序根據(jù)這些信息,自動地把中間語言程序翻譯 成目標(biāo)機(jī)的匯編語言或機(jī)器代碼 ?但在這種方法中,需通過形式描述的模式如實(shí)地反應(yīng)機(jī)器 的特性,這并不是一件容易的事,而且進(jìn)行模式匹配時耗 費(fèi)時間很長,其目標(biāo)代碼的質(zhì)量也不太理想 42 三 .表驅(qū)動代碼生成法 ?表驅(qū)動代碼生成方法 ,實(shí)質(zhì)上是模式匹配代碼生成方法的 更進(jìn)一步自動化,它是模仿從語法描述構(gòu)造表和表驅(qū)動的 一種語法分析方法 ?首先,把對目標(biāo)機(jī)的形式化描述進(jìn)行預(yù)加工轉(zhuǎn)換成代碼生 成表 ?然后,用表驅(qū)動的代碼生成程序,來驅(qū)動代碼生成表 ?最后,把中間語言的內(nèi)部表示翻譯成目標(biāo)機(jī)的匯編代碼 ?也就是說, 它是用一個代碼生成程序的生成器自動地構(gòu)造 一個代碼生成程序 43