花了七年时间死磕 Rust 的开发者,转身扎进 Zig 的怀抱,结果发现代码写得越来越像 C?这听起来像是一场语言信仰的崩塌,但事实上,它更像是一次对底层编程逻辑的强制重启。一个资深 Rust 用户决定重做一遍 JSONPath 查询库。不搞玩具项目,不碰宏大叙事,只为拿真实的工程尺度,去称一称这两门系统的重量级差异。说实话,这场对比撕开了很多技术人不愿面对的真相:我们引以为傲的现代语言特性,到底是在解决问题,还是在制造新的负担?
“我的目标很明确:把已有的 jsonpath-rust 移植成 zig-jsonpath。社区能用得上,才是硬道理。”
作者没有选择从零摸索,而是直接以 RFC 9535 标准规范为靶子,把两种语言放在同一个砝码盘上。七天下来,IDE 的缺失、文件树的坍塌、函数式范式的退潮,以及内存管理的手动排雷,全数浮出水面。这不是简单的语法翻译,而是一次开发习惯的剧烈洗牌。
告别IDE:被命令行反向驯化的七天
最先给作者一记闷棍的,居然是 IDE 支持。习惯了 RustRover 和各种 JetBrains 全家桶的顺滑体验,切到 Zig 瞬间只剩基础高亮和极简补全。谁也没想到,这次落差反而成了整场实验里最意想不到的催化剂。
没有图形界面的拐杖,只能老老实实回到终端。zig build test、-Dfilter、-Ddebug-query,一行行指令敲下去,居然逐渐尝到了久违的清爽。老实讲,这种剥离了复杂 GUI 后的纯粹感,确实让人重新审视了自己对工具的依赖程度。更绝的是,这次被迫改弦更张,直接促成了他后续整个开发环境向 helix + alacritty + zellij 的迁移。有时候,逼你一把的限制,反而能打开新大门。
意料之外的反转:被剥夺的工具链,反而赢了
材料里有个很有意思的暗线:所谓的“劣势”,最终都成了重塑工作流的推手。Zig 不鼓励深层文件夹嵌套,自带一种扁平气质。作者一开始也试图维持 Rust 里的目录层级,后来才发现,自己过早追求文件夹分级,很大程度上只是肌肉记忆在作祟。
当所有相关逻辑塞进几个大文件后,利用编辑器切片导航反而更高效。如果连第一天写代码都忍不住建文件夹,那这个项目可能根本没想象中那么大。这段经历与其说是 Zig 的结构胜利,不如说是对开发者组织习惯的一次诚实拷问。那些以为必须的架构设计,很多时候只是出于惯性。
函数式浪漫撞上命令式铁拳
Rust 骨子里流着函数式的血:零成本迭代、惰性求值、模式匹配、Monad 组合子。作者过去深受 Haskell 和 Erlang 熏陶,移植时自然想把这些利器原封不动搬过来。
但 Zig 根本不跟你玩这套。纯函数式意味着不断创建新数据结构,这在 Zig 里要么烧内存,要么烧掉你在分配器上的手动记账精力。语言的设计哲学直接把你按回命令式的地面。
“Rust 做标准的 Monad 转换,返回全新状态;Zig 则转向原地修改和原生循环。”
代码层面一目了然:Rust 是 .map().filter().reduce() 的优雅链条,Zig 是 while 循环配合指针覆写的直白操作。个人觉得,这种范式切换带来的阵痛是真实的。虽然递归和 Sum Types 两边都能扛,但当你要处理复杂的 JSON 路径遍历时,Zig 的代码读起来确实少了那份声明式的轻盈。
内存管理:从“自动托管”到“手动排雷”
这才是真正拉开体验差距的地方。Zig 的核心特征就是显式分配器(Allocator)。几乎每个函数、每个结构体都要传进来。接受它是门槛,也是诅咒。
你必须严格遵循 init / defer / errdefer 的节奏。一旦调用栈变长,这条纪律线就容易断。幸好有 std.testing.allocator 兜底,否则 Bug 会藏在深处让你怀疑人生。
作者列举了四个致命场景:忘记 deinit 导致内存泄漏、错误路径跳过清理引发二次崩溃、跨函数所有权移交造成 Double Free、局部分配失败变成孤儿内存。每一个都是 C 时代的经典幽灵。
反观 Rust,Drop trait 在作用域结束时自动触发,包括早期返回。类型系统通过移动语义直接禁止了重复释放的可能。
“Rust 的编译器在你动手之前就替你堵死了这些坑。Zig 则是把责任完全交还给开发者。”
这点我不太认同那种“手动控制更自由”的论调。在复杂项目中,让编译器承担所有权追踪,显然比靠人的自觉性靠谱得多。Zig 的测试分配器能抓包,但抓不住生产环境里那些交叉引用的暗礁。
年轻语言的未竟之局
生态现状摆在眼前:还很稚嫩。基础库稀缺,连正则表达式 mvzr 都不完整,直接卡住了 RFC 9535 过滤函数的实现。标准库 API 还在频繁变动,属于典型的“边跑边修路”。
但瑕不掩瑜。这门语言依然保持着令人惊叹的直白、现代感和编译速度。它确实有潜力接过 C 语言的接力棒,成为真正的系统级后继者。当然,语法糖和功能打磨还需要时间沉淀。作者表示会继续往生态里填砖头。毕竟,谁不喜欢亲手参与一门语言的生长过程呢?
尾声
一场七天的移植实验,照出的不仅是语法差异,更是两代系统程序员对“控制权”与“安全感”的不同取舍。当编译器开始替你想得太多,人类会不会反而失去了对机器直觉的掌控?又或者,我们终究只是在寻找一种更聪明的妥协方式。你觉得,在追求极致性能的路上,是该把方向盘交给编译器,还是继续紧握手动挡?
【锐评】:Zig 用显式分配器换来了透明与控制,但把 Rust 编译器干掉的活又扔回给人工,这到底是回归本质还是开历史倒车?
参考链接:
https://besok.github.io/posts/what-zig-felt-like-coming-from-rust/