預處理器,編譯器,彙編器,聯結器的概念和區別

2021-09-10 22:03:25 字數 1487 閱讀 6601

好記性不如爛筆頭,所以準備詳細的記錄一下這幾個東西的功能和區別,有例子為證。

參考部落格:

hello程式的生命週期是從乙個源程式(hello.c)(稱為高階c語言)開始,被其它程式轉化為一系列的低階機器語言指令,這些指令按照一種稱為可執行目標程式的格式打包好,以二進位制磁碟檔案的形式儲存。

例:unix>gcc -o hello hello.c可以實現原始檔向目標檔案的轉化,該過程由編譯程式完成。

拿乙個簡單的例子,例子叫做base.c,內容如下:

#include /*這是一條注釋*/

int main()

(1).預處理(cpp):預處理器不止一種,而c/c++的預處理器就是其中最低端的一種——詞法預處理器,主要是進行文字替換、巨集展開、刪除注釋這類簡單工作。

e.g. 所謂預處理,就是把程式中的巨集展開,把頭檔案的內容展開包含進來,預處理不會生成檔案,所以需要重定向

(2).編譯器(ccl):將文字檔案.i翻譯成文字檔案.s,得到組合語言程式(把高階語言翻譯為機器語言),該種語言程式中的每條語句都以一種標準的文字格式確切的描述了一條低階機器語言指令。

(3).彙編(as):將.s翻譯成機器語言指令,把這些指令打包成一種叫做可重定位目標程式的格式,並將結果儲存在目標檔案.o中(把組合語言翻譯成機器語言的過程)。

e.g.

(4).鏈結(ld):gcc會到系統預設的搜尋路徑」/usr/lib」下進行查詢,也就是鏈結到libc.so.6庫函式中去。 函式庫一般分為靜態庫和動態庫兩種。靜態庫是指編譯鏈結時,把庫檔案的**全部加入到可執行檔案中,因此生成的檔案比較大,但在執行時也就不再需要庫檔案了。其字尾名一般為」.a」。動態庫與之相反,在編譯鏈結時並沒有把庫檔案的**加入到可執行檔案中,而是在程式執行時由執行時鏈結檔案載入庫,這樣可以節省系統的開銷。動態庫一般字尾名為」.so」,如前面所述的libc.so.6就是動態庫。gcc在編譯時預設使用動態庫。

預處理器,編譯器,彙編器,聯結器

1.2程式被其它程式翻譯成不同的格式 hello程式的生命週期是從乙個源程式 hello.c 稱為高階c語言 開始,被其它程式轉化為一系列的低階機器語言指令,這些指令按照一種稱為可執行目標程式的格式打包好,以二進位制磁碟檔案的形式儲存。例 unix gcc o hello hello.c可以實現原始...

C 編譯器與聯結器區別

編譯 編譯器對源 進行編譯,是將以文字形式存在的源 翻譯為機器語言形式的目標檔案的過程。編譯單元 對於c 來說 每乙個cpp檔案就是乙個編譯單元。各個編譯單元之間是互相不可知的。編譯器就是把我們寫的原始檔翻譯成機器 聯結器以編譯器的輸出作為輸入,生成可執行檔案。因為編譯器的編譯單元只是單獨的每個cp...

構建自己的編譯器(八)彙編器之二

現在大致明白了是怎麼工作的了,它根據前向算的,獲取出乙個token之後就能判斷它到底屬於哪乙個句型,對於c語言的確是如此,但是對於我這個語言來說,emmm,貌似也差不多,它維護著乙個變數表,我完全可以用map實現,然後對於變數定義,真的不難。那麼彙編器實際上也不用做,其也是解析成組合語言然後放入虛擬...