1. 19世紀50年代,ibm的backus領導開發了fortran語言及相應的編譯器,這個專案是編譯器發展中的乙個重要里程碑。這個編譯器生成的**與機器語言程式設計師所寫的**相當。遍(pass或phase)的概念就是在這個專案中引入的。backus認為編譯器的轉化可以理解為是消除,這個專案中使用了迴圈不變數**外移,資料流分析和暫存器分配等優化。
john backus. the history of fortran i, ii, and iii. in wexelblat, editor, history of programming languages, pages 25--45. academic press, 1981.
2. 60年代,ibm的乙個團隊為360/370機器開發了fortran/level h編譯器。這也是乙個高度優化的編譯器,四元式的概念就是在這裡引入。後來scarborough和kolsky又對這個編譯器進行了提高。這個專案使用了控制流和資料流分析,公共子表示式消除,計算強度降低,暫存器分配,跳轉優化等。
(編譯器的「前端-中端-後端」經典結構在60年代已經形成。)
r. g. scarborough and h. g. kolsky. improved optimization of fortran object programs. ibm journal of research and development, pages 660--676, nov. 1980.
3. 60年代末至70年代,ibm的allen領導的小組,和nyu的schwartz的小組(setl),發展了到達定義(reaching definition)和位向量等概念來描述程式轉換條件。cmu的wulf等人定義了結構化的語言biliss(1975),進行編譯優化技術研究,後來這個專案發展成pqcc,用於開發元編譯器技術(leverett 1979)。一些商業組織也在開發編譯器,compass開發了基於p-grpah技術的編譯器(karr1975)。這個技術優於到達定義因為資料結構易於公升級。ibm基於p-graph提出了ssa格式(cytron 1989)。
kennedy在rice大學建立了編譯組,主要關注向量化技術,尤其是scalar optimization。該組的cooper也進行過程間分析優化。這個組在演算法方面很強,尤其是在暫存器分配方面。cooper等人最近關注編譯優化序列問題,這個問題近幾年很受關注。
5.70年代末和80年代初,超級計算機和risc處理器的出現,新的編譯技術開始發展。流水線使得設計者開始關注指令排程。最早是sites(1978)重排cray-1的彙編**。後來ibm 801項(1982)目和cmu的gross(1983)將這個技術用於risc處理器。暫存器分配也是乙個難問題。chaitin將這個問題歸結為圖染色問題。cmu的pqcc使用了bin-packing來解決暫存器分配。
用於構造優化編譯器的必要技術在80年代就已存在。目前的研究主要集中在如何更高效和更容易的實現這些技術。比如fortran level h編譯器通過確定迴圈巢狀來優化迴圈,後來morel使用了部分冗餘消除拉進行更有效的**移動,不必對迴圈進行計算。ssa的概念也使得很多優化非常直觀,比如常數傳播(killdall1973,wegman1985)。
編譯器優化
常量摺疊 a 1 2 由於結果可預見,編譯器直接生成a 3 常量傳播a 1 若後續 沒有更改a,則編譯器將a直接用其值1代替 減少變數 對於x和y的比較,可以轉換成if i j x i2 y j 2 if x y 複寫傳播 類似於常量長傳,不過傳播的是變數 若後續 未修改a的值,則編譯器用m代替a ...
編譯器優化 乘法優化
由這個想到的 31乘以某個數能不能寫成這個數乘以2的次冪 再減去這個數。用數學語言表達一下就是 設這個數為x 31 x x 2 n x 這個等式是否存在,如果存在,求n的值 那我們計算一下,31 2 n 1 得2 n 32 得n 5 也就是說存在那麼乙個n使得,31乘以某個數的結果等於這個數乘以2的...
編譯器優化問題
今天遇一程式,unsigned char a,b,c a 0x89 b a 1 c a b 在單步除錯的時候,觀察數值發現b的值為0,分析b的值應當為0x44,百思不得其解,通過檢視其彙編語句,發現問題所在。彙編語句如下 mov r7,tmod 0x89 mov a,r7 clr c rrc a a...