開源的swift編譯器實現:Swallow
Swallow 是一個開源的swift編譯器實現,不過目前還沒完工,只能當做一個體驗版,好多東西都還需要大量的時間去開發,我只能在業余的時間去開發,加之要照顧懷孕的妻子以及有自身的全職工作,因此我不能保證開發進度能很快。
現在連代碼生成都還沒來得及弄,現在的版本只提供了一個粗糙仿制的REPL,可以看到現在的進展情況。暫時自帶的REPL只能查看一些語法和語義錯誤,以及查看符號的類型推導的結果。
目前語法分析參考的是官方文檔最早的版本(2014年6月2號發布的版本),因此好多新語法尚不被支持,后來幾次的版本,語法改動相對較小,所以我現在的開發重心一直放在語義分析這塊,等做得差不多了,我再來回過頭增加新的語法糖支持。
語義分析這塊目前的版本能處理函數重載,操作符重載,自定義操作符,類型定義(class/struct/protocol),泛型,泛型約束,類 型推導以及變量聲明(包括以元組的方式)等,目前的版本還沒有處理控制流,extension,模式匹配等,這些將在接下來的日子里陸續完工。
代碼生成這塊打算使用LLVM來完成,這樣方便利用LLVM的工具鏈來提供完整的生態系統。
編譯器代碼本身盡量用測試用例覆蓋,但是在做REPL的時候發現好多情況都沒考慮到,那些會引起REPL崩潰的代碼 將會陸續放入到測試用例中的,后期也打算將swift-compiler-crashes的代碼也集成到測試用例中去。
需要注意的是目前的版本為了方便用單元測試,內建類型(比如Builtin.Word)在語法分析里做了簡單的hack來處理,這個錯誤的做法將在整個編譯器能完整的支持標準庫的時候再進行修正。
Build instructions
Clone this repository to your drive:
$ git clone https://github.com/lexchou/swallow/
Build google-test:
$ cd swallow/gtest-1.7.0/
$ ./configure
$ cmake -G 'Unix Makefiles' .
$ make
Build the swallow/repl/test cases:
$ cd ..
$ cmake .
$ make
Start repl:
$ repl/repl
構建過程
先將項目克隆到本地:
$ git clone https://github.com/lexchou/swallow/
然后編譯: google-test:
$ cd swallow/gtest-1.7.0/
$ ./configure
$ cmake -G 'Unix Makefiles' .
$ make
然后編譯 swallow/repl/test cases:
$ cd ..
$ cmake .
$ make
執行 repl:
$ repl/repl
Snapshots
Comparison between official REPL and swallow
Type inference
Function overloads