天天看點

《C語言程式設計魔法書:基于C11标準》——1.5 用C語言建構一個可執行程式的流程

本節書摘來自華章計算機《c語言程式設計魔法書:基于c11标準》一書中的第1章,第1.5節,作者 陳轶,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

從用c語言寫源代碼,然後經過編譯器、連接配接器到最終可執行程式的流程圖大緻如圖1-2所示。

從圖1-2中我們可以清晰地看到c語言編譯器的大緻流程。首先,我們先用c語言把源代碼寫好,然後交給c語言編譯器。c語言編譯器内部分為前端和後端。前端負責将c語言代碼進行詞法和文法上的解析,然後可以生成中間代碼。中間代碼這部分不是必須的,但是它能夠為程式的跨平台移植帶來諸多好處。比如,同樣的一份c語言源代碼在一台計算機上編譯完之後,生成一套中間代碼。然後針對不同的目标平台(比如要将這一套代碼分别編譯成arm處理器的二進制機器碼、mips處理器的二進制機器碼以及x86處理器的二進制機器碼),隻需要編寫相應目标平台的編譯器後端即可。是以,這麼做就可以把編譯器的前端與後端剝離開來(這在軟體工程上又可稱為解耦合),不同處理器廠商可以針對自家的處理器特性,對中間代碼生成到目标二進制代碼的過程再度進行優化。接下來,由c語言編譯器後端生成源檔案相應的目标檔案。目标檔案在windows系統上往往是.obj檔案;而在unix/linux系統上往往是.o檔案。c語言的源檔案在所有平台上都統一用.c檔案表示。最後,對于各個獨立的目标檔案,通過連接配接器将它們合并成一個最終可執行檔案。連接配接器與c語言編譯器是完全獨立的。是以,隻要最終目标代碼的abi(應用程式二進制接口)一緻,我們可以把各個編譯器生成的目标代碼都放在一起,最後連接配接生成一個可執行檔案。比如,有些源代碼可用gcc編譯,有些使用clang編譯,還有些彙編語言源檔案可直接通過彙編器生成目标代碼,最後将所有這些生成出來的目标代碼連接配接為可執行檔案。最終使用者可以在目前的作業系統上加載可執行檔案進行執行。作業系統利用加載器将可執行檔案中相關的機器碼存放到記憶體中來執行應用程式。

《C語言程式設計魔法書:基于C11标準》——1.5 用C語言建構一個可執行程式的流程

繼續閱讀