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