從用C語言寫源代碼,然后經過編譯器、連接器到最終可執行程序的流程圖大致如下圖所示。
從圖中我們可以清晰地看到C語言編譯器的大致流程。
首先,我們先用C語言把源代碼寫好,然后交給C語言編譯器。C語言編譯器內部分為前端和后端。
編譯器前端
前端負責將C語言代碼進行詞法和語法上的解析,然后可以生成中間代碼。
中間代碼這部分不是必須的,但是它能夠為程序的跨平台移植帶來諸多好處。
比如,同樣的一份C語言源代碼在一台計算機上編譯完之后,生成一套中間代碼。然后針對不同的目標平台(比如要將這一套代碼分別編譯成 ARM 處理器的二進制機器碼、MIPS 處理器的二進制機器碼以及 x86 處理器的二進制機器碼),只需要編寫相應目標平台的編譯器后端即可。
所以,這么做就可以把編譯器的前端與后端剝離開來(這在軟件工程上又可稱為解耦合),不同處理器廠商可以針對自家的處理器特性,對中間代碼生成到目標二進制代碼的過程再度進行優化。
編譯器后端
接下來,由C語言編譯器后端生成源文件相應的目標文件。
目標文件在 Windows 系統上往往是.obj文件,而在 Unix/Linux 系統上往往是.o文件,C語言的源文件在所有平台上都統一用.c文件表示。
鏈接器
最后,對於各個獨立的目標文件,通過連接器將它們合並成一個最終可執行文件。
連接器與C語言編譯器是完全獨立的。所以,只要最終目標代碼的 ABI(應用程序二進制接口)一致,我們可以把各個編譯器生成的目標代碼都放在一起,最后連接生成一個可執行文件。比如:
✿ 有些源代碼可用 GCC 編譯;
✿ 有些使用 Clang 編譯;
還有些匯編語言源文件可直接通過匯編器生成目標代碼。
最后將所有這些生成出來的目標代碼連接為可執行文件。最終用戶可以在當前的操作系統上加載可執行文件進行執行。操作系統利用加載器將可執行文件中相關的機器碼存放到內存中來執行應用程序。
不管你是轉行也好,初學也罷,進階也可,如果你想學編程,進階程序員~
【值得關注】我的 編程學習交流俱樂部 !【點擊進入】
C語言入門資料:
C語言必讀書籍:
