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 很快地擴(kuò)展,變得可處理 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)機(jī)器的代碼幔虏,這一過程后端會最大化的利用目標(biāo)機(jī)器的特殊指令纺念,以提高代碼的性能∠肜ǎ基于這個認(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語言的一個簡單擴(kuò)展布隔,很多情況下甚至可以等價地改寫為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。
- 診斷信息可讀性強(qiáng):錯誤的語法不但有源碼提示哭靖,還會在錯誤的調(diào)用和相關(guān)上下文的下方有~~~~~和^的提示具垫,相比之下 GCC 的提示很天書。
- GCC 兼容性试幽。
- 設(shè)計清晰簡單筝蚕,容易理解,易于擴(kuò)展增強(qiáng)铺坞。與代碼基礎(chǔ)古老的 GCC 相比起宽,學(xué)習(xí)曲線平緩。
- 基于庫的模塊化設(shè)計济榨,易于 IDE 集成及其他用途的重用坯沪。由于歷史原因,GCC 是一個單一的可執(zhí)行程序編譯器擒滑,其內(nèi)部完成了從預(yù)處理到最后代碼生成的全部過程腐晾,中間諸多信息都無法被其他程序重用。Clang 將編譯過程分成彼此分離的幾個階段丐一,AST 信息可序列化藻糖。通過庫的支持,程序能夠獲取到 AST 級別的信息库车,將大大增強(qiáng)對于代碼的操控能力巨柒。對于 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)然這個是“別人家”的源碼包,這個通常都給你寫好了诫咱,但是如果你自己要編譯很多源文件的時候笙隙,也是要自己寫嗎?