2023年6月12日 星期一

編譯器基礎

編譯器的構成

傳統的編譯器通常分為三個部分,前端(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 許可證。

沒有留言:

張貼留言