开源的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