目錄
- 1 C程序的執行流程
- 2 翻譯環境
- 2.1 預編譯
- 2.2 編譯
- 2.2.1 詞法分析
- 2.2.2 語法分析
- 2.2.3 語法分析
- 2.3 匯編
- 2.4 鏈接
1 C程序的執行流程
用戶編寫好的C程序不能直接被計算機識別并執行,在執行前,要先將源文件和頭文件進行編譯,生成目標文件,再將目標文件與鏈接庫進行鏈接,生成最終的可執行程序,再由計算機執行
其中,將源代碼轉換成可執行的機器指令的過程被稱為 翻譯環境
執行代碼的過程被稱為 執行環境
在這里,主要說明翻譯環境所做的事情
2 翻譯環境
翻譯環境主要有 編譯和鏈接 兩個處理過程
編譯的過程還可以拆分為 預編譯,編譯,匯編 三個小的過程
因此,翻譯環境的處理過程為 預編譯,編譯,匯編,鏈接
2.1 預編譯
預編譯階段所做的事情包括:
- 在代碼中,將 #define 定義的常量用它的值進行替換
- 將頭文件引入至 #include 的位置處
- 處理條件編譯指令,比如:#if,#ifdef,#elif等
- 刪除程序內的所有注釋
- 生成行號和文件名
- 保留 #pragma 的編譯器指令
預編譯階段結束后,會產生 .i 后綴的文件
2.2 編譯
編譯階段所做的事情包括 詞法分析,語法分析,語義分析及優化
編譯結束后,會產生 .s后綴的文件,它保存的都是匯編代碼
接下來,針對下面這句代碼來進行說明
array[index] = (index+4)*(2+6);
2.2.1 詞法分析
在詞法分析中要做的事情就是分析代碼,將代碼拆分成符號
上方的這句代碼,就可以做這樣子的拆分:
2.2.2 語法分析
在語法分析中要做的事情是分析詞法分析階段產生的符號,從而得到語法樹
上面這句代碼的語法樹如下:
2.2.3 語法分析
語法分析要做的事情就是根據語法樹來判斷正在分析的代碼是否有語法錯誤,因此,如果有語法錯誤,會在這個階段報錯
2.3 匯編
匯編階段要做的事情就是將 編譯階段產生的 .s后綴文件進行解析,生成 .o/.obj 后綴的目標文件,在目標文件內,保存了機器指令,機器指令為計算機可以識別并執行的指令
2.4 鏈接
每一個源文件,在經過了 預編譯,編譯,匯編 的過程后,都會生成 .o/.obj 后綴的目標文件,在鏈接的階段,就會將這些目標文件鏈接在一起,生成可執行程序
鏈接主要有 空間分配,符號決議,重定位 這些過程