AVSI2和cart基本完成了!

AVSI 是我从大一开始制作的编译器系列。最近又完善了一下,出了个第二代,还写了一个包管理器叫 cart,定位类似于 rust 的 cargo。目前基本能用了。

组成

  项目由三个部分组成:

  • avsi: 编译器本体
  • cart: 包管理器
  • libavsi: 标准库

  包管理器的命名过程挺有趣的,一开始想命名为 minecart(矿车)。但搜了一下 github 已经有同名的项目,所以索性去个头,命名成 cart。
  光编译器本体和包管理器加起来就达到了九千多行代码,标准库后续应该会继续写,目前只有 print 和 read 两种函数。第一次写这么大的项目,以前写的山寨 Minecraft 也才三千多行。这在以前的我看来是完全不可能的事情。大概这就是迭代开发的魔力吧。回看我第一号 commit 的时候有种无法言说的奇妙感觉。
  这么大的项目不仅意味着函数分组麻烦,而且意味着出bug会更加难以调试。由于写的测试样例比较刁钻,导致每一次花一小时增加一个小功能,就要花上五六个小时 debug。这个过程下来可能把 c++ 语言本身的坑和 llvm 的坑都踩了一遍。

使用

  使用 cart 可以很方便地建立和构建项目(毕竟对标的是 cargo):

  新建一个项目,名为 mycode,这个过程会建立一个项目文件夹,并且提供一个 Hello World 的代码和一个配置文件

1
2
3
4
$ cart new mycode
$ cd mycode
$ ls
Cart.toml main.sl

  然后使用 cart build 构建项目,默认可执行文件为 a.out

1
2
3
4
5
6
7
8
$ cart build
compile source files
avsi main.sl --package-name mycode -O -W

link objs
GNU ld (GNU Binutils) 2.38
$ ./a.out
Hello World!

  过程十分简单

杂谈

  llvm项目有一个明显的问题,llvm入门的文章非常多,搜索引擎搜索一下,首页的文章基本都可以入门。但是遇到具体问题后搜索引擎就失灵了,因为基本找不到解决方法,英文和中文搜索都是一样的。这个时候采取的办法比较极端一些了:看别人的项目源码。Google上面搜索一个代码片段可以搜索到相关的项目。我通过看源码解决了一些玄学无比的问题。再麻烦一点只能看头文件和llvm或clang源码来解决了。
  这个项目花费了我非常多的时间,最终呈现的效果也很不错。但写到后面又产生了一种疑惑。现在的本科以算法竞赛为主,这个对于别人来说是非常容易区分能力的办法。但是由于算法竞赛的投入和产出不成比例,所以一开始并没有参加,而是把精力投入到一堆个人项目中。如果以后有人能觉得这个项目能够不逊色于算法竞赛的话那就太好了。