程序的基本流程如圖:程序員
1. 預處理編程
預處理至關於根據預處理指令組裝新的C/C++程序。通過預處理,會產生一個沒有宏定義,沒有條件編譯指令,沒有特殊符號的輸出文件,這個文件的含義同本來的文件無異,只是內容上有所不一樣。函數
讀取C/C++源程序,對其中的僞指令(以#開頭的指令)進行處理優化
①將全部的「#define」刪除,而且展開全部的宏定義編碼
②處理全部的條件編譯指令,如:「#if」、「#ifdef」、「#elif」、「#else」、「endif」等。這些僞指令的引入使得程序員能夠經過定義不一樣的宏來決定編譯程序對哪些代碼進行處理。預編譯程序將根據有關的文件,將那些沒必要要的代碼過濾掉。 spa
③處理「#include」預編譯指令,將被包含的文件插入到該預編譯指令的位置。操作系統
(注意:這個過程多是遞歸進行的,也就是說被包含的文件可能還包含其餘文件)翻譯
刪除全部的註釋調試
添加行號和文件名標識。blog
以便於編譯時編譯器產生調試用的行號信息及用於編譯時產生的編譯錯誤或警告時可以顯示行號
保留全部的#pragma編譯器指令
2. 編譯
將預處理完的文件進行一系列詞法分析、語法分析、語義分析及優化後,產生相應的彙編代碼文件。
3. 彙編
將編譯完的彙編代碼文件翻譯成機器指令,並生成可重定位目標程序的.o文件,該文件爲二進制文件,字節編碼是機器指令。
彙編器是將彙編代碼轉變成機器能夠執行的指令,每個彙編語句幾乎都對應一條機器指令。因此彙編器的彙編過程相對於編譯器來說比較簡單,它沒有複雜的語法,也沒有語義,也不須要作指令優化,只是根據彙編指令和機器指令的對照表一一翻譯便可。
4. 連接
經過連接器將一個個目標文件(或許還會有庫文件)連接在一塊兒生成一個完整的可執行程序。
由彙編程序生成的目標文件並不能當即就被執行,其中可能還有許多沒有解決的問題。
例如,某個源文件中的函數可能引用了另外一個源文件中定義的某個符號(如變量或者函數調用等);在程序中可能調用了某個庫文件中的函數,等等。全部的這些問題,都須要經連接程序的處理方能得以解決。
連接程序的主要工做就是將有關的目標文件彼此相鏈接,也就是將在一個文件中引用的符號同該符號在另一個文件中的定義鏈接起來,使得全部的這些目標文件成爲一個可以被操做系統裝入執行的統一總體。
至此,大體通過這幾個步驟,一個完整的可執行程序產生了。