8編譯原理之代碼生成

8編譯原理之代碼生成

ID:5398072

大小:1.26 MB

頁數(shù):64頁

時(shí)間:2017-11-10

8編譯原理之代碼生成_第1頁
8編譯原理之代碼生成_第2頁
8編譯原理之代碼生成_第3頁
8編譯原理之代碼生成_第4頁
8編譯原理之代碼生成_第5頁
資源描述:

《8編譯原理之代碼生成》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。

1、第八章代碼生成湖南大學(xué)計(jì)算機(jī)與通信學(xué)院(軟件學(xué)院)代碼生成器的位置根據(jù)中間表示生成代碼代碼生成器之前可能有一個(gè)優(yōu)化組件代碼生成器的三個(gè)任務(wù)指令選擇:選擇適當(dāng)?shù)闹噶顚?shí)現(xiàn)IR語句寄存器分配和指派:把哪個(gè)值放在哪個(gè)寄存器中指令排序:按照什么順序安排指令執(zhí)行主要內(nèi)容代碼生成器設(shè)計(jì)中的問題目標(biāo)機(jī)模型靜態(tài)/棧式數(shù)據(jù)區(qū)分配基本塊相關(guān)的代碼生成簡單的代碼生成算法窺孔優(yōu)化8.1代碼生成器設(shè)計(jì)中的問題設(shè)計(jì)目標(biāo):生成代碼的正確性(最重要)易于實(shí)現(xiàn)、測試和維護(hù)輸入輸出指令選擇寄存器分配計(jì)算順序代碼生成器設(shè)計(jì)中的問題輸入前端生成的源代碼的IR(中間表示形式)

2、及符號表信息中間表示形式的選擇四元式、三元式、字節(jié)代碼、堆棧機(jī)代碼、后綴表示、抽象語法樹、DAG圖、…輸出RISC、CISC;可重定向代碼、匯編語言代碼生成器設(shè)計(jì)中的問題指令選擇代碼生成器將中間表示形式映射為目標(biāo)機(jī)代碼映射的復(fù)雜性由下列因素決定:IR的層次高:用代碼模板翻譯,但代碼質(zhì)量不高,需優(yōu)化低:利用低層次細(xì)節(jié)生成更高效的代碼指令集體系結(jié)構(gòu)本身的特性期望的目標(biāo)代碼質(zhì)量代碼生成器設(shè)計(jì)中的問題指令選擇映射的復(fù)雜性由下列因素決定:IR的層次指令集體系結(jié)構(gòu)本身的特性指令的統(tǒng)一性、完整性指令速度和機(jī)器慣用語(idioms)期望的目標(biāo)代碼質(zhì)

3、量代碼生成器設(shè)計(jì)中的問題指令選擇映射的復(fù)雜性由下列因素決定:IR的層次指令集體系結(jié)構(gòu)本身的特性期望的目標(biāo)代碼質(zhì)量同一IR程序可用不同代碼序列實(shí)現(xiàn),它們的代價(jià)不同示例:a=a+1可實(shí)現(xiàn)為兩種INCaLDR0,aADDR0,R0,#1STa,R08.2目標(biāo)機(jī)模型本書使用三地址機(jī)器模型,指令如下:加載LDdst,addr;把地址addr中的內(nèi)容加載到dst所指寄存器。addr:內(nèi)存地址/寄存器保存STx,r;把寄存器r中的內(nèi)容保存到x中。計(jì)算OPdst,src1,src2;把src1和scr2中的值運(yùn)算后將結(jié)果存放到dst中。無條件跳轉(zhuǎn)B

4、RL;控制流轉(zhuǎn)向標(biāo)號L的指令條件跳轉(zhuǎn)Bcondr,L;對r中的值進(jìn)行測試,如果為真則轉(zhuǎn)向L。尋址模式變量x:指向分配x的內(nèi)存位置a(r):地址是a的左值加上r中的值(可類比一維數(shù)組方便記憶)constant(r):寄存器中內(nèi)容加上前面的常數(shù)即其地址;(可類比一維數(shù)組方便記憶)*r:寄存器r的內(nèi)容為其地址*constant(r):r中內(nèi)容加上常量的和所指地址中存放的值為其地址(可類比一維數(shù)組方便記憶)常量#constant56例子x=y-zLDR1,y//R1=yLDR2,z//R2=xSUBR1,R1,R2//R1=R1-R2STx

5、,R1//x=R1b=a[i]LRR1,i//R1=iMULR1,R1,8//R1=R1*8LDR2,a(R1)//R2=contents(a+contents(R1))STb,R2//b=R2程序及指令代價(jià)不同的目的有不同的度量最短編譯時(shí)間、目標(biāo)程序大小、運(yùn)行時(shí)間、能耗不可判定一個(gè)目標(biāo)程序是否最優(yōu)指令代價(jià)=指令固定代價(jià)(設(shè)為1)+運(yùn)算分量尋址模式代價(jià),例:LDR0,R1;代價(jià)為1LDR0,M;代價(jià)是2LDR1,*100(R2);代價(jià)為2常數(shù)和內(nèi)存地址增加代價(jià)1,寄存器增加代價(jià)為0。8.3目標(biāo)代碼中的地址Q:如何將IR中的名字轉(zhuǎn)換成

6、目標(biāo)代碼中的地址?A:程序運(yùn)行時(shí)環(huán)境劃分為4個(gè)區(qū)域:代碼區(qū)Code、靜態(tài)區(qū)Static、棧區(qū)Stack和堆區(qū)Heap。不同區(qū)域中的名字采用不同尋址方式。如何為過程調(diào)用和返回生成代碼靜態(tài)分配棧式分配活動(dòng)記錄靜態(tài)分配每個(gè)過程靜態(tài)地分配一個(gè)數(shù)據(jù)區(qū)域,開始位置用staticArea表示callcallee的實(shí)現(xiàn)STcallee.staticArea,#here+20//保存返回地址BRcallee.codeArea...callee中的語句returnBR*callee.staticArea*為突出重點(diǎn),經(jīng)常將活動(dòng)記錄中其它的部分忽略。常量

7、1字長實(shí)際為一個(gè)常量1字長常量1字長一個(gè)指令1字長一個(gè)指令1字長返回地址例子三地址代碼action1callpaction2halt//p的代碼action3return活動(dòng)記錄棧式分配寄存器SP指向棧頂?shù)谝粋€(gè)過程(main)初始化棧區(qū)過程調(diào)用指令序列ADDSP,SP,#caller.recordSize//增加棧指針,越過調(diào)用者自身的活動(dòng)記錄ST0(SP),#here+16//保存返回地址BRcallee.codeArea//轉(zhuǎn)移到被調(diào)用者返回指令序列BR*0(SP)//被調(diào)用者最后執(zhí)行,返回調(diào)用者SUPSP,SP,#caller

8、.recordSize//調(diào)用者中減低棧指針34例:快速排序未完,轉(zhuǎn)下頁例:快速排序接上頁名字的運(yùn)行時(shí)刻地址在三地址語句中使用名字(實(shí)際上是按符號表?xiàng)l目提供的信息)來引用變量三地址語句x=0如果x分配在開始位置為static靜態(tài)區(qū)域,

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時(shí)聯(lián)系客服。
3. 下載前請仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請聯(lián)系客服處理。