天天看點

LLVM 與 Clang 介紹

晚上聽國軟徐紀元學弟給我說起了他剛裝上的 Mac Lion 作業系統,也說到了最近 Apple 推出的新版本的 Xcode 4.2 在 iOS 4、iOS 5 程式開發中,加入了 automatic reference counting 功能,也即是開發者不再需要手動的做記憶體管理了,不用糾結記憶體管理了,不再需要 retain release 了。 同時 Apple 現在把編譯器改為 LLVM 了,同時也保留了 GCC 的支援,但按這樣的發展,GCC 至少在 Apple 開發上快到盡頭了。

在網上查了下 LLVM 的發展曆史:

發展曆程

2000年 LLVM 開始開發,

2005年 Apple 雇了 Chris Lattner,LLVM 也相當于成了 Apple 的官方支援的編譯器。   Apple 已經将它用在 OpenGL 的流水線優化,Xcode 已經能使用 llvm-gcc 編譯代碼。

到今天的 Xcode 已經開始使用 llvm 編譯代碼。

鑒于此,也是自己對 LLVM 的學習,轉載了這篇文章,讓自己也讓你明白 LLVM 的皮毛。
LLVM 與 Clang 介紹

同時推薦 LLVM 的官方連結:http://llvm.org/。

連結:http://linuxtoy.org/archives/llvm-and-clang.html。

LLVM 是 Low Level Virtual Machine 的簡稱,這個庫提供了與編譯器相關的支援,能夠進行程式語言的編譯期優化、連結優化、線上編譯優化、代碼生成。簡而言之,可以作為多種語言編譯器的背景來使用。如果這樣還比較抽象的話,介紹下 Clang 就知道了:Clang 是一個 C++ 編寫、基于 LLVM、釋出于 LLVM BSD 許可證下的 C/C++/Objective C/Objective C++ 編譯器,其目标(之一)就是超越 GCC。

Clang 開發事出有因,Wiki 介紹如下:

Apple 使用 LLVM 在不支援全部 OpenGL 特性的 GPU (Intel 低端顯示卡) 上生成代碼 (JIT),令程式仍然能夠正常運作。之後 LLVM 與 GCC 的內建過程引發了一些不快,GCC 系統龐大而笨重,而 Apple 大量使用的 Objective-C 在 GCC 中優先級很低。此外 GCC 作為一個純粹的編譯系統,與 IDE 配合很差。加之許可證方面的要求,Apple 無法使用修改版的 GCC 而閉源。于是 Apple 決定從零開始寫 C family 的前端,也就是基于 LLVM 的 Clang 了。
Clang 的特性:
  1. 快:通過編譯 OS X 上幾乎包含了所有 C 頭檔案的 carbon.h 的測試,包括預處理 (Preprocess),文法 (lex),解析 (parse),語義分析 (Semantic Analysis),抽象文法樹生成 (Abstract Syntax Tree) 的時間,Clang 是 Apple GCC 4.0 的 2.5x 快。(2007-7-25)
  2. 記憶體占用小:Clang 記憶體占用是源碼的 130%,Apple GCC 則超過 10x。
  3. 診斷資訊可讀性強:我不會排版,推薦去網站觀看。其中錯誤的文法不但有源碼提示,還會在錯誤的調用和相關上下文的下方有~~~~~和^的提示,相比之下 GCC 的提示很天書。
  4. GCC 相容性。
  5. 設計清晰簡單,容易了解,易于擴充增強。與代碼基礎古老的 GCC 相比,學習曲線平緩。
  6. 基于庫的子產品化設計,易于 IDE 內建及其他用途的重用。由于曆史原因,GCC 是一個單一的可執行程式編譯器,其内部完成了從預處理到最後代碼生成的全部過程,中間諸多資訊都無法被其他程式重用。Clang 将編譯過程分成彼此分離的幾個階段,AST 資訊可序列化。通過庫的支援,程式能夠擷取到 AST 級别的資訊,将大大增強對于代碼的操控能力。對于 IDE 而言,代碼補全、重構是重要的功能,然而如果沒有底層的支援,隻使用 tags 分析或是正規表達式比對是很難達成的。
當然,GCC 也有其優勢:
  • 支援 JAVA/ADA/FORTRAN
  • 目前的 Clang 的 C++ 支援落後于 GCC,參見 http://clang.llvm.org/cxx_status.html。(近日 Clang 已經可以自編譯,見http://www.phoronix.com/scan.php?page=news_item&px=Nzk2Mw)
  • 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 的裝置之上... 我個人感覺 Apple 在開源界口碑較差(也許是我的錯覺?),不過 Apple 也為開源界貢獻了不少,Webkit,OpenCL(雖說隻是個标準),Clang。我最為佩服的是雖然出身于指令行之上的 Unix 族系統,但有魄力寫出自成體系的圖形棧,其圖形界面優美而人性化,可謂也為開源界貢獻了自己的精神與思想。 對于 Clang 這個很有潛力的項目,我希望其 C++ 支援(尤其是 template 支援)能夠早日完善。因為 GCC 在 template 出錯時的診斷資訊如同小說一般...

繼續閱讀