最开始,我压根没想过要搞什么”自己造一门语言”这种听上去就很厉害的玩意儿。

起点:连递归下降都看不下去#

我是那种好大喜功而且有点懒的怪人。学语言实现的时候只学了 lexer 的基本逻辑,前后也就搓过三次 lexer;再往后的 parser,即便是相对简单的递归下降,对我来说也难如登天梯

后来某次在 QQ 水群里,我偶然发现有个老哥拿正则搓解释器,而且还敢挂到 GitHub 上。当时给我带来的震撼,不亚于全过程 vibe 编程、一行 test 都不写、直接 git push --force 到远程 main 分支

(我这人有点洁癖,无论现实还是虚拟,都偏爱干净、规整、按部就班的东西。)

那一刻我就憋住了。

第一坨:Java 21 + Maven#

在憋了一段时间之后,我实现了自己的第一个解释器。

(事实上也只是拉了托大的罢了。)

技术栈是 Java 21 + Maven。附上源码(史)

SumaRoder/Tracklock

如果你点进去,请做好心理准备——史归史,但毕竟是我亲手拉的第一坨。

第二坨:Kotlin 重构的 Rosenfield#

在外浪迹了一段时间之后,我又回到老本行开始码代码,然后推出了用 Kotlin + Maven 重构出来的 Rosenfield 语言。

很可惜,依旧是史一坨。 更可惜的是,它现在也不太适合再放出来给人看了,那就算了吧。

转折:染上 ML 家族和函数式#

不久前,我染上了对 ML 语言家族和函数式编程的喜爱。

因此我现在正在维护的这一版 Suma-lang 受到了很多影响,比如:

SumaRoder/Suma-lang
  • 类型推断
  • 类型后置
  • 函数一等公民

——这些都被我搬进了它的基础设定里。

第三坨——也许不再是史:Suma-lang#

值得一提的是,Suma-lang 又一次推翻了之前的技术栈,这次我用的是 uv + Python 3.9+

并且这次,我甚至:

  • 写了不少测试
  • CI 上跑了静态检查 + pip audit
  • 默认用仓库的 GitHub Pages 部署了一份 mkdocs 文档页

质量不知道比之前那两坨破玩意好了多少。

更关键的是——一改之前老老实实写解释器的作风,这次我把 Suma-lang 写成了编译型语言。具体的设计与实现细节,就不在这篇里展开了,可以直接去看仓库里的 README.md


说实话我文笔并不好,这篇读着显然有股史臭味,见谅。回头看,从”递归下降都看不进去”一路写到”敢说自己写的是编译器”,中间躺着三个项目和无数次推翻重来。每一坨都很臭,但每一坨都让下一坨少臭一点——这大概就是唯一值得拿出来说的东西。