Compiler编译过程
Compiler編譯過程
1.原理
編譯器可以生成用來在與編譯器本身所在的計算機和操作系統(平臺)相同的環境下運行的目標代碼,這種編譯器又叫做“本地”編譯器。另外,編譯器也可以生成用來在其它平臺上運行的目標代碼,這種編譯器又叫做交叉編譯器。交叉編譯器在生成新的硬件平臺時非常有用?!霸创a到源碼編譯器”是指用一種高階語言作為輸入,輸出也是高階語言的編譯器。例如: 自動并行化編譯器經常采用一種高階語言作為輸入,轉換其中的代碼,并用并行代碼注釋對它進行注釋(如OpenMP)或者用語言構造進行注釋(如FORTRAN的DOALL指令)。
預處理器(preprocessor)
作用是通過代入預定義等程序段將源程序補充完整。
編譯器前端(frontend)
前端主要負責解析(parse)輸入的源代碼,由詞法分析器和語法分析器協同工作。詞法分析器負責把源代碼中的‘單詞’(Token)找出來,語法分析器把這些分散的單詞按預先定義好的語法組裝成有意義的表達式,語句 ,函數等等。 例如“a = b + c;”前端詞法分析器看到的是“a, =, b , +, c;”,語法分析器按定義的語法,先把他們組裝成表達式“b + c”,再組裝成“a = b + c”的語句。 前端還負責語義(semantic checking)的檢查,例如檢測參與運算的變量是否是同一類型的,簡單的錯誤處理。最終的結果常常是一個抽象的語法樹(abstract syntax tree,或 AST),這樣后端可以在此基礎上進一步優化和處理。
編譯器后端(backend)
編譯器后端主要負責分析,優化中間代碼(Intermediate representation)以及生成機器代碼(Code Generation)。
一般說來所有的編譯器分析,優化,變型都可以分成兩大類:函數內(intraprocedural)還是函數之間(interprocedural)進行。很明顯,函數間的分析,優化更準確,但需要更長的時間來完成。
2. 嵌入式交叉編譯過程
嵌入式軟件開發所采用的編譯為交叉編譯。所謂交叉編譯就是在一個平臺上生成可以在另一個平臺上執行的代碼。因此,不同的CPU需要有相應的編譯器,而交叉編譯就如同翻譯一樣,把相同的程序代碼翻譯稱不同的CPU對應語言。要注意的是,編譯器本身也是程序,也要在與之對應的某一個CPU平臺上運行。
交叉編譯環境
一般把進行交叉編譯的主機稱為宿主機,也就是普通的通用計算機,而把程序實際的運行環境稱為目標機,也就是嵌入式系統環境。由于一般通用計算機擁有非常豐富的系統資源、使用方便的集成開發環境和調試工具等,而嵌入式系統的系統資源非常緊缺,沒有相關的編譯工具,因此,嵌入式系統的開發需要借助宿主機(通用計算機)來編譯出目標機的可執行代碼。
由于編譯的過程包括編譯、鏈接等幾個階段,因此,嵌入式的交叉編譯也包括交叉編譯、交叉鏈接等過程,通常ARM的交叉編譯器為arm-elf-gcc,交叉鏈接器為arm-elf-ld。
交叉編譯過程
3. C/C++程序編譯過程
簡單來說,整個過程分為四個階段:預處理(Pre-Processing)、編譯(Compilation)、匯編(Assembling)、鏈接(Linking)。
-
純C語言的編譯鏈接過程
把編寫的一個c程序(源代碼)轉換成可以在硬件上運行的程序(可執行代碼),需要進行編譯和鏈接。編譯就是把文本形式源代碼翻譯為機器語言形式的目標文件的過程。鏈接是把目標文件、操作系統的啟動代碼和用到的庫文件進行組織,形成最終生成可執行代碼的過程。
-
gcc編譯
gcc編譯分為四部
第一步,預編譯,將程序中的宏定義等預編譯
第二步,編譯,將*.h,.c等文件編譯成為.o文件
第三步,匯編
第四步,連接,將*.o文件連接庫,生成可執行文件。
例如,
設有a.c,b.c,c.c
gcc -c a.c
gcc -c b.c
gcc -c c.c
(這樣生成a.o b.o c.o)
gcc -o main a.o b.o c.o
(這樣就生成名為:main的執行檔了)
./main
就可以執行 -
示例程序
vi hello.c并寫入程序
預處理
gcc -E hello.c -o hello.i
預編主要前面處理帶“#”的指令,如#include、#define等,還要刪除注釋,添加行號和文件名標識
編譯
gcc -S hello.i -o hello.s
編譯過程是把預處理完的文件進行一系列的詞法分析、語法分析、語義分析及優化后生產相應的匯編代碼文件
匯編
gcc -c hello.s -o hello.o
將代碼轉換成機器可以執行的指令
連接
連接是一個復雜的過程,使用ld指令
ld -static crt1.o crti.o crtbeginT.o hello.o -start -group -lgcc -lgcc_eh -lc -end-group crtend.o crtn.o
連接的過程包括按序疊加、相似段合并、符號地址的確定、符號解析與重定位、指令修正、全局構造與解析等等
運行程序
./hello 運行程序,可以看到結構
總結
以上是生活随笔為你收集整理的Compiler编译过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 光学传输与摄像头光学技术
- 下一篇: 3D NAND性能