摘要:隨著計算機技術(shù)的不斷發(fā)展,尤其是計算機體系結(jié)構(gòu)的發(fā)展,編譯器面臨極大的挑戰(zhàn)。這要求我們進一步加強和發(fā)展編譯教學(xué),在研究生階段開設(shè)編譯高階課程。本文介紹國防科學(xué)技術(shù)大學(xué)研究生高級編譯技術(shù)課程,包括課程內(nèi)容、安排和實踐,給出了國際其他大學(xué)開設(shè)研究生階段編譯課程的情況介紹。
關(guān)鍵詞:高級編譯技術(shù);編譯優(yōu)化;并行編譯
為了保證國家安全,提高計算機核心競爭力,國家對CPU、基礎(chǔ)軟件研制的支持力度不斷增強,863計劃、“核高基”重大專項都包含編譯器項目,以開發(fā)自主可控、支持國產(chǎn)CPU的高效編譯器。
隨著計算機技術(shù)不斷發(fā)展,編譯器在未來50年,主要面臨兩個挑戰(zhàn):一是程序優(yōu)化,尤其是多核/眾核體系結(jié)構(gòu)的優(yōu)化,使并行程序成為主流;二是提高程序的正確性和安全性[1]。
《編譯器研究:未來50年》[1]指出:為了迎接編譯器研究中的挑戰(zhàn),編譯器領(lǐng)域需要一個由全球工業(yè)界、國家實驗室和大學(xué)聯(lián)合參加的研究計劃,并給出了四項建議。其中一項就是開發(fā)與編譯技術(shù)相關(guān)的課程,即除了本科編譯課程外,開設(shè)高級編譯技術(shù)課程作為計算機科學(xué)與技術(shù)高年級研究生選修課程,或者在一些計算機科學(xué)課程中,討論編譯算法,關(guān)注基于編譯器的分析。例如在可信計算中,討論如何通過編譯技術(shù)提高程序的可信性。在體系結(jié)構(gòu)中,關(guān)注體系結(jié)構(gòu)如何與編譯器進行交互。
本文介紹了我校面向研究生的高級編譯技術(shù)課程設(shè)置和組織,并和國際上的同類課程進行了比較。
1課程定位
國內(nèi)外大學(xué)計算機專業(yè)在本科階段都開設(shè)了編譯課程,這些課程多數(shù)重點講述與語言分析相關(guān)的部分(詞法分析、語法分析、語義分析等),對程序分析和優(yōu)化的介紹則比較簡單。這樣的課程可以讓學(xué)生理解一般性的編譯過程及其原理,但對于需要深入掌握計算機系統(tǒng)軟/硬件核心技術(shù)的研究生而言則顯不足。因為一個現(xiàn)代的優(yōu)化編譯器不只是將源語言編譯為目標(biāo)語言,重要的是將其編譯為能充分發(fā)揮計算機性能的高質(zhì)量目標(biāo)語言。這一目標(biāo)主要依靠編譯優(yōu)化來完成。在現(xiàn)代編譯器中,編譯優(yōu)化部分占的比重往往是最大的,例如,GCC4.5中,2/3左右的代碼都是優(yōu)化和運行時庫。此外,編譯優(yōu)化也是編譯研究中最具挑戰(zhàn)性的內(nèi)容,計算機體系結(jié)構(gòu)的每一個重大變化都需要編譯優(yōu)化來應(yīng)對。為此,我們?yōu)檠芯可鷮iT開設(shè)了高級編譯技術(shù)課程。
高級編譯技術(shù)課程主要介紹優(yōu)化編譯器的設(shè)計與實現(xiàn)的基礎(chǔ)理論與方法,重點是編譯優(yōu)化和代碼生成技術(shù),并使學(xué)生了解編譯領(lǐng)域的最新研究進展。通過本課程的學(xué)習(xí)和實踐,學(xué)生將掌握編譯構(gòu)建和編譯優(yōu)化技術(shù),包括程序分析、編譯優(yōu)化、代碼生成以及運行時系統(tǒng)。本課程將為學(xué)員較快進入編譯相關(guān)科研課題、完成科研工作提供良好的基礎(chǔ)。
2課程設(shè)置和安排
國防科大一直從事巨型機的研制,這要求必須研制針對并行體系結(jié)構(gòu)的優(yōu)化編譯器。因此,我院從2000年開始,就設(shè)置了高級編譯技術(shù)這一課程。課程設(shè)置伊始,以沈志宇等撰寫的《并行編譯方法》[2]作為教材,主要講授并行編譯的相關(guān)知識,重點是依賴關(guān)系分析、循環(huán)并行化和向量化、并行編譯和運行時庫優(yōu)化。隨著計算機的不斷發(fā)展,針對目前編譯領(lǐng)域的研究現(xiàn)狀,從2007年開始,我們重新修訂了高級編譯技術(shù)的教學(xué)大綱,將重點從并行編譯轉(zhuǎn)向更通用的編譯優(yōu)化,把并行編譯作為一個專題講座,不僅面向未來從事編譯研究的學(xué)生,也為學(xué)生從事體系結(jié)構(gòu)、可信計算等方向的研究打下良好的基礎(chǔ)。
2.1課程內(nèi)容
高級編譯技術(shù)課程講授包括兩個部分:編譯優(yōu)化基礎(chǔ)和專題講座。
編譯優(yōu)化可以看作是“分析+轉(zhuǎn)換”,即通過分析編譯過程中的中間表示,對其進行轉(zhuǎn)換,以便生成“更好”的目標(biāo)代碼。其中,程序分析是基礎(chǔ),課程涵蓋了優(yōu)化所需的關(guān)鍵分析技術(shù):控制流/數(shù)據(jù)流分析、別名分析和依賴關(guān)系分析,如圖1所示。
編譯優(yōu)化可以分為與體系結(jié)構(gòu)無關(guān)(或者關(guān)系較少)的優(yōu)化和與體系結(jié)構(gòu)密切相關(guān)的優(yōu)化。前者一般在較高一層的中間表示進行,例如剖視指導(dǎo)的優(yōu)化、循環(huán)優(yōu)化等,后者在低層次的中間表示進行,例如寄存器分配、指令調(diào)度等。
在與體系結(jié)構(gòu)無關(guān)的優(yōu)化方面,課程選取了:
1) (部分)冗余刪除優(yōu)化,包括經(jīng)典的標(biāo)量優(yōu)化(如常數(shù)傳播、激進的死代碼刪除等)、部分冗余刪除等;
2) 針對占程序大部分執(zhí)行時間的高級循環(huán)變換,例如,循環(huán)分布和合并、循環(huán)分塊、向量化等;
3) 面向“存儲墻”的局部性優(yōu)化,例如,提高指令局部性的代碼重排、提高數(shù)據(jù)局部性的數(shù)據(jù)墊塞等。
與體系結(jié)構(gòu)相關(guān)的優(yōu)化,課程選取了代碼生成階段的寄存器分配、指令選擇與調(diào)度。寄存器分配給出了經(jīng)典的基于化簡-合并的圖著色法外,還介紹了針對靜態(tài)單一賦值(Static Single Assignm