拥有 7 年 Rust 经验的开源开发者 Boris Zhguchev 做了一次反向实验:他把自己遵循 RFC 9535 规范构建的解析库 jsonpath-rust,用系统级编程语言 Zig 完全重写为 zig-jsonpath。

重写的结果耐人寻味。原本在 Rust 中按模块、类型与错误处理层层隔离的 18 个深层源码文件,在 Zig 里被大幅折叠压缩为 5 个并列的扁平文件。随之而来的并非单纯的代码轻量化,而是一场从工具链到思维模型的范式休克。当开发者告别了借用检查器与类型契约的层层护航,系统编程的真实手感立刻退回到了最原始的机器表面。

工程范式对比:不可变组合子 vs 可变游标状态机 Rust:所有权与声明式契约 • 内存管理:Drop 自动析构,零显式释放负担 • 数据流动:不可变链式变换(flat_map / reduce) • 边界治理:细粒度 Crate 与深度文件夹强隔离 • 代价表现:抽象层次深、目录层级过度设计 Zig:显式控制与机器状态 • 内存管理:显式传递 Allocator,依赖 errdefer • 数据流动:原地修改游标、显式分支复制 • 边界治理:就地平铺文件,弱化层级嵌套 • 代价表现:心智负担重、状态分支极易泄漏

从集成环境退回命令行,构建心智的减负与幻灭

在迁移工程初期,最直接的感官落差发生在开发环境。长期依赖 RustRover 等 JetBrains 全功能 IDE 的开发者,在 Zig 生态中一度只能得到基础的语法高亮和零星补全。这种断层促使作者彻底移除了重型集成环境,倒逼自己转向由 Helix、Alacritty 和 Zellij 组成的终端纯文本工作流。

社区对此出现明显分歧。部分开发者指出 Zig 并非全无支撑,VS Code 或 Zed 配合成熟的 ZLS(Zig Language Server)早已能提供完整的类型推导与调试能力,痛点核心在于商业 IDE 插件的缺位。但不可否认的是,Zig 官方自带的 build.zig 构建系统在此展现了极高的自洽性。无需额外配置复杂的外部编译脚本,仅凭终端命令行就能顺畅调度单元测试与 RFC 9535 兼容性校验套件。

这种体验引发了一个长期被忽视的问题:现代语言的工程复杂度,很大程度上是由工具链催眠出来的。当自动化类型检查与目录辅助无处不在时,开发者倾向于建立庞大的工程脚手架;而一旦被剥离至命令行裸奔,极简代码结构反而成了阻力最小的生存策略。

扁平目录的双面镜:治愈结构强迫症还是牺牲隔离度

在 Rust 版本的代码中,工程遵循严格的职责分离:抽象语法树、查询解析、错误状态与比较器各自安放在独立的子目录与细分文件中。但在 Zig 迁移项目中,代码被直接归并为 root.zigparser.zigmodel.zigmodel_query.zigquery.zig 共 5 个文件。

这种极端平铺并非偶然。Rust 的工程文化深受 Crate 边界、可见性规则以及增量编译机制驱动,往往在项目雏形期就诱导开发者划分出纵深极强的目录树。Zig 则继承了 C 语言的务实惯性:跨目录引用带来的导入阻力,让开发者更愿意将关联逻辑写在同一个较长文件中分段浏览。

但这并非没有代价。在单一开发者维护几十到几百行的小型工具库时,平铺能省去繁琐的组织仪式;可一旦代码规模扩大到数万行并涉及多人协作,缺乏模块可见性屏障的扁平化结构,很可能退化为互相穿透的泥潭。

工程指标与生态稳定性落差 1.98.1 Rust 稳定版本:具备 Edition 稳定契约 0.16.0 Zig 阶段版本:API 持续重构,未达 1.0 18 → 5 源码文件数:结构扁平化与层级收缩

范式休克:不可变抽象退回手动状态机

真正的摩擦发生在底层计算逻辑的表达上。在 Rust 中,JSONPath 的路径求值可以通过高阶迭代器、不可变单子(Monad)与匹配模式干净利落地完成组合;但在 Zig 中,分配器必须显式传入,纯函数式的持续内存构造不仅开销巨大,而且会带来灾难性的显式生命周期追踪。

结果是,开发者被迫把声明式的 flat_map 与组合子改写为就地变更游标的 while 循环,利用显式分支与状态重写来替代不可变数据流。

借用检查器省去的不仅是安全排查,更是免除了为每次状态转移编排释放路径的认知损耗。

为了防止内存泄漏与二次释放,Zig 的 errdefer 机制与 std.testing.allocator 构成了最后一道安全防线。但在深层调用链条中,所有权究竟归属调用方还是缓存层,全靠人工遵守约定。一旦在传递给下游后误写了一行析构,双重释放的隐患就会在运行时爆发。

  • 风险.Zig 的分配器显式化让性能控制极致透明,但也把静态证明责任全盘交还给了工程师的神经末梢。

未达 1.0 的现实代价与终局分流

抛开语法手感,项目迁移还撞上了更为骨感的现实。截至 2026 年 9 月,Zig 最新稳定版本为 0.16.0,主干分支正在朝 0.17 演进,距离 1.0 正式发布仍有距离;而 Rust 早已迭代至 1.98.1 稳定版,拥有高度可靠的 Edition 兼容体系。

在 0.16.0 的发布演化中,Zig 对编译器核心、构建模块以及 C 语言翻译逻辑进行了大刀阔斧的重写,标准库 API 频繁变动,生态中连工业级成熟的正则表达式支持都难以直接调用,迫使开发者在移植错误处理时依赖 AI 工具打补丁。

这揭示了两门语言截然不同的定位。把两者置于同一舞台争论优劣本就缺乏根基:

  • Rust 瞄准的是现代 C++ 的替代,用类型系统和借用契约把安全防线筑在编译期,换取大型系统协同与第三方交付的确定性;
  • Zig 则坚定指向现代 C 的演进,以消除所有隐式控制流为代价,换取对机器资源的绝对支配与跨平台构建的极简体验。

为追求极致透明,就必须坦然接纳手动操纵生命周期的繁琐;而贪恋高层抽象与免维护释放,就不得不承受借用检查器的严苛法度。鱼和熊掌之间,两门语言在底层世界分道扬镳。