編譯器的構成
傳統的編譯器通常分為三個部分,前端(frontEnd),優化器(Optimizer)和後端(backEnd). 在編譯過程中,前端主要負責詞法和語法分析,將源代碼轉化為抽象語法樹;優化器則是在前端的基礎上,對得到的中間代碼進行優化,使代碼更加高效;後端則是將已經優化的中間代碼轉化為針對各自平台的機器代碼。
不光靜態語言如此,動態語言也符合上面這個模型,例如 Java。 JVM 也利用上面這個模型,將 Java 代碼翻譯為Java bytecode。這一模型的好處是,當我們要支持多種語言時,只需要添加多個
前端就可以了。當需要支持多種目標機器時,只需要添加多個後端就可以了。對於中間的優化器,我們可以使用通用的中間代碼。LLVM(後端)
LLVM (Low Level Virtual Machine,底層虛擬機)提供了與編譯器相關的支持,能夠進行程序語言的編譯期優化、鏈接優化、在線編譯優化、代碼生成。簡而言之,可以作為多種編譯器的後台來使用。
Clang(前端)
Clang 是 LLVM 的前端,可以用來編譯 C,C++,ObjectiveC 等語言。 Clang 則是以 LLVM 為後端 特性
速度快:通過編譯,包括預處理 (Preprocess),語法 (lex),解析 (parse),語義分析 (Semantic Analysis),抽象語法樹生成 (Abstract Syntax Tree) 的時間,Clang 比 GCC 快2倍多。
內存佔用小:Clang 內存佔用是源碼的 130%,Apple GCC 則超過 10 倍。
診斷信息可讀性強:其中錯誤的語法不但有源碼提示,還會在錯誤的調用和相關上下文的下方有
~和^的提示,相比之下 GCC 的提示很天書。兼容性好:Clang 從一開始就被設計為一個 API,允許它被源代碼分析工具和 IDE 集成。 GCC 被構建成一個單一的靜態編譯器,這使得它非常難以被作為 API 並集成到其他工具中。
Clang 有靜態分析,GCC 沒有。
Clang 使用 BSD 許可證,GCC 使用 GPL 許可證。
沒有留言:
張貼留言