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。

← 返回文章列表

评论

…