GCC ,Clang 與 make,cmake 一覽

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)化宏大得多:

  1. GCC系統(tǒng)龐大而笨重
  2. 而Apple大量使用的Objective-C在GCC中優(yōu)先級很低。
  3. 此外GCC作為一個純粹的編譯系統(tǒng),與IDE配合得很差。
  4. 加之許可證方面的要求,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)然這個是“別人家”的源碼包,這個通常都給你寫好了,但是如果你自己要編譯很多源文件的時候,也是要自己寫嗎?

cmake

參考

  1. https://oldpan.me/archives/gcc-make-cmake-clang-tell
  2. https://xuhehuan.com/2738.html
  3. https://www.cnblogs.com/qoakzmxncb/archive/2013/04/18/3029105.html
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容