首先介紹一下什麼是編譯器。
編譯器就是將“一種語言(通常為高級語言)”翻譯為“另一種語言(通常為低級語言)”的程序。一個現代編譯器的主要工作流程:源代碼 (source
code) → 預處理器 (preprocessor) → 編譯器 (compiler)
→ 目標代碼(object code) → 連接器(Linker)
→ 可執行程序(executables)。高級計算機語言便於人編寫,閱讀交流,維護。機器語言是計算機能直接解讀、運行的。編譯器將匯編或高級計算機語言源程序(Source
program)作為輸入,翻譯成目標語言(Target language)機器代碼的等價程序。源代碼一般為高級語言 (High-level language), 如Pascal、C、C++、Java、漢語編程等或匯編語言,而目標則是機器語言的目標代碼(Object
code),有時也稱作機器代碼(Machine code)。因此編譯器就相當於是一個中間翻譯工具,將高級語言翻譯成計算機所能識別的計算機低級語言。
在工程Target中可以看到XCode6中默認編譯器選項是compiler 6.0
而蘋果Xcode的編譯器一共經歷了GCC4.2、LLVM
GCC 4.2、LLVM compliler 三個階段的更新發展。
1:GCC
GCC(GNU
Compiler Collection,GNU編譯器套裝),是一套由
GNU 開發的編程語言編譯器。它是一套以 GPL 及 LGPL 許可證所發行的自由軟件,也是
GNU計劃的關鍵部分,亦是自由的類Unix及蘋果電腦 Mac OS X 操作系統的標准編譯器。GCC
原名為 GNU C 語言編譯器,因為它原本只能處理 C語言。GCC 很快地擴展,變得可處理 C++。之後也變得可處理 Fortran、Pascal、Objective-C、Java,
以及 Ada與其他語言。
2:LLVM
LLVM 是
Low Level Virtual Machine 的簡稱,這個庫提供了與編譯器相關的支持,能夠進行程序語言的編譯期優化、鏈接優化、在線編譯優化、代碼生成。簡而言之,可以作為多種語言編譯器的後台來使用。
Apple(包括中後期的NeXT)
一直使用GCC作為官方的編譯器。GCC作為開源世界的編譯器標准一直做得不錯,但Apple對編譯工具會提出更高的要求。因此蘋果在GCC的基礎上有開發了LLVM GCC 編譯器,以支持自己更高的要求。
3:LLVM
compliler(clang)
Apple吸收編譯器高材生Chris
Lattner(2000年,本科畢業的Chris Lattner像中國多數大學生一樣,按部就班地考了GRE,最終前往UIUC(伊利諾伊大學厄巴納香槟分校),開始了艱苦讀計算機碩士和博士的生涯。在這階段,他不僅周游美國各大景點,更是努力學習科學文化知識,翻爛了“龍書”(《Compilers:
Principles, Techniques, and Tools》),成了GPA牛人【注:最終學分積4.0滿分】,以及不斷地研究探索關於編譯器的未知領域,發表了一篇又一篇的論文,是中國傳統觀念裡的“三好學生”。他的碩士畢業論文提出了一套完整的在編譯時、鏈接時、運行時甚至是在閒置時優化程序的編譯思想,直接奠定了LLVM的基礎。LLVM在他念博士時更加成熟,使用GCC作為前端來對用戶程序進行語義分析產生IF(Intermidiate
Format),然後LLVM使用分析結果完成代碼優化和生成。這項研究讓他在2005年畢業時,成為小有名氣的編譯器專家,他也因此早早地被Apple相中,成為其編譯器項目的骨干)的目的要比改進GCC代碼優化宏大得多——GCC系統龐大而笨重,而Apple大量使用的Objective-C在GCC中優先級很低。此外GCC作為一個純粹的編譯系統,與IDE配合得很差。加之許可證方面的要求,Apple無法使用LLVM 繼續改進GCC的代碼質量。於是,Apple決定從零開始寫
C、C++、Objective-C語言的前端 Clang,完全替代掉GCC。正像名字所寫的那樣,Clang只支持C,C++和Objective-C三種C家族語言。這就是clang。
下面這張圖將展示GCC、LLVM-GCC、LLVM
Compiler三個編譯的關系,由上到下演變進化
那麼三個編譯選項,要選擇哪一個呢?蘋果默認是LLVM
Compiler,用它就足夠開發需要,GCC4.2不建議用,因為蘋果已經不維護它了,而LLVM-GCC不確定是否還在維護,所以最安全的是使用LLVM
Compiler。