一款強大的編譯器LLVM:http://llvm.org/docs/GettingStarted.html#layout
http://llvm.org/docs/LangRef.html
http://blog.csdn.net/banyao2006/article/details/7045216(中文版)
轉載:http://blog.163.com/newcountry@126/blog/static/164768490201302847113/
入門指導裏介紹如何使用llvm的tool來進行編譯html
http://llvm.org/docs/GettingStarted.html#id34前端
LLVM筆記(八) 關於pass的摘錄
http://blog.163.com/newcountry@126/blog/static/164768490201329102423113/編程
LLVM筆記(九) 關於pass的摘錄2
http://blog.163.com/newcountry@126/blog/static/164768490201321195754879/後端
llvm筆記(十):IR
http://blog.163.com/newcountry@126/blog/static/1647684902013213113342194/數組
一個現代編譯器的主要工做流程:
源代碼 (source code) →
預處理器 (preprocessor) → 編譯器 (compiler) →
彙編程序 (assembler) →
目標代碼 (object code) →
連接器 (Linker) → 可執行程序 (executables)
源代碼通常爲高級語言 (High-level language)
目標語言(Target language)則是
彙編語言或目標機器的
目標代碼(Object code),有時也稱做機器代碼(Machine code)。
編譯器能夠生成用來在與編譯器自己所在的計算機和
操做系統(平臺)相同的環境下運行的
目標代碼,這種編譯器又叫作「本地」編譯器。另外,編譯器也能夠生成用來在其它平臺上運行的
目標代碼,這種編譯器又叫作
交叉編譯器。
預處理器(preprocessor)做用是經過代入預約義等程序段將源程序補充完整。
編譯器後端(backend)編譯器後端主要負責分析,優化中間代碼(Intermediate representation)以及生成機器代碼(Code Generation)。
通常說來全部的
編譯器分析,優化,變型均可以分紅兩大類: 函數內(intraprocedural)仍是函數之間(interprocedural)進行。很明顯,函數間的分析,優化更準確,但須要更長的時間來完成。(interprocedural很重要,是我此次看的point)
編譯器分析(compiler analysis)
編譯器分析的對象是前端生成並傳遞過來的
中間代碼,現代的優化型編譯器(optimizing compiler)經常用好幾種層次的
中間代碼來表示程序,高層的中間代碼(high level IR)接近輸入的
源代碼的格式,與輸入語言相關(language dependent),包含更多的全局性的信息,和源代碼的結構;中層的中間代碼(middle level IR)與輸入語言無關,低層的中間代碼(Low level IR)與
機器語言相似。 不一樣的分析,優化發生在最適合的那一層
中間代碼上。
常見的編譯分析有
函數調用樹(call tree),控制
流程圖(Control flow graph),以及在此基礎上的
變量定義-使用,使用-定義鏈(define-use/use-define or u-d/d-u chain),
變量別名分析(alias analysis),
指針分析(pointer analysis),數據依賴分析(data dependence analysis)等等。
上述的
程序分析結果是編譯器優化(compiler optimization)和程序變形(compiler transformation)的前提條件。常見的優化和變新有:函數內嵌(inlining),無用代碼刪除(Dead code elimination),標準化
循環結構(loop normalization),循環體展開(loop unrolling),循環體合併,分裂(loop fusion,loop fission),
數組填充(array padding),等等。 優化和變形的目標是減小代碼的長度,提升內存(memory),緩存(cache)的
使用率,減小讀寫磁盤,訪問
網絡數據的頻率。更高級的優化甚至能夠把序列化的代碼(serial code)變成並行運算,多線程的代碼(parallelized,
multi-threadedcode)。
編譯器工做方式:
首先編譯
編譯器緩存
器進行
語法分析,也就是要把那些字符串分離出來。
最後生成的是目標文件,也稱爲obj文件。
有些時候須要把多個文件產生的
目標文件進行連接,產生最後的代碼。這一過程稱爲交叉連接。