Zig 0.17:语法开始冻结,构建系统被拆成两半
Zig 0.17.0 于 10 月 2 日发布,5 个月、206 位贡献者、925 次提交。这篇挑出会打断编译的语法改动、标准库重命名与构建系统的结构性变化。
Zig 0.17.0 在 10 月 2 日发布:5 个月、206 位贡献者、925 次提交。发布说明里有一句很 Zig 的话 —— 「原本预计这个周期会短一些,结果还是做成了一个大版本」。
语言层:先看会打断编译的部分
0.17 的关键词是语言稳定性进展:语法被形式化描述并做了 fuzz 测试,C 语言翻译(zig translate-c)从编译器里挪到外部包。这意味着「语法还会不会大改」这件事,官方开始给答案了。
会打断编译的改动(升级时按这个清单过一遍):
\@bitCast语义调整(最容易被忽略:它不报「未定义」,而是悄悄改变行为)- 数组乘法语法移除
void{}语法移除errdefer的捕获形式移除i0类型移除internal与link_once全局链接移除\@hasDecl只对 public 声明返回true
新增的则偏底层:\@backingInt / \@fromBackingInt(拿枚举与结构体的底层整数)、\@SpirvType、\@divCeil。
标准库:几处「改名比改功能更疼」
SafeAllocator登场,StackFallbackAllocator重构并更名ArrayList的指针稳定性:这是长期痛点 —— 扩容会让切片指针失效,现在有了明确保证debug.SafetyLock支持共享锁fmt.allocPrint挪到mem.Allocator上std.zon.parse重做bit_set新增 SoA(struct-of-arrays)变体,旧的 managed 变体标记弃用lang.OptimizeMode改名为lang.Optimize
构建系统:maker 与 configurer 分离
结构性的改动在构建系统:把「生成构建图的过程」和「配置过程」拆成两个进程,缓存系统重做,并引入 configure cache poisoning 的概念(配置阶段的缓存一旦被污染,结果就不可信)。另外补上了 Build Server Protocol 支持。
这条对普通用户是「zig build 变快了」,对写构建脚本的人是「很多东西要重写」。官方也老实写了:这个版本包含已知 bug,还列了 notable regressions。
编译器与后端
增量编译继续推进,LLVM 升到 22,aarch64 / loongarch / WebAssembly 后端都有改动,SPIR-V 后端在补,链接器(ELF / COFF)也重做了测试框架。
一句判断
0.17 的「慢」是在还债:语法冻结、C 翻译外置、构建系统分进程,都是把「以后能少改」提前付账。对使用者的实际建议是:升级时先跑一次 zig build 看语法错误清单,再逐个处理 \@bitCast 与 \@hasDecl 这类不报错但变语义的改动。
数据来源:Zig 官方《0.17.0 Released》(2026-10-02)与 0.17.0 release notes。

评论
…