GCC、LLVM、Clang

LLVM是Low Level Virtual Machine的簡稱。這個庫提供了與編譯器相關的支持,可以進行程序語言的編譯期優化、連接優化、在線編譯優化、代碼生成。能夠做爲多種語言編譯器的後臺來使用。前端

Clang是一個C++編寫的基於LLVM、發佈於LLVM BSD許可證下的C/C++/Object-C/Object-C++ 編譯器。正則表達式

GCC:(GNU Compiler Collection)縮寫,一個編程語言編譯器,是GNU(自由軟件理事會)的關鍵部分。也是GNU工具鏈的一部分。GCC常被認爲是誇平臺編譯器的事實標準,特別是它的C語言編譯器。GCC本來只能處理C語言。可是面對Clang的競爭,很快做出了擴展,如今已經能夠處理C++,Fortran、Pascal、Object-C、Java、Ada,以及Go語言。許多操做系統,包括許多Unix系統,如Linux及BSD家族都採用GCC做爲標準編譯器。MacOSX也是採用這個編譯器。編程

 

       有了GCC在前爲什麼還有Clang的出現?緣由以下:Apple使用LLVM在不支持所有OpenGL特性的GPU(Intel低端顯卡)上生成代碼JIT,令程序仍然能正常運行。以後LLVM與GCC的集成過程發生了一些不快,GCC系統龐大兒笨重,而Apple大量使用的Object-C在GCC中優先級很低。此外GCC做爲一個純粹的編譯系統,與IDE配合不好。加上許可證方面的要求,Apple沒法使用修改版GCC而閉源。因而Apple決定從0開始寫C family的前端,也就是基於LLVM的Clang了。後端

Clang的特性:框架

一、快:經過編譯OSX上幾乎包含了全部C頭文件的carbon.h的測試,包括預處理(Pregrocess)、語法(lex)、解析(parse),語義分析(semantic Analysis),抽象語法樹生成(Abstract syntax Tree)的時間,Clang是Apple GCC 4.0的2.5x快。編程語言

二、內存佔用小:Clang內存佔用是源碼的130%,AppleGCC則超過10x。模塊化

三、診斷信息可讀性強:Clang中錯誤的語法不但有源碼提示,還會在錯誤的調用和相關上下文有~~~~和^提示,GCC看不懂。工具

四、設計清晰簡單,容易理解,易於擴展加強。學習容易。學習

五、基於庫的模塊化設計,易於IDE集成及其餘用途的重用。因爲歷史緣由,GCC是一個單一的可執行程序編譯器,其內部完成預處理到代碼生成的所有過程,中間諸多信息都沒法被其餘程序重用。Clang將編譯過程分紅彼此分離的幾個階段,AST信息可序列化。經過庫的支持,程序可以獲取到AST級別的信息,將大大加強對代碼的操控能力。對於IDE而已,代碼補全、重構是重要的功能,然而若是沒有底層的支持,只使用tags分析或者正則表達式匹配很難達成。測試

 

固然GCC也有優點:

一、支持JAVA/ADA/Fortran

二、GCC支持平臺多

三、GCC更流行,普遍使用,支持完備

四、GCC基於C,不須要C++編譯器就能夠編譯

     相信介紹到這裏你們可以對 Clang 和 LLVM 有所瞭解了。除去 Clang 以外,LLVM 還被用在 Gallium3D 中進行 JIT 優化,Xorg 中的 pixman 也有考慮使用 LLVM 來優化執行速度,llvm-lua使用 LLVM 來編譯 Lua 代碼,gpuocelot使用 LLVM 能夠令 CUDA 程序無需從新編譯便可運行在多核 X86CPU、IBM Cell、支持 OpenCL 的設備之上...

 

LLVM是編譯器的工具鏈的集合,Clang是使用LLVM的編譯器,Clang必須調用鏈接器LLDB來產生可執行文件。

LLVM是一個優秀的編譯器框架,它也採用經典的三段式設計。前端可使用不一樣的編譯工具對代碼文件作詞法分析以造成抽象語法樹AST,而後將分析好的代碼轉換成LLVM的中間表示IR(intermediate representation);中間部分的優化器只對中間表示IR操做,經過一系列的Pass對IR作優化;後端負責將優化好的IR解釋成對應平臺的機器碼。LLVM的優勢在於,中間表示IR代碼編寫良好,並且不一樣的前端語言最終都轉換成同一種的IR。

LLVM IR 是LLVM的中間表示,優化器就是對IR進行操做的,具體的優化操做由一些列的Pass來完成,當前端生成初級IR後,Pass會依次對IR進行處理,最終生成後端可用的IR。下圖能夠說明這個過程:

 

相關文章
相關標籤/搜索