GCC
Xcode 最早的編譯器(Xcode 3.0及之前版本)不太智能获讳,因?yàn)楫?dāng)時(shí)Xcode 當(dāng)前的編譯器是GCC窖逗,盡管GCC是一個(gè)相對較好的編譯器搞旭,但是他跟IDE 之間的匹配性并不是太好榕莺。通常普气,編譯器分為編譯器前端和編譯器后端谜疤。編譯器前端主要負(fù)責(zé)的是展開預(yù)處理器宏定義 并將源代碼轉(zhuǎn)化為中間代碼。編譯器后端負(fù)責(zé)生成并優(yōu)化機(jī)器代碼现诀。GCC實(shí)質(zhì)上是一個(gè)后端編譯器夷磕,他負(fù)責(zé)將源代碼編譯生成二進(jìn)制代碼。GCC 主要用來編譯代碼仔沿,而不是解析代碼坐桩。這意味著蘋果必須編寫自己的解析器來為你提供調(diào)試功能。另外封锉,GCC 使用的是 GPL 許可協(xié)議绵跷,這使得蘋果不能直使用GCC,除非蘋果將Xcode 的許可協(xié)議更改為GPL成福。由于蘋果的解析器和 GCC 的基準(zhǔn)代碼不同碾局,GCC 和 Xcode 之間經(jīng)常會出現(xiàn)一些不一致。
LLVM-Clang
由于上面的這個(gè)問題奴艾,蘋果在Xcode 4.2 之后 同iOS 5 一起發(fā)布净当,默認(rèn)的編譯器就是 LLVM 3.0 了。雖然 LLVM 的代碼生成效率不如 GCC蕴潦, 但是 LLVM 具有更好的模塊化和可擴(kuò)展性像啼,編譯速度也是GCC的兩倍以上,有許多為LLVM 而開發(fā)的編譯器前端潭苞,其中比較突出就是蘋果的C language(即 Clang)忽冻。Clang 支持增量編譯。開始使用 Xcode 4 的時(shí)候此疹,你就會發(fā)現(xiàn)這個(gè)功能比較實(shí)用僧诚。另外,clang 的模塊化使得它得以非常好地支持代碼重構(gòu)以及 Edit All in scope 等功能蝗碎。也因此 LLVM 和 IDE 的深度集成使 Xcode 在編譯器遇到錯誤的時(shí)候可以給iOS developer 提供 Fix-it 的功能湖笨。
如下圖 所示:
同時(shí)蘋果從 GCC 切換到 LLVM 的另一個(gè)目的是對 Objective-C 語言擁有更大的控制權(quán)。蘋果通過添加對字面量大支持使得 Objectvie-C 更加簡潔衍菱,也許只有對編輯器擁有控制權(quán),蘋果才能對語言作出這種改變肩豁,同樣也是 LLVM 給了蘋果 這種改變 Objective-C 語言的能力脊串。