llvm與gcc
-
llvm 是一個編譯器,也是一個編譯器架構,是一系列編譯工具,也是一個編譯器工具鏈,開源 C++11 實現。
-
gcc 相對于 clang 的優勢:
- gcc 支持更過語言前端,如 Java, Ada, FORTRAN, Go等
- gcc 支持更多地 CPU 目標架構
- gcc 支持更多語言擴展,比如 gcc 可以完美地支持 Linux Kernel 的編譯,而 clang 會遇到一些擴展的問題
-
clang 相對于 gcc 的優勢:
- clang 的 AST 和整個設計是人類可以閱讀的
- clang 的模塊化和復用性更好,clang 從初衷上就是以 API 的形式設計,可以被源碼分析工具,重構,IDE等復用。而 gcc 在設計時就沒有這個考量,gcc 被設計為“一大團”靜態編譯器,總之就是可以實現功能,并且功能很強大(上面優點),但其中內容基本不可知,gcc 的設計就沒有考慮復用性
- clang 可以序列化其生成的 AST 到硬盤上并且被其他程序讀入,這對整個程序的分析很有用,gcc 不支持這項功能
- llvm 的優化在全程都會進行,包括編譯時優化,鏈接時優化,裝載時優化,運行時優化,以及閑時優化。可參考:LLVM全時優化。
- clang 更快且用更少內存
- clang 在設計時就考慮提供更加清晰準確地診斷信息(error 和 warning 信息)
- gcc 的許可證是 GPL,clang 是 BSD
gcc 就像橡皮泥,能夠塑造出任何優秀的作品,但基本沒有復用性可言;llvm 就像樂高積木,雖然更加粗獷,但是模塊化和復用性極佳。
那么,llvm 框架模塊化的優勢究竟是怎樣在其他領域為其他應用帶來巨大的便利的呢?以下整理自 知乎@藍色 大佬的一個回答(LLVM相比于GCC,有哪些技術上的優勢?):
-
統一的IR與模塊化。你可以很輕易的抽取LLVM的組件(以庫的形式)出來用于其它領域,如抽取LLVM JIT用于 MapD 這樣的 GPU 數據庫,或者抽取LLVM的整個后端(優化與CodeGen)用于 TVM 這樣的深度學習推理框架。這樣帶來的好處就是 LLVM 不再僅僅是用于給 Clang 等編譯器前端提供服務的編譯器后端,而是可以為需要JIT / CodeGen 功能的所有領域服務,比如提到的GPU數據庫、深度學習推理框架,還包括安全、區塊鏈等應用領域。而這一切LLVM所需要的僅僅是一個統一的中間表示格式:LLVM IR。所以,現在比較常見的開發模式變為:
各種各樣的應用(DSL、GPU數據庫、TVM、安全、區塊鏈等)----> 生成 LLVM IR ----> LLVM的優化 ----> LLVM Code Gen ----> 目標代碼(ARM、x86、Hexagon、NVPTX、AMDGPU、WebAssembly…)。 這在LLVM出現之前,基本上是做不到的事情,不僅GCC,包括其它編譯器都可以理解為“一坨”,根本抽不出來。
-
快速的可定制化。這一點架設在第一點的基礎上,由于在LLVM中編寫優化Pass非常方便,所以針對各種各樣的應用,可以變為:
-
各種各樣的應用(DSL、GPU數據庫、TVM、安全、區塊鏈等)----> 生成 LLVM IR ----> 編寫針對自己特定應用的優化Pass ----> LLVM的優化 ----> LLVM Code Gen ----> 目標代碼(ARM、x86、Hexagon、NVPTX、AMDGPU、WebAssembly…)
-
也包括:各種各樣的應用(DSL、GPU數據庫、TVM、安全、區塊鏈等)----> 生成 LLVM IR ----> 編寫針對自己特定應用的優化Pass ----> LLVM的優化 ----> LLVM Code Gen ----> 目標代碼(ARM、x86、Hexagon、NVPTX、AMDGPU、WebAssembly,自己的后端(如AI芯片)…)
-
-
使用現代C++代碼編寫并有良好的代碼組織。LLVM使用C++11編寫,代碼十分清晰與規范,對于閱讀并且改寫非常的方便。同時,其代碼組織非常的好,每一個地方放什么東西,一目了然。而我也與一些同僚聊過,大家也都覺得LLVM是更好讀、更好改的代碼。
-
License優勢。這一點是優勢,但是是否是技術優勢,看如何理解,但是這一點確實幫助了LLVM很多,讓其快速被各大公司采用并不斷回饋它。
Ref:
https://www.youtube.com/watch?v=RzrHuP2aVEg
https://www.zhihu.com/question/23807363