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

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