將乙個字尾為.c的原始檔轉換為可執行檔案的過程就是編譯與鏈結。
對於編譯階段分為兩個階段:編譯、彙編;編譯階段又分為預處理階段、編譯優化階段。
預處理階段:預處理階段根據檔案中的預處理指令來對原始檔進行修改。主要包括:巨集定義指令、條件編譯指令、標頭檔案包含指令、特殊符號。因此預編譯階段就是對原始檔的替換過程,生成乙個沒有巨集定義、沒有條件編譯、沒有特殊符號的輸出檔案。
編譯優化階段:
經過預編譯階段的輸出檔案中只有常量,一般都是一些指令,編譯程式需要進行語法分析和詞法分析,確認所有指令都是符合語法規則之後,將其翻譯成等價的中間**和彙編**。
優化一部分是對中間**的優化,另一部分是針對目標**的生成進行的。對於前一種優化,主要是刪除公共表示式,迴圈優化,比如**外提(licm,將迴圈體中迴圈不變的語句或者表示式移出到迴圈體外面),強度消弱,複寫傳播等。後一種型別的優化同機器的硬體結構密切相關,最主要的是考慮是如何充分利用機器的各個硬體暫存器存放的有關變數的值,以減少對於記憶體的訪問次數(要知道記憶體資源對於計算機至關重要,控制好它可以大幅提高計算機的運算速度)。另外,如何根據機器硬體執行指令的特點(如流水線、risc、cisc、vliw等)而對指令進行一些調整使目標**比較短,執行的效率比較高。
彙編階段:
指把組合語言**翻譯成目標機器指令的過程。通常乙個目標檔案中至少有兩個段:**段和資料段。
**段:該段中所包含的主要是程式的指令。該段一般是可讀和可執行的,但一般卻不可寫。
資料段:主要存放程式中要用到的各種全域性變數或靜態的資料。一般資料段都是可讀,可寫,可執行的。
c語言編譯 鏈結過程
c語言的編譯鏈結過程 把c程式 源 轉換成可以在機器上執行的程式 可執行 需要進行編譯和鏈結的過程。1 編譯 主要包含兩個過程 1 預處理 巨集定義 檔案包含 條件編譯。在正式開始編譯之前根據預處理命令來修改原始檔的內容 2 編譯 優化 通過詞法分析和語法分析將指令翻譯成彙編 2 彙編 把組合語言 ...
c 編譯鏈結過程
llinux下編譯乙個c 程式的典型過程 1.編譯預處理 預編譯程式完成的工作,可以說成是對源程式的 替換 工作。經過這個過程,生成乙個沒有巨集定義 沒有條件編譯指令 沒有特殊符號的輸出檔案。2.編譯 優化階段 通過詞法分析 語法分析,在確認所有的指令都符合語法規則之後,將其翻譯成等價的中間 或彙編...
C語言的編譯鏈結過程
編寫的乙個c程式 源程式 轉換成可以在硬體上執行的程式 可執行程式 需要進行翻譯環境和執行環境。翻譯環境則包括兩大過程編譯和鏈結,經過編譯和鏈結過程便可形成可執行程式。一 編譯 將文字形式的源 翻譯成計算機認識的機器語言 編譯又分為預處理器處理 編譯 彙編。1.預處理器處理 主要是進行文字操作,包括...