compiler 學習

一款強大的編譯器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)做用是經過代入預約義等程序段源程序補充完整。

 

編譯器前端(frontend)前端主要負責解析(parse)輸入的源代碼,由語法分析器和語意分析器協同工做

 

編譯器後端(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文件。
再通過 連接器的連接就能夠生成最後的 可執行代碼了。
有些時候須要把多個文件產生的 目標文件進行連接,產生最後的代碼。這一過程稱爲交叉連接。
相關文章
相關標籤/搜索