【正文】
{ R } ,并令 R V A L U E [ R ] = { A } ,以表示變量 A 的現(xiàn)行值只在 R 中并且 R 中的值只代表 A 的現(xiàn)行值; ( 3 ) 如 B 或 C 的現(xiàn)行值在基本塊中不再被引用,它們也不是基本塊出口之后的活躍變量(由四元式 i 上的附加信息知道),并且其現(xiàn)行值在某個(gè)寄存器 Rk 中,則刪除 R V A L U E [ R k ] 中的 B 或 C 以及 A V A L U E [ B ] 或 A V A L U E [ C ] 中的 Rk ,使該寄存器不再為 B 或 C 所占用。 ? 機(jī)器描述是通過過程的形式提供的,如:Miller曾采用如下方法進(jìn)行代碼生成,它把源程序映象成兩地址代碼序列,然后進(jìn)行代碼生成。 表驅(qū)動(dòng)代碼生成(續(xù)) ? 優(yōu)點(diǎn) 這種表驅(qū)動(dòng)代碼生成方法易于使用和修改,便于可重定位目標(biāo)代碼的生成,增強(qiáng)了編譯程序的可移植性和靈活性。 解釋性代碼生成(續(xù)) ? 不足之處: – 由于目標(biāo)機(jī)的多樣性、尋址方式、指令的差異等等,給中間代碼的設(shè)計(jì)帶來困難; – 代碼生成語言與機(jī)器密切相關(guān),不一定能達(dá)到全部可移植; – 目標(biāo)機(jī)的描述與代碼生成算法混在一起,當(dāng)描述改變時(shí),勢必引起算法的改變; – 需進(jìn)行指令的選擇、指令排序等低層次的繁瑣工作,產(chǎn)生的目標(biāo)代碼質(zhì)量依賴于設(shè)計(jì)者經(jīng)驗(yàn)和能力; – 代碼生成的視野有限,雖可進(jìn)行一定范圍的優(yōu)化,但對協(xié)調(diào)上下文有關(guān)的優(yōu)化較困難。 (3) 將 n列入表中 。 例: 若用 A , B , C , D 表示變量,用 T , U , V 表示中間變量,有四元式如下:( 1 ) T: = A B( 2 ) U : = A C( 3 ) V : = T+ U( 4 ) D : = V + U其名字表中的待用信息和活躍信息如下表,用 “ F ”表示 “非待用” “非活躍”,用 “ L ”表示活躍。 計(jì)算待用信息的算法: 對各基本塊的符號(hào)表中的 “待用信息 ” 欄和 “活躍信息 ” 欄置初值,即把 “待用信息 ” 欄置 “非待用 ” ,對 “活躍 信息 ” 欄按在基本塊出口處是否為活躍而置成 “活躍 ” 或 “非活躍 ” 。 返回 指令調(diào)度 ? 對具有流水線限制的體系結(jié)構(gòu),這個(gè)階段是必須的。由此可見,將經(jīng)常使用的操作數(shù)保存在寄存器中是比較有利的。 ? 代碼生成器 完成代碼生成這一過程的程序稱為代碼生成器,如圖所示。 ? 指令選擇的基本原則 – 減小產(chǎn)生代碼的尺寸 – 減小目標(biāo)代碼的執(zhí)行時(shí)間 返回 指令選擇(續(xù)) 目標(biāo)機(jī)器的地址方式 地址方式 匯編形式 地址 增加的開銷 直接地址方式 M M 1 寄存器方式 R R 0 間接寄存器方式 *R contents(R) 0 索引方式 c(R) c+contents(R) 1 間接索引方式 *c(R) contents( c+contents(R)) 1 a:=b+c 1. MOV b, R0 ADD c, R0 cost=6 MOV R0, a 2. MOV b, a ADD c, a cost=6 假定 R0, R1和 R2中分別存放了 a, b和 c的地址 , 采用 : 3. MOV *R1, *R0 ADD *R2, *R0 cost=2 假定 R1和 R2中分別包含 b和 c的值 , 并且 b的值在這個(gè)賦值以后不再需要 , 則還可有 4. ADD R2, R1 MOV R1, a cost=3 寄存器分配 ? 通常情況下,指令在寄存器中訪問操作數(shù)的開銷要比在內(nèi)存中訪問小。 這樣 , 訪問變量值時(shí)可減少對內(nèi)存的存取次數(shù) , 以提高運(yùn)行速度; ? 當(dāng)?shù)交緣K出口時(shí) , 將變量的值存放在內(nèi)存中 , 因?yàn)橐粋€(gè)基本塊可能有多個(gè)后繼結(jié)點(diǎn)或多個(gè)前驅(qū)結(jié)點(diǎn) , 同一變量名在不同前驅(qū)結(jié)點(diǎn)的基本塊內(nèi)出口前存放的 R可能不同 , 或沒有定值 , 所以應(yīng)在出口前把寄存器的內(nèi)容放在內(nèi)存中 , 這樣從基本塊外入口的變量值都在內(nèi)存中; ? 在同一基本塊內(nèi)后邊不再被引用的變量所占用的寄存器應(yīng)盡早釋放 , 以提高寄存器的利用率 。在進(jìn)行寄存器分配和指令調(diào)度之時(shí),假定指令選擇已經(jīng)完成; ? 若先進(jìn)行調(diào)度,寄存器趨向于過度分配;若先進(jìn)行寄存器分配,對于給定的寄存器分配,可供調(diào)度的指令可能太少,可能不包含任何好的調(diào)度。 (由于在 i 中對 A 的定值只能 在 i 以后的四元式才能引用,因而對 i 以前的四元式來說 A 是不活躍也不可能是待用的) c ) 把符號(hào)表中變量 B 和 C 的待用信息和活躍信息附加到四元 式 i 上。 B .處理完基本塊中所有四元式之后,對現(xiàn)行值在某寄存