GCC
GCC(GNU Compiler Collection,GNU編譯器套裝),是一套由 GNU 開發(fā)的編程語言編譯器。它是一套以 GPL 及 LGPL 許可證所發(fā)行的自由軟件,也是 GNU計劃的關(guān)鍵部分,亦是自由的類Unix及蘋果電腦 Mac OS X 操作系統(tǒng)的標(biāo)準(zhǔn)編譯器。
GCC 原名為 GNU C 語言編譯器,因為它原本只能處理 C語言。GCC 很快地擴展,變得可處理 C++。之后也變得可處理 Fortran、Pascal、Objective-C、Java, 以及 Ada與其他語言。
Clang
Clang 是一個 C++ 編寫、基于 LLVM、發(fā)布于 LLVM BSD 許可證下的 C/C++/Objective C/Objective C++ 編譯器,其目標(biāo)(之一)就是超越 GCC。
LLVM
LLVM 是 Low Level Virtual Machine 的簡稱,這個庫提供了與編譯器相關(guān)的支持,能夠進(jìn)行程序語言的編譯期優(yōu)化、鏈接優(yōu)化、在線編譯優(yōu)化、代碼生成。簡而言之,可以作為多種語言編譯器的后臺來使用。

本上都是三段式的,可以分為前端、優(yōu)化器和后端。前端負(fù)責(zé)解析源代碼,檢查語法錯誤,并將其翻譯為抽象的語法樹;優(yōu)化器對這一中間代碼進(jìn)行優(yōu)化,試圖使代碼更高效;后端則負(fù)責(zé)將優(yōu)化器優(yōu)化后的中間代碼轉(zhuǎn)換為目標(biāo)機器的代碼,這一過程后端會最大化的利用目標(biāo)機器的特殊指令,以提高代碼的性能?;谶@個認(rèn)知,我們可以認(rèn)為 LLVM 包括了兩個概念:一個廣義的 LLVM 和一個狹義的 LLVM 。廣義的 LLVM 指的是一個完整的 LLVM 編譯器框架系統(tǒng),包括了前端、優(yōu)化器、后端、眾多的庫函數(shù)以及很多的模塊;而狹義的 LLVM 則是聚焦于編譯器后端功能的一系列模塊和庫,包括代碼優(yōu)化、代碼生成、JIT 等。
Clang歷史
Apple吸收Chris Lattner的目的要比改進(jìn)GCC代碼優(yōu)化宏大得多:
- GCC系統(tǒng)龐大而笨重
- 而Apple大量使用的Objective-C在GCC中優(yōu)先級很低。
- 此外GCC作為一個純粹的編譯系統(tǒng),與IDE配合得很差。
- 加之許可證方面的要求,Apple無法使用LLVM 繼續(xù)改進(jìn)GCC的代碼質(zhì)量。
于是,Apple決定從零開始寫 C、C++、Objective-C語言的前端 Clang,完全替代掉GCC。
正像名字所寫的那樣,Clang只支持C,C++和Objective-C三種C家族語言。
- 2007年開始開發(fā),C編譯器最早完成,
- 而由于Objective-C相對簡單,只是C語言的一個簡單擴展,很多情況下甚至可以等價地改寫為C語言對Objective-C運行庫的函數(shù)調(diào)用,因此在2009年時,已經(jīng)完全可以用于生產(chǎn)環(huán)境。
- C++的支持也熱火朝天地進(jìn)行著。
GCC、LLVM-GCC、LLVM Compiler這三個編譯選項的不同點

對比
Clang特性
- 快:通過編譯 OS X 上幾乎包含了所有 C 頭文件的 carbon.h 的測試,包括預(yù)處理 (Preprocess),語法 (lex),解析 (parse),語義分析 (Semantic Analysis),抽象語法樹生成 (Abstract Syntax Tree) 的時間,Clang 是 Apple GCC 4.0 的 2.5x 快。(2007-7-25)
- 內(nèi)存占用小:Clang 內(nèi)存占用是源碼的 130%,Apple GCC 則超過 10x。
- 診斷信息可讀性強:錯誤的語法不但有源碼提示,還會在錯誤的調(diào)用和相關(guān)上下文的下方有~~~~~和^的提示,相比之下 GCC 的提示很天書。
- GCC 兼容性。
- 設(shè)計清晰簡單,容易理解,易于擴展增強。與代碼基礎(chǔ)古老的 GCC 相比,學(xué)習(xí)曲線平緩。
- 基于庫的模塊化設(shè)計,易于 IDE 集成及其他用途的重用。由于歷史原因,GCC 是一個單一的可執(zhí)行程序編譯器,其內(nèi)部完成了從預(yù)處理到最后代碼生成的全部過程,中間諸多信息都無法被其他程序重用。Clang 將編譯過程分成彼此分離的幾個階段,AST 信息可序列化。通過庫的支持,程序能夠獲取到 AST 級別的信息,將大大增強對于代碼的操控能力。對于 IDE 而言,代碼補全、重構(gòu)是重要的功能,然而如果沒有底層的支持,只使用 tags 分析或是正則表達(dá)式匹配是很難達(dá)成的。
GCC 優(yōu)勢
- 支持 JAVA/ADA/FORTRAN
- GCC 支持更多平臺
- GCC 更流行,廣泛使用,支持完備
- GCC 基于 C,不需要 C++ 編譯器即可編譯
make
make工具相當(dāng)于一個智能的批處理工具,本身沒有編譯和鏈接的功能,而是用類似于批處理的方式通過調(diào)用makefile文件中用戶指定的命令來進(jìn)行編譯和鏈接。
**而makefile又是什么? **
它里面記錄了用戶將要執(zhí)行的一系列命令,make根據(jù)makefile中的命令對相應(yīng)的源文件進(jìn)行編譯和鏈接的。
makefile中可能就有類似的一下命令:gcc -o test.c。
makefile文件在github源碼安裝程序中很常見,你下載了一個源碼包,通常在readme中會有這樣的一句:
$ make all
$ make install # root required
make all即編譯所有,當(dāng)然這個源碼包中必須有makefile文件才行,執(zhí)行make all這個命令后make會根據(jù)makefile中的命令進(jìn)行編譯。當(dāng)然這個是“別人家”的源碼包,這個通常都給你寫好了,但是如果你自己要編譯很多源文件的時候,也是要自己寫嗎?