【正文】
? 實(shí)際上是模式匹配生成方法的更進(jìn)一步自動(dòng)化,它模仿從語法描述構(gòu)造表和表驅(qū)動(dòng)的語法分析方法。 (6) n: =m (7) end (8) end 3t2t:1t4t6t:2te4t:3t8t5t:4tc6t:5tba:6ted:8t??????????????代碼生成器的開發(fā)方法 ? 常用方法 – 解釋性代碼生成 – 模式匹配代碼生成 – 表驅(qū)動(dòng)代碼生成 解釋性代碼生成 ? 解釋性代碼生成方法針對(duì)虛擬機(jī)產(chǎn)生代碼然后擴(kuò)展為實(shí)際目標(biāo)代碼 。待用信息和活躍信息 待用信息 活躍信息變量名初值 待用信息鏈 初值 活躍信息鏈A F ( 2 ) ( 1 ) L L LB F ( 1 ) L LC F ( 2 ) L LD F F L FT F ( 3 ) F F L FU F ( 4 ) ( 3 ) F F L L FV F ( 4 ) F F L F表中 “待用信息鏈”與 “活躍信息鏈”的每列從左至右為每從后向前掃描一個(gè)四元式時(shí)相應(yīng)變量的信息變化情況,空白處為沒變化。 符號(hào)表中增加 “ 待用信息 ” 欄和 “ 活躍信息 ”欄 從基本塊出口到基本塊入口由后向前依次處理每個(gè)四元 式。在這幾個(gè)周期期間,調(diào)不依賴于該取入值的指令來執(zhí)行是很重要的。寄存器分配負(fù)責(zé)確定在程序的哪個(gè)點(diǎn)將哪些值放在寄存器中比較有益。當(dāng)需要執(zhí)行時(shí),由連接裝入程序把它們和某些運(yùn)行程序連接起來,轉(zhuǎn)換成能執(zhí)行的機(jī)器語言代碼 – 匯編語言代碼。尚需經(jīng)過匯編程序匯編,轉(zhuǎn)換成可執(zhí)行的機(jī)器語言代碼 返回 構(gòu)造代碼生成器所要考慮的主要問題 ? 代碼生成所要考慮的主要問題 – 如何使生成的目標(biāo)代碼較短 – 如何充分利用計(jì)算機(jī)的寄存器,減少目標(biāo)代碼中訪問存儲(chǔ)單元的次數(shù) 返回 代碼生成的主要成份 ? 指令選擇 – 尋找一個(gè)合適的目標(biāo)機(jī)指令以實(shí)現(xiàn)給定的中間表示 ? 寄存器分配 – 確定在程序的哪個(gè)點(diǎn)將哪些值放在寄存器中比較有益 ? 指令調(diào)度 – 確定程序指令的執(zhí)行順序 ? 三者的關(guān)系 指令選擇 ? 如:中間代碼 a:=a+1: 實(shí)現(xiàn) 1: INC a 實(shí)現(xiàn) 2: LD R0, a ADD R0, 1 ST R0, a ? 主要功能 多數(shù) CPU的指令集合具有冗余性,也即,同一計(jì)算可用兩個(gè)或多個(gè)不同的指令序列完成。 寄存器分配(續(xù)) ? 寄存器的分配可以分成兩個(gè)子問題: – 在寄存器分配期間,為程序的某一點(diǎn)選擇駐留在寄存器中的一組變量; – 在隨后的寄存器指派階段,挑出變量將要駐留的具體寄存器。 ? 必須找一個(gè)指令(與被取值無關(guān))在取指令之后立即執(zhí)行,如果找不到相應(yīng)的指令,這些周期就會(huì)被浪費(fèi)。對(duì)每個(gè)四元式 i: A := B op C ,依次執(zhí)行下述步驟: a ) 把符號(hào)表中變量 A 的待用信息和活躍信息附加到四元式 i 上。待用信息和活躍信息在四元式上的標(biāo)記如下所示:( 1 ) T( 3) L: = A( 2) LBFL( 2 ) U( 3) L: = AFLCFL( 3 ) V( 4) L: = TFF+U( 4) L( 4 ) DFL: = VFF+UFF寄存器描述和地址描述 為隨時(shí)掌握各寄存器的情況, 寄存器描述數(shù)組 R V A L U E : 描述每個(gè)寄存器當(dāng)前的狀況 變量地址描述數(shù)組 A V A L U E :表示變量的存放情況 基本塊的代碼生成算法 假設(shè)只有 A := B o p C 的四元式序列 A . 對(duì)每個(gè)四元式 i: A := B o p C ,依次執(zhí)行下述步驟: 1 . 以四元式 i: A := B o p C 為參數(shù),調(diào)用過程 g e t r e g ( i : A := B o p C ) 。首先,建立一個(gè)代碼生成專用語言,用這種語言以宏定義、子程序等形式描述代碼生成過程,通過宏定義和子程序把中間語言解釋為目標(biāo)代碼。首先把對(duì)目標(biāo)機(jī)的形式化描述進(jìn)行預(yù)加工并轉(zhuǎn)換為代碼生成表,然后用代碼生成程序驅(qū)動(dòng)代碼生成表,把中間語言的內(nèi)部表示翻譯成目標(biāo)機(jī)的匯編代碼。 ? 基本思想 中間表示是一序列語法樹,而將機(jī)器指令用樹重寫規(guī)則表示,