LLVM不是一個編譯器荞怒,而是一套工具集,這套工具包括完整編譯過程的所有部分,它將編譯過程的各個部分模塊化撩嚼,用戶可以根據(jù)自己的需求自己編寫一個前端完丽,并在里面通過自定義的driver調(diào)用LLVM提供的toolchain生成可執(zhí)行文件逻族,組成一個編譯器聘鳞。 具體來說是將中間代碼優(yōu)化要拂,不同平臺上的代碼生成部分都模塊化脱惰,在編寫新語言編譯器時只需要寫一個前端將語言的源碼轉(zhuǎn)化成LLVM的中間表示代碼IR拉一,然后調(diào)用LLVM對IR的優(yōu)化模塊和代碼生成模塊蔚润,生成不同平臺的可執(zhí)行文件嫡纠。
LLVM和GCC的比較
GCC更像是一個黑盒货徙,無法把它進行拆分。而LLVM設計是模塊化的赏迟,可以通過API調(diào)用編譯過程中的某一部分锌杀。
GCC的協(xié)議要求產(chǎn)品必須免費糕再,不能出售突想,LLVM采用BSD協(xié)議猾担,所以商業(yè)化產(chǎn)品只能使用LLVM绑嘹。
LLVM的中間語言IR
IR是LLVM的關鍵工腋,任何語言只要提供工具將源碼轉(zhuǎn)化為IR擅腰,就可以省去開發(fā)剩下的部分(代碼優(yōu)化惕鼓,代碼生成)箱歧。GCC沒有IR,代碼優(yōu)化是基于assembly代碼上進行,assembly代碼優(yōu)化在不同平臺有不同的做法申眼,就無法模塊化括尸。有了IR濒翻,所有的代碼優(yōu)化部分就可以在IR上進行有送,任何平臺都一樣雀摘,就可以獨立出來阵赠。
Solidity沒有用LLVM是因為LLVM還不支持EVM自定義的指令集豌注,無法通過LLVM工具生成出字節(jié)碼轧铁。如果使用wasm格式齿风,LLVM已經(jīng)有模塊支持生成wasm格式文件救斑,這就是為什么wasm合約可以使用更多語言開發(fā)。