上午十点,我盯着屏幕上的那行提交记录,咖啡已经凉透了。46d3bc29f270fa881dd5730ef1549e88407701a5 — 这个看起来像加密钱包私钥的字符串,悄悄躺在Bun的GitHub仓库里,标题平淡无奇:“Add Zig → Rust porting guide”。

但懂行的人都知道,这相当于在编程语言圈的微信群里发了一句:“兄弟们,我打算换个老婆,先看看离婚协议怎么写。”

代码提交截图

一场"预谋已久"的出走?

事情是这样的:Bun,那个号称"比Node快100倍"的JavaScript运行时,当初选择Zig作为底层语言时,可是带着"颠覆者"的光环登场的。创始人Jarred Sumner曾在推特大放厥词:“Zig是系统编程的未来”。结果呢?短短两年后,一份576行的《移植指南》静静躺在docs文件夹里,开篇第一句就很有那味儿:

“你正在将一个Zig文件翻译成Rust。在写任何代码之前,请先读完本文档。”

翻译翻译,什么叫"翻译"?这哪是技术文档,分明是《叛逃者生存手册》。

我翻着那份指南,忍不住笑出声。里面细致到令人发指:defer x.deinit()要改成Rust的Drop trait,[]const u8要根据上下文决定是&[u8]还是Box<[u8]>,甚至连变量命名规则都规定得明明白白 — toAPI变成to_apiisCSS变成is_css。这哪是移植代码,这是在给代码办移民手续,连口音都要矫正。

为什么是现在?为什么是Rust?

说实话,作为一个写过几年Go、偶尔玩玩Rust、对Zig保持"围观吃瓜"态度的开发者,我对这件事的第一反应不是震惊,而是"哦,终于来了"。

尼采在《善恶的彼岸》里说过:"与怪物战斗的人,应当小心自己不要成为怪物。"我觉得这句话放在编程语言选型上意外地合适。当初选Zig,是因为它简单、可控、没有历史包袱;但现在,当项目规模膨胀到57万行代码、1300个文件时,“简单"可能就变成了"简陋”,“可控"可能就变成了"难以协作”。

在这里插入图片描述
这份迁移指南显然不像是给人写的,而更像是给Claude Code写的

在这里插入图片描述

有几个细节很有意思:

第一,这份指南明确禁止使用tokioasync fnstd::fs等标准Rust异步生态。为什么?因为Bun有自己的事件循环,有自己的内存分配器(mimalloc),有自己的字符串类型。这不是在"用Rust重写",这是在"用Rust的语法写Bun"。就像你请了个法国厨师,但要求他只能用中餐的炒锅和酱油 — 做出来的到底是法餐还是中餐?这是个哲学问题。

第二,移植策略是"文件对文件,行对行",而且大量依赖AI辅助。指南里甚至写了"用Claude批量翻译"。这让我想起自己第一次用Copilot写代码时的忐忑:它写的真的对吗?但转念一想,57万行代码,人工移植得猴年马月?工程现实面前,理想主义得让路。正如维特根斯坦所说:“对于不可言说之物,必须保持沉默” — 对于不可手动移植的代码,也许就该让AI先上。

第三,社区反应极其分裂。有人欢呼"终于摆脱了预1.0的折磨",有人哀叹"信仰崩塌",还有人冷静分析"这可能是成本最优解"。我在评论区看到一条高赞:“This whole thread is an overreaction. 302 comments about code that does not work.” — 说得太对了。这目前只是一个实验分支,连编译都未必能过,大家已经快进到"语言战争"了。人类的本质果然是复读机+预言家。

我认为这个事情的导火索还是源于Antropic在去年12月下定决心收购bun开始,我们知道前几个月闹得沸沸扬扬的Claude Code源码泄露,可以看出Claude Code本身就是基于bun来构建的一个cli项目。

而bun最初使用zig来写的,但是在今年四月份zig倒反天罡的官宣禁止AI对zig项目的贡献,一怒之下把zig仓库从github迁移到codeberg。
在这里插入图片描述
这显然和Claude Code甚至和目前的AI编码趋势格格不入,虽然如今的AI编码并非实现精确编程,即使每天使用AI的人,也会遇到很多AI无法解决甚至给出误导性的答案。

写到这里,我想插播一段个人经历。

三年前,我参与过一个微服务重构项目。团队花了两个月争论是用Go还是Rust,开了无数会,写了无数RFC,最后因为一个关键依赖库只支持Go,全员含泪(并没有)选了Go。上线后性能提升了30%,但真正让系统稳定的,不是语言本身,而是我们加的监控、写的测试、设计的降级策略。

所以当我看到大家为"Zig vs Rust"吵得不可开交时,我总忍不住想:我们是不是把工具当成了信仰?

这场"叛逃"会成功吗?

说实话,我不知道。但我有几个观察:

  1. 技术层面:如果真能保持"逻辑对逻辑"的移植,性能理论上不会有太大波动(毕竟都编译到LLVM IR)。但维护成本、开发者体验、生态兼容性,这些软性指标更难量化。

  2. 社区层面:开源项目的生命力很大程度上取决于"讲故事"的能力。从"用最新锐的Zig"变成"用更成熟的Rust",这个叙事转变需要极高的沟通技巧。搞不好就会变成"当初吹牛现在打脸"的公关危机。

  3. 个人层面:作为开发者,我其实挺兴奋的。不管最后用啥语言,能看到一个大型项目如何系统性地进行语言迁移,本身就是宝贵的学习机会。就像看别人搬家,虽然自己不用搬,但能学到打包技巧不是?

从个人的角度,我还是比较赞赏这样的尝试,它展示了一种全新的AI协作开发的模式,人类定义做什么,和怎么做,AI负责具体的执行。

苏格拉底说:"唯一不变的是变化本身。"这句话被引用得太多了,多到几乎成了鸡汤。但放在技术选型这个场景下,它突然有了重量。

我们今天讨论的"Zig还是Rust",五年后可能变成"Rust还是Mojo",十年后可能变成"还是别自己写运行时了用WASM吧"。技术的浪潮永远在变,但有些东西是不变的:对性能的追求、对可维护性的执着、对开发者体验的关怀。

所以,当你在深夜刷到这条新闻,与其急着站队,不如泡杯咖啡,想想自己项目里那个"当初选它是因为简单,现在想换是因为复杂"的模块。也许答案不在语言之争里,而在你对问题本质的理解中。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐