一个 Lisp 方言,核心语言只有 8 个指令,还要劝今天的程序员重新接受括号。

这事听起来像复古爱好者的自娱自乐。但 Janet 有个反常点:它不是只能写玩具解释器。它可以编译成原生可执行文件,静态链接运行时。原文给出的例子是:Janet 1.27.0、aarch64 macOS 上,一个 hello world 二进制大约 784K。

所以这篇文章要判断的,不是 Janet 会不会流行。大概率不会。更有意思的问题是:为什么一个这么小的语言,反而击中了今天一部分程序员的痛点。

Janet 是什么:小、可分发、适合塞进工具里

Janet 是一个小型 Lisp 方言。命令行友好,可嵌入,可分发。它适合个人项目、CLI 小工具、脚本 DSL,也适合给宿主程序加一层脚本接口。

它的核心非常窄。原文称核心指令只有 8 个:dodefvarsetifwhilebreakfn。标准库也很紧凑,不走“大而全”路线。

几个关键点,可以压成一张表:

能力Janet 的做法更适合谁
分发编译为原生可执行文件,静态链接运行时写小型 CLI、个人工具的人
嵌入小运行时,方便塞进宿主程序想给程序加脚本层的开发者
解析使用 PEG 处理文本和部分二进制解析经常处理结构化、多行输入的人
Shell 脚本第三方 janet-sh 提供管道、重定向 DSLBash 写到开始失控的人
元编程宏 + 编译期执行代码想写 DSL、代码生成、预处理资源的人
集合可变/不可变集合并存需要兼顾值语义和引用语义的人

这里最该受影响的,不是企业技术负责人,也不是准备押注下一门主流语言的团队。

更准确的人群是两类:一类是常写小工具、脚本、命令行胶水代码的程序员;另一类是对 Lisp、宏、语言设计有兴趣,但被传统 Lisp 生态和门槛劝退的人。

他们可以做的动作很具体:别迁移团队,别替换主力栈。拿一个日志处理、配置解析、内部小 CLI,或者一个嵌入式脚本层试一下。项目越小,Janet 的优点越容易显出来;项目越依赖大生态,它的短板越快露出来。

它强在哪里:不是生态,是手感和控制权

Janet 的第一个辨识度,是 PEG。

PEG 不是正则的全面升级。匹配一行日志、抽几个字段,正则仍然快、短、顺手。但当输入有嵌套、多行、结构,甚至夹一点二进制时,PEG 的可组合性就有价值。它更像一个小解析器,而不是一把字符串钩子。

这对写工具的人很重要。很多内部脚本不是死在算法上,而是死在输入格式越长越歪。正则一层套一层,维护者很快开始靠记忆续命。

janet-sh 的价值也类似。它不是要消灭 Bash,而是把管道、重定向这些 shell 心智放进 Janet 里。脚本复杂一点以后,还能继续长,不至于马上进入引号地狱。

但 Janet 最锋利的点,还是宏和编译期状态快照。

宏是 Lisp 老传统。代码就是数据,数据也能生成代码。Janet 的宏不是卫生宏,这里必须把代价说清楚:名字捕获、调试复杂度、认知负担,都不会凭空消失。宏不是超能力,更像手术刀。手稳的人觉得省事,手抖的人先割到自己。

Janet 更特殊的地方在于:编译期可以执行顶层代码,然后把程序状态序列化下来,带到运行期。闭包、共享引用、生成器状态,都可以进入这个快照。

这让它不只是“生成几行代码”。你可以在编译期读文件,把资源塞进最终二进制;可以根据 SQL schema 生成绑定;可以提前算好某些数据结构。说白了,它把一部分运行期劳动挪到编译期结账。

“工欲善其事,必先利其器。”这句话在这里不该被当成鸡汤。工具的形状,会反过来决定你愿不愿意再写一个小工具。Janet 迷人的地方,就在这个小尺度上。

别神化它:取舍比情怀更重要

我不太买账“小众语言即将崛起”这套叙事。Janet 目前仍是小众语言。生态、包成熟度、IDE 支持、生产案例,都不能按 Python、JavaScript、Go 或 Rust 的标准去幻想。

如果你要快速找库、招人、接入一堆成熟框架,Janet 不是好选择。如果团队脚本已经稳定跑在 Python 或 Bash 上,也没必要为了新鲜感改写。

更现实的对比是这样:

选择强项Janet 不该硬碰的地方
Python生态大,库多,上手低Janet 很难替代通用脚本和数据处理生态
Bash系统胶水强,随处可用Janet 适合脚本变复杂后的那一段,不适合替代所有 shell
Lua嵌入成熟,历史案例多Janet 不能假装自己已有同级别工业验证
Janet小、可嵌入、可分发、可塑形招人、生态、工具链成熟度都要打折看

这张表的意思很简单:Janet 的价值不是挑战主流语言,而是给小规模创造留一条路。

今天的主流语言越来越像平台入口。Python 带着生态,JavaScript 带着浏览器和 npm,Go 带着部署友好,Rust 带着安全叙事。它们都强,也都带着重量。很多时候,你选的不是一门语言,而是一整套供应链、社区惯例和工具政治。

Janet 反过来问了一个老问题:如果只是写一个自己的小工具、一个嵌入式脚本层、一个顺手的 DSL,有没有必要把整座城市搬进来?

这才是它值得被看见的地方。

接下来最该观察的变量,不是 Janet 的热度榜排名,而是三个更朴素的东西:打包和安装是否继续顺手,janet-sh 这类工具能不能稳定降低脚本复杂度,宏和编译期快照能不能在真实小项目里少制造麻烦、多节省时间。

如果这些变量站得住,它就不需要成为下一个 Python。它只要让一小撮程序员重新找回“我能把工具捏成自己想要的样子”的感觉,就已经够了。

括号并不古老。古老的是我们以为规模才是唯一答案。