LuaJIT 这次最有意思的地方,不是 3.0 要加什么语法,而是 Mike Pall 先把“什么语法不该加”摆到了台面上。

他开了一个关于 LuaJIT 3.0 语法扩展 的 umbrella issue。注意,这不是 LuaJIT 3.0 已经发布,也不是一份最终新语法清单。它更像一次收口:把多年散落的语法扩展讨论归到一个地方,决定哪些能进,哪些该挡在门外。

这不是发布会,是语法边界的立规矩

这次议题的事实很简单。

Mike Pall 准备把 LuaJIT 历史上分散的语法扩展,整理进一份独立、完整的语言文档,并标注每项扩展首次出现的版本。旧议题 #63#1379 已经转并到这里。

这说明它不是单点补丁讨论,而是一次集中清账。

更关键的是,Mike Pall 给出了明确门槛。不是“想加就加”,而是要过五道关。

准入条件实际含义影响对象
提升开发体验语法必须解决真实编码痛点,不是为了好看LuaJIT 开发者
已被验证最好在其他语言或 Lua 方言里跑通过语言设计讨论者
无语法歧义不能让解析器和人都猜意思编译器、工具维护者
向后兼容老代码不能被新语法反噬库作者、长期项目
不拖累工具链格式化器、LSP、编辑器不能被迫大改IDE / LSP / formatter 维护者

他还明确拒绝复制 Perl、Ruby、C++、Rust 那种复杂语法路线。

这句话很重。它把 LuaJIT 3.0 的语法讨论,从“能不能多加点糖”,拉回到一个更硬的问题:LuaJIT 还能不能在变强时保持可预测。

对普通 LuaJIT 用户来说,现在不需要急着改代码,也不该把它理解成迁移信号。对库作者和工具维护者来说,更现实的动作是观望候选语法是否真的进入文档,尤其看格式化器、LSP、静态分析工具会不会被迫补解析逻辑。

真正的风险不是加语法,而是方言化

语言演进最难的地方,不是第一项扩展。

第一项通常很合理。第二项也能解释。麻烦从第三项、第四项开始出现:例外越来越多,文档越来越厚,工具链越来越累,老代码越来越难判断边界。

LuaJIT 的优势,一直不是语法花活。它真正吃的是轻、快、稳,以及和既有 Lua 生态的亲近感。

所以这次讨论的关键变量只有一个:LuaJIT 3.0 是克制演进,还是滑向方言化。

两条路线的后果不一样。

路线好处代价
少量实用扩展改善开发体验,保持 LuaJIT 的工程克制变化慢,不能满足所有语法偏好
大量语法扩展表达力看起来更强,短期讨论更热闹工具链负担上升,学习成本上升,Lua 兼容心智变差

我更支持第一条。

不是因为语言不能进化,而是 LuaJIT 的资产太特殊。它一旦变成“Lua 的另一个大方言”,短期看是表达力增加,长期看是生态成本外溢。写代码的人爽一时,维护工具的人要一直还债。

这也是为什么“不拖累格式化器和 LSP”这条很重要。很多语法争论只盯着写代码的瞬间,却不看代码进入工程系统后的成本。代码要被格式化、补全、跳转、重构、审查、分析。语法越复杂,这些环节越容易碎。

“天下熙熙,皆为利来。”放在语言设计里,那个“利”就是开发便利。便利当然重要,但便利如果只给写作者,不给维护者、工具作者、后来者留余地,就会变成债。

LuaJIT 这次比较成熟的地方,是先把债务上限写出来。

接下来要看三件事

目前材料还看不出具体新语法清单,也看不出最终决策。把这件事夸成“大规模语言改革”,证据不够。

真正该盯的是三件事。

  • 候选语法有没有进入独立语言文档,并标注首次出现版本。
  • 每项语法是否能逐条对应那五个准入条件,而不是靠“大家觉得方便”过关。
  • 工具链维护者有没有明确负担.格式化器、LSP、编辑器插件是否需要大幅调整。

如果只是补齐文档、筛掉高风险语法,这是好事。LuaJIT 长期欠缺的不是更多口号,而是更清楚的边界说明。

如果后面变成“既要兼容,又要塞很多表达习惯”,那就危险了。语言复杂度从来不是一次爆炸,通常是每次都只加一点,最后谁也说不清那条线在哪里。

所以我不太买账那种“多几个语法糖没什么”的轻描淡写。

对个人开发者,语法糖只是少打几行。对库作者,是支持矩阵。对工具维护者,是解析器分支。对长期项目,是以后升级时要反复确认的行为边界。

LuaJIT 3.0 现在还没把牌摊开。它只是先把牌桌规则写出来。这个动作本身,比新增某个符号更值得看。

因为真正的分水岭不在“加不加”,而在“加了以后,谁来付复杂度的账”。