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

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