目前程序員開發(fā)中基本都在使用高級語言,比如OC、Android、Java等。使用這些高級語言開發(fā)的程序,想要在計算機上順利執(zhí)行,都必須經(jīng)歷編譯過程。 我們知道,計算機能夠識別的只有0和1,被稱為“大腦”的CPU,就是不斷地從內(nèi)存中讀入0和1而不知疲倦的工作著。
在一定程度上說,正是通過編譯工具架起的高級語言到二進制語言的橋梁,才不斷涌現(xiàn)出越來越多的高級語言武器庫,供程序員在軟件的世界里縱橫馳騁、大殺四方。對其機制的理解,能夠讓一個程序員撥開不同高級語言表面差異的迷霧,找到它們背后共同的淵源。
一個程序的編譯過程,可以分為如下幾個階段:

1 以中間代碼為界,編譯器分為前端(front-end)和后端(back-end);
2 中間代碼是程序的通用表示,屏蔽了不同目標機器平臺的差異;有了中間代碼,編譯器獨立為前端和后端兩個模塊,有助于分開優(yōu)化;
3 前端將源程序作為一個字符串作為輸入流,先經(jīng)詞法分析(使用正則實現(xiàn)),識別變量、字符串/整型/浮點型常量、函數(shù)、運算符和關(guān)鍵字等標識,解析為一個個 token 流。然后語法分析(上下文無關(guān)語法表示,自底向上分析,LR(1)分析器)對輸入的 token 流進行語法有效性檢查,將符合規(guī)則的語法,轉(zhuǎn)變?yōu)橹虚g代碼進行表示。
4 中間代碼根據(jù)選定的平臺架構(gòu)(CPU指令), 轉(zhuǎn)變?yōu)樽罱K的目標代碼(二進制表示)。將不同源程序轉(zhuǎn)變的目標代碼進行鏈接,最終成為在選定平臺上可執(zhí)行的目標程序。
作為 iOS 的開發(fā)者,使用的編譯工具是 LLVM,相比它的前輩 GCC有了大幅的性能和實現(xiàn)優(yōu)化。clang 是 LLVM 的前端,用于生成中間代碼。lldb 是 LLVM 的調(diào)試器,類似 GCC 的 gdb。