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 现在还没把牌摊开。它只是先把牌桌规则写出来。这个动作本身,比新增某个符号更值得看。
因为真正的分水岭不在“加不加”,而在“加了以后,谁来付复杂度的账”。
