編譯: 編譯程式讀取源程式(字元流),對之進行詞法和語法的分析,將高階語言指令轉換為功能等效的彙編**,再由匯程式設計序轉換為機器語言,並且按照作業系統對可執行檔案格式的要求鏈結生成可執行程式。
流程:c源程式標頭檔案 --> 預編譯處理(cpp) --> 編譯程式本身 --> 優化程式 --> 匯程式設計序 --> 鏈結程式 -–> 可執行檔案
1. 編譯預處理
讀取c語言源程式,對其中的偽指令(以#開頭的指令)和特殊符號進行處理。
偽指令主要包括以下四個方面:
(1)巨集定義指令
(2)條件編譯指令,如#ifdef, #ifndef, #else, #elif, #endif
(3)標頭檔案包含指令,如#include 「filename」 或者 #include 等。
(4)特殊符號,預編譯程式可以識別一些特殊的符號。
預編譯程式所完成的基本上是對源程式的「替代」工作。經過此種替代,生成乙個沒有巨集定義、沒有條件編譯指令、沒有特殊符號的輸出檔案。這個檔案的含義同沒有經過預處理的原始檔是相同的,但內容有所不同。下一步,此輸出檔案將作為編譯程式的輸出而被翻譯成為機器指令。
2. 編譯階段
經過預編譯得到的輸出檔案中,將只有常量,如數字、字串、變數的定義,以及c語言的關鍵字,如main, if, else, for, while, , +, -, *, \, 等等。預編譯程式所要做的工作就是通過詞法分析和語法分析,在確認所有的指令都符合語法規則之後,將其翻譯成等價的中間**表示或彙編**。
3. 優化階段
優化處理是編譯系統中一項比較艱深的技術。它涉及到的問題不僅同編譯技術本身有關,而且同機器的硬體環境也有很大的關係。優化一部分是對中間**的優化。這種優化不依賴於具體的計算機。另一種優化則主要針對目標**的生成而進行的。
經過優化得到的彙編**必須經過匯程式設計序的彙編轉換成相應的機器指令,方可能被機器執行。
4. 彙編過程
彙編過程實際上指把組合語言**翻譯成目標機器指令的過程。對於被翻譯系統處理的每乙個c語言源程式,都將最終經過這一處理而得到相應的目標檔案。目標檔案中所存放的也就是與源程式等效的目標的機器語言**。
5. 鏈結程式
由匯程式設計序生成的目標檔案並不能立即就被執行,其中可能還有許多沒有解決的問題。例如,某個原始檔中的函式可能引用了另乙個原始檔中定義的某個 符號(如變數或者函式呼叫等);在程式中可能呼叫了某個庫檔案中的函式,等等。所有的這些問題,都需要經鏈結程式的處理方能得以解決。
鏈結程式的主要工作就是將有關的目標檔案彼此相連線,也即將在乙個檔案中引用的符號同該符號在另外乙個檔案中的定義連線起來。
C語言的編譯過程
乙個源程式執行得到結果一般都要經過編譯和執行的過程,c語言的編譯和執行過程如下 編譯的過程 編譯的功能是將人們能看懂的高階語言,轉換成計算機能看懂的二進位制語言,可以分為下面的六個階段 乙個原始檔經過上述的6個過程即可轉化成目標 檔案,把高階語言轉化成機器語言。c語言編譯的完整過程如下圖 1 編譯預...
C語言的編譯過程
編譯,編譯程式讀取源程式 字元流 對之進行詞法和語法的分析,將高階語言指令轉換為功能等效的彙編 再由匯程式設計序轉換為機器語言,並且按照作業系統對可執行檔案格式的要求鏈結生成可執行程式。c源程式標頭檔案 預編譯處理 cpp 編譯程式本身 優化程式 匯程式設計序 鏈結程式 可執行檔案 1.編譯預處理 ...
c語言的編譯過程
先感謝這篇文章 介紹了ld的庫檔案怎麼引用的 如下 test.c include void mian 今天看了下編譯的過程,gcc o test text.c 是一步到位的做法 要像一步一步做出來 了解怎麼編譯的,是這樣的 root localhost workspace cpp test.c te...