我們?cè)诔绦蚓幾g時(shí)會(huì)經(jīng)歷 預(yù)編譯---編譯---匯編---鏈接 這四個(gè)階段。
在高級(jí)語言中這些步驟不易察覺,下面是幾個(gè)階段要處理的內(nèi)容:
預(yù)編譯 :此過程主要處理源代碼中以#開頭的預(yù)編譯指令,如 #if ,#include,#define等
?1.將所有的#define刪除,并且展開所有的宏定義。
?2.處理所有條件預(yù)編譯指令,比如:#if ,#endif,#ifdef等
?3.處理#include預(yù)編譯指令,將被包含的文件插入到此指令的位置。注意:這個(gè)過程是遞歸調(diào)用的,也就是說這個(gè)文件 也可能包含其它文件。
?4.刪除所有的注釋,如://,/**/等
?5.添加行號(hào)和文件名標(biāo)識(shí)名,以便編譯器產(chǎn)生調(diào)試用的行號(hào)信息及用于編譯時(shí)產(chǎn)生的編譯錯(cuò)誤和警告時(shí)能顯示它的行號(hào)。
?6.保留所有#pragma編譯器指令,因編譯器要使用它們。
經(jīng)過預(yù)編譯后的文件不包含任何宏定義,因?yàn)樗械暮暌颜归_,并且包含的文件也被包含到產(chǎn)生的文件中。
?
編譯 :編譯的過程就是把預(yù)編譯后的文件進(jìn)行一些詞法分析、語義分析、及優(yōu)化后產(chǎn)生的匯編文件。這個(gè)過程就是我們所說的整個(gè)程序構(gòu)建的核心部分,也是最復(fù)雜的部分之一?,F(xiàn)在GCC把預(yù)編譯和編譯合成一個(gè)步驟。
?
匯編 :此過程是把匯編代碼轉(zhuǎn)變成機(jī)器碼,因?yàn)槊恳粋€(gè)匯編語句幾乎對(duì)應(yīng)一條機(jī)器指令。所以匯編器的匯編過程相對(duì)于編譯器來說比較簡單,沒有復(fù)雜的語法,也沒有語義,也沒有優(yōu)化,只是根據(jù)匯編碼和機(jī)器指令的對(duì)照表一一翻譯就可以了。
?
鏈接 :此過程讓人非常費(fèi)解,為什么匯編器不一次性產(chǎn)生可執(zhí)行的輸出文件呢而產(chǎn)生許多目標(biāo)文件?鏈接的過程到底包含了什么內(nèi)容?為什么要鏈接?
???? 編譯器就是將高級(jí)語言編譯成機(jī)器語言的一個(gè)工具。編譯的過程一般是:掃描--語法分析--語義分析--源代碼優(yōu)化--代碼生成--目標(biāo)碼優(yōu)化。 我們?cè)诋a(chǎn)生大的文件時(shí),會(huì)產(chǎn)生多個(gè)模塊的文件,這些文件通過接口相互引用。 如:我們A模塊要調(diào)用B模塊的一個(gè)動(dòng)態(tài)數(shù)組或dll中的函數(shù),在編譯器A并不知道B中數(shù)組或函數(shù)的地址,如果這時(shí)就匯編中一個(gè)執(zhí)行文件會(huì)讀取內(nèi)存出錯(cuò)。而只有在運(yùn)行時(shí)即運(yùn)行庫中才能產(chǎn)生B中數(shù)組或函數(shù)的地址,這時(shí)A才能調(diào)用,所以這一步是在鏈接時(shí)完成的。
???? 鏈接過程也把各模塊“拼接”成一個(gè)可執(zhí)行文件,所以鏈接過程變的十分重要和突出。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
