背景
Swift 語言的實現(xiàn)借助了 LLVM,Swift 和 LLVM 的發(fā)明人 Chris Lattner,曾說過,Swift 語言就是 LLVM 的巨大語法糖。LLVM 定義了一種中間語言。所有經(jīng)過前端編譯的語言,在經(jīng)過詞法分析、語法分析、語義分析之后,LLVM 會幫助其生成對應(yīng)的 LLVM 中間語言,然后這些中間語言表示的程序就可以進行各種優(yōu)化處理,然后轉(zhuǎn)換成不同平臺的匯編語言。 LLVM 的出現(xiàn)可以說讓發(fā)明一門語言的難度大幅減少了。關(guān)于 LLVM 更多介紹可以查看 Chris 自己的文章 ,見引用1。
Swift 語言在編譯的時候會轉(zhuǎn)換成 Swift 中間語言(Swift Intermediate Language,簡稱 SIL)。那么在已經(jīng)有 LLVM IR (中間語言)的情況下,為什么不是直接轉(zhuǎn)換成 LLVM 中間語言呢?而是多了一步先是轉(zhuǎn)換成 SIL 然后才轉(zhuǎn)換到 LLVM IR?
前言
具體內(nèi)容可以查看 Youtube LLVM 官方視頻的介紹(見引用2),以下內(nèi)容是對該視頻內(nèi)容前半部分的總結(jié),同時包含了一些作者自己的理解。(視頻的后半部分是 Chris 舉了幾個例子來描述 SIL 是如何工作的。對于編譯感興趣的可以看看,能學(xué)到很多)
為什么需要 SIL
從 clang 中吸取的教訓(xùn)
類 c 語言的編譯過程如下:

但是在實際編譯的代碼實現(xiàn)中是這樣的:

很容易就能看出來這兩張圖想要表達的意思,在第二張圖中,語法分析和語義分析之間很亂,然后語義分析生成 的 AST‘ 在轉(zhuǎn)換成 IR 的時候也是相當(dāng)?shù)那郏瑫r AST‘ 也承擔(dān)了支持代碼的靜態(tài)分析的前置責(zé)任。在靜態(tài)分析和生成 IR 這兩者之間其實有很多重復(fù)的邏輯。
總結(jié)一下:
- 源代碼和 LLVM IR 之間有一個巨大的抽象層(但是這個抽象層在 clang 里面實現(xiàn)的并不完美)
- IR 對于源代碼級別的靜態(tài)分析不夠友好
- clang 的靜態(tài)分析實現(xiàn)(CFG)不夠好同時,和 IR 有很多重復(fù)。
Swift 的特點
Swift 是一門高級的語言,很多語言的特性是靠語言自身實現(xiàn)的(比如 Swift 的 Int 這些就是 Swift 語言實現(xiàn)的),并且 Swift 的范型基于 Protocol。Swift 也是一門安全的語言,很多不安全的操作,比如未初始化的變量,死代碼等等需要在盡早的階段就能發(fā)現(xiàn)(意味則代碼的靜態(tài)分析很重要)。
以下是 Swift 的編譯過程:

可以看到,SIL 將原本在 clang 中獨立的靜態(tài)分析和 IR 生成階段整合了起來。
(通俗的說就是,clang 在實現(xiàn)的時候開發(fā)者們發(fā)現(xiàn)很多階段是交織在一起,沒有很好的獨立開來,導(dǎo)致代碼耦合度高,現(xiàn)在加入了一個中間層,來解決這種情況)
SIL 的特點
- 能夠完整的表達程序的語義。
- 被設(shè)計用于代碼生成和靜態(tài)分析
- 處于編譯的流水線中,而不是獨立與之外
- 在源代碼和 LLVM 之間架起了抽象的橋梁