Zig 究竟是什么?
简单说,Zig 是一门通用编程语言,附带一套完整的工具链,目标是帮你写出健壮、高效、可维护的软件。但这个官方定义太干巴巴了,远不足以体现它的独特之处。
真实背景是这样的:Zig 的创作者 Andrew Kelley 曾经尝试用 Java、Go、Rust 和 C++ 开发一个数字音频工作站,结果发现每一门语言都有让他难以忍受的硬伤。Java 离硬件太远,Go 的垃圾回收会破坏实时性能而且 C 互操作很别扭,Rust(当时还没到 1.0)的借用检查器让他频繁碰壁,严重拖慢开发效率,C++ 则随时可能因为一个打字错误就把内存搞乱。
于是 Kelley 做了一个大多数程序员只敢想不敢做的事------2018 年他辞掉工作,自己动手造了一门新语言。到现在快八年了,Zig 虽然还没发布 1.0 正式版,但已经在 Uber、TigerBeetle 和 Bun 等产品的生产环境里稳定跑起来了。
真正的价值:Zig 做对了什么
1. 没有隐藏的控制流,没有隐藏的内存分配
Zig 的语法定义在一份仅 580 行的 PEG 文法文件中,没有运算符重载,没有看起来像字段访问的属性函数,没有会悄无声息跳出代码的异常。你写 foo(); bar(); 的时候,心里完全清楚发生了什么:foo() 先执行,然后 bar() 再执行,没有意外,没有惊喜。
2. Comptime:真正好用的编译期代码执行
这是 Zig 最核心的杀手锏。它不搞宏、不搞模板、不搞泛型那套复杂机制,而是允许你在编译期执行任意代码。需要生成查表数据?编译期算好。需要通用数据结构?写个编译期运行的函数就行。这是一种彻底告别预处理器的元编程方式。
3. 性能看齐甚至超越 C
Zig 和 C 一样采用手动内存管理,没有运行时负担,所以性能天生就能和 C 掰手腕。而且 Zig 往往还能略胜一筹------所有代码都在一个编译单元里整体优化,编译器直接暴露 SIMD 向量类型。在并发性能测试中,Zig 在 64 个工作线程下跑出 253 毫秒,比 C 的 269 毫秒还要快一些。
有评测显示 Zig 只比 C 慢 2%,而 Rust 则慢 8%。另外 Zig 的编译速度大约是 Rust 的 3 倍。
4. 开箱即用的交叉编译
Zig 自带了完整的交叉编译能力,不需要折腾复杂的工具链,也不用为"在我机器上能跑"这种问题发愁。你想从任何平台编译到任何目标平台,直接搞定。
5. 和 C 的无缝互操作,省去胶水代码
Zig 可以直接调用 C 库,不需要 FFI 绑定,不需要写包装代码。它甚至能用 zig cc 来编译 C/C++ 代码。Uber 就用 Zig 的工具链来编译他们原有的 C/C++ 工程。这种能力让 Zig 在实际落地时非常务实,能和现有 C 生态共存共荣。
6. 四种构建模式,粒度精细可控
Zig 提供了 Debug、ReleaseSafe、ReleaseFast 和 ReleaseSmall 四种模式,而且你可以在粒度细到作用域级别的地方混合使用安全检查。调试阶段要完整检查?用 Debug。线上要极致性能?切 ReleaseFast。嵌入式要压缩体积?ReleaseSmall 伺候。所有选择权在你手里,而且能在关键路径上单独关闭安全检查。
7. 自举编译器,内存占用下降 70%
Zig 的编译器现在已经实现自举------主要用 Zig 自身写成。达到自举后,编译器内存占用直接降低了 70%。这不只是一个技术成就,更证明了 Zig 已经成熟到能"自己编译自己"的程度。
硬伤:Zig 目前的短板
1. 八年了还没出 1.0 正式版
这是绕不开的现实问题。Zig 从 2016 年开始开发,至今没有 1.0。Andrew Kelley 是故意不发的------项目宁愿把基础打磨扎实再承诺稳定,也不急着为了赶进度而锁死设计。
带来的影响:很多公司把"1.0"当作采用的硬门槛,Zig 没有 1.0 就让不少人犹豫不决,尽管它已经在生产环境里大规模跑了。
2. 语言本身还在变动
有开发者直言:"Andrew Kelley 一直在重写、重写,不断改设计。" 这不一定算坏事------目标是把它做"对"------但意味着你今天写的代码,未来版本可能要做调整。
3. 生态还不够成熟
和那些成熟语言相比,Zig 缺少丰富的库和框架。比如做网络爬虫,没有 Python 的 Scrapy 或 Go 的 Colly 那种现成方案,很多时候得自己从头搭。调试工具也还在追赶中。
4. 过于显式,有时候写得累
Zig 强迫你对每个操作都做到显式交代,这牺牲了简洁性,有时候简单操作也变得啰嗦。未使用的变量直接报编译错误,没法降级成警告。这门语言很有主见------而且有时候这个主见就是"你得按我的规矩来"。
5. 并发模型比较基础
和 Go 这类语言相比,Zig 的并发模型偏"原始"。异步支持在自举编译器里都还没完全实现。如果要做复杂的并发模式,你就得自己多干很多活。
6. 学习曲线确实不低
虽然老 C 程序员会觉得 Zig 很自然、很合逻辑,但对很多人来说门槛依然很高。文档在某些地方还不完整,而你学的是一门仍在演变的语言,文档偶尔会落后于现实。
落地可行性与实际应用场景
当前已经能稳定上生产的领域(有真实案例)
JavaScript 运行时:Bun 是 Node.js 的替代品,完全用 Zig 写的。它在 HTTP 基准测试中比 Node.js 快 3 倍,启动时间也短得多。作者 Jarred Sumner 选择 Zig,是因为 Go 的垃圾回收会和 JavaScriptCore 自身的 GC 冲突,而 Zig 的 C 互操作让他能无缝集成 JavaScriptCore。
金融数据库:TigerBeetle 是一个分布式金融交易数据库,完全用 Zig 开发,处理数百万笔交易时能保证绝对一致性和微秒级延迟。其创始人为 Zig 软件基金会捐赠了 51.2 万美元。这是真正处理真金白银的关键业务。
终端模拟器:Ghostty,一个由 HashiCorp 创始人 Mitchell Hashimoto 用 Zig 从头构建的现代终端模拟器,证明了 Zig 在 GUI 这种性能敏感场景中的可行性。
交叉编译基础设施:Uber 用 Zig 的工具链来跨平台编译他们的 C/C++ 代码,光是交叉编译这个能力就已经让 Zig 在生产环境里站稳了脚跟。
机器学习推理:ZML,一个用 Zig 构建的推理引擎,能把大模型带到 AMD GPU 上,其中 92.7% 的代码是 Zig。这是严肃的高性能计算工作。
Web 框架:Vercel Labs 开源了 Zero-Native,一个用 Zig 写的跨平台原生应用框架,可以把 Next.js、React、Vue、Svelte 等前端和 Zig 后端结合起来。
适合你用 Zig 的场景
- 需要手动控制内存、又不想要 C 那些坑的系统编程。
- 嵌入式开发:ReleaseSmall 模式和交叉编译对资源受限环境很友好。
- 游戏开发:Mach Engine 这个 Zig 游戏引擎已经展示了它的潜力。
- 对延迟敏感的微服务,比如 API 网关、数据库驱动,Zig 的性能可预测性很宝贵。
- 想逐步改造现有的 C/C++ 代码库,通过 C 互操作增量引入 Zig,而不必全盘重写。
目前还不太适合的场景
- 快速原型开发:显式风格和手动内存管理决定了它比 Python 或 Go 慢。
- Web 后端开发:虽然有 Zero-Native,但生态相比老牌语言还差得远。
- AI/ML 数据科学:除了 ZML,这块几乎空白。
- 追求极致稳定的团队:如果你完全无法容忍语言变动或生态动荡,那就等 1.0 再说。
写在最后
Zig 没想过要成为下一个 Rust,也没想成为下一个 Go,甚至连"取代 C"都不是它的首要目标------Andrew Kelley 明确说过,Zig 的愿景是成为"未来五十年通用的语言",而不是只为了替代 C。
Zig 给你的,是一种回归简单的体验,但同时并未牺牲能力。没有隐藏控制流,没有 GC 停顿,没有借用检查器之争。只有明确可预期的代码,性能不输 C,和 C 互操作起来也毫无障碍。
那个迟迟不来的 1.0,其实不是缺陷,而是刻意为之------在做出稳定性承诺之前,先把基础打牢。非营利基金会的架构也意味着没有商业压力催着提前发布。目前项目已通过社区筹集了大约 67 万美元资金,并且已经有了处理数十亿请求的真实生产案例。
权衡很现实:生态不成熟、语言还在变、学习门槛高。但如果你做的正是性能关键、需要和 C 交互、嵌入式、游戏引擎或基础设施软件这类项目,那么 Zig 今天就已经是一个值得认真考虑的选择。