风险提示:理性看待区块链,提高风险意识!
USDT USDT $1.00 0.01%
XRP XRP $1.43310000 0.19%
BNB BNB $637.54000000 0.02%
USDC USDC $0.99963000 0.01%
SOL SOL $86.49000000 0.99%
TRX TRX $0.32360000 1.25%
BTC BTC $67,234.00 2.34%
ETH ETH $3,456.00 1.23%
CoinMeta Skill
限时免费体验

让 AI 更快获取有效、准确、可行动的币圈全景信息

Bun 从 Zig 迁移至 Rust:一场 11 天的 AI 协作重写实践

摘要

一次史无前例的运行时重写 2026 年 5 月,Bun 项目完成了一次在软件工程实践中极为罕见的大规模语言迁移——将主体代码从 Zig 全面重写为 Rust。整个迁移过程自 5 月 3 日启动,至 5 月 14 日合并入主分支,仅用 11 天...

Bun 从 Zig 迁移至 Rust:一场 11 天的 AI 协作重写实践

一次史无前例的运行时重写

2026 年 5 月,Bun 项目完成了一次在软件工程实践中极为罕见的大规模语言迁移——将主体代码从 Zig 全面重写为 Rust。整个迁移过程自 5 月 3 日启动,至 5 月 14 日合并入主分支,仅用 11 天。其中实际编码耗时仅 6 天,全程公开进行。而项目作者 Jarred Sumner 撰写技术复盘博客却耗时近一个月,远超开发周期。

为何必须重写?内存与安全的双重困局

Bun 原本是一个高度集成的 JavaScript 运行时:它同时承担转译器、打包器、包管理器、测试运行器、模块解析器、HTTP/WS 客户端,并完整兼容 Node.js API。这种广度带来了极高的采用率——CLI 月下载量超 2200 万次,也被 Vercel、Railway、DigitalOcean 等平台深度集成。

但广度也放大了底层复杂性。Zig 作为手动内存管理语言,与 JavaScript 引擎(如 JavaScriptCore)的垃圾回收机制共存,导致内存模型严重冲突。最典型的症状是 Bun.build() 的持续内存泄漏:每执行一次构建即泄漏约 3MB,2000 次后内存飙升至 6.7GB,最终触发进程崩溃。

更深层的问题遍布各模块:zlib.reset() 触发堆释放后使用;http2 回调引发哈希表重哈希导致流指针失效;UDPSocket.sendMany() 在用户回调中变更状态引发越界写入;crypto.scrypt 缓冲区分配失败后资源永久泄漏……这些看似孤立的崩溃,根源高度一致——GC 与裸指针在同一线程、同一内存空间中混用,使每一处内存生命周期都成为高风险决策点。

团队已尽最大努力:为 Zig 编译器添加 AddressSanitizer 支持,CI 全量启用 ASAN;Windows 上强制 ReleaseSafe 构建;7×24 小时 Fuzzilli 模糊测试;大量端到端内存泄漏检测。但崩溃报告仍源源不断。Sumner 写道:“我厌倦了带着对 Bun 崩溃的担忧去睡觉。”

Rust 版本:稳定、精简、更快

重写完成后,Bun v1.4.0 成为首个 Rust 主干版本,v1.3.14 是最后一个 Zig 版本。关键指标显著改善:

  • 内存稳定性:同样执行 2000 次 Bun.build(),内存稳定在 609MB,彻底消除累积泄漏;
  • 缺陷修复:v1.4.0 解决了 v1.3.14 中全部 128 个可复现 bug,涵盖崩溃、泄漏、文本渲染异常等;
  • 二进制体积:Linux/Windows 下减少约 20%,得益于 Rust 优化、ICU 替换与代码折叠;
  • 性能提升:Bun.serve 吞吐量从 16.96 万 req/s 提升至 17.77 万;node:http 从 10.38 万升至 10.85 万;next build 缩短 0.59 秒;tsc 批量编译快 0.05 秒;Claude Code 启动时间缩短 10%(517ms → 464ms)。

方法论:不是“AI 写代码”,而是“AI 协作系统”

Sumner 并未让 AI 直接生成最终代码,而是构建了一套动态协作工作流体系。整个迁移被拆解为约 50 个独立工作流,每个工作流遵循统一闭环:
「任务上下文 → Claude 实现者生成代码 → 两名独立 Claude 审查者对抗式审查(预设“代码默认错误”)→ 反馈整合 → 进入下一任务」

工作流覆盖全链路:生成 Zig-to-Rust 映射指南、机械翻译源文件、修复 crate 编译错误、驱动子命令(如 bun test)可运行、逐批通过全部测试、多轮重构清理。峰值阶段,4 个工作树并行运行,每个树内调度 16 个 Claude 实例,总计 64 个实例协同作业,最高达每分钟输出 1300 行代码。

面对 Rust crate 拆分带来的约 16000 个编译错误,系统按 crate 分组、分片处理;测试套件则随机分片至 4 个工作树,单次运行 100 个测试文件。Linux 平台失败测试数两天内从 972 个降至 23 个,一天半后归零;五天内,六大目标平台(Linux x64/arm64、macOS x64/arm64、Windows x64/arm64)全部绿灯通过。5 月 14 日,PR #30412 合并,所有测试 100% 通过,无跳过、无屏蔽。

未竟之路:unsafe、回归与可维护性挑战

重写并非终点。当前 Rust 版 Bun 包含约 13,000 处 unsafe 关键字,占总代码量(约 78 万行)的 4%,涉及 27,000 行代码。其中 78% 的 unsafe 块仅一行,多为对接 C/C++ 库的必要桥接。但对比同类工具 uv(35 万行代码仅 73 处 unsafe),Bun 的 unsafe 密度高出近 178 倍,其合理性仍需长期验证。

更严峻的是,部分“安全 Rust”代码中也暴露未定义行为——这类问题比 C++ 更隐蔽,因开发者天然信任安全块不会出错。例如,Zig 的 assert 是函数调用,每次构建必执行;Rust 的 debug_assert! 是宏,在发布版中整条表达式被剥离,导致语义差异引发回归。目前已知回归问题共 19 个,均源于此类语法相似但语义断裂的转换。

代码审查亦面临现实瓶颈:100 万行变更无法由人类逐行审阅。本次 PR 主要审查者为 claude[bot] 和 coderabbitai[bot]。Sumner 的审查策略是验证对抗审查是否捕获关键差异、确认转换指南执行合规性,并辅以人工抽读——但“抽读”的广度与深度未量化。

另一层隐忧在于生态归属。Bun 已于 2025 年底被 Anthropic 收购。当前核心维护能力高度依赖 Claude 模型及其内部工具链。社区反馈指出:贡献 PR 的门槛,实质上已变为“需接入 Anthropic 生态或依赖极少数理解 AI 生成代码逻辑的核心成员”。开源协作的开放性正面临结构性考验。

成本再思考:16.5 万美元买来的不只是时间

本次迁移 API 成本约为 16.5 万美元,相当于 3 名熟悉 Bun 的工程师全职工作一年。表面看极具性价比——按硅谷资深工程师平均总包 50 万美元估算,11 天人力成本已超 70 万美元。但账面数字掩盖了真实投入:所用为 Claude Fable 5 预发布版,属未公开、受出口管制的高阶模型;背后是 Anthropic 巨额模型研发、训练与算力投入,保守估计总成本远超 150 万美元。

更本质的成本不在账单上:6778 次提交构成的代码库,尚无一人通读;当前稳定不等于长期可靠。当某日凌晨三点出现难以复现的并发异常,值班工程师面对的将是一个逻辑路径由 AI 构建、文档滞后、心智模型缺失的系统。未来维护或将持续依赖 AI 辅助,而这种“AI-依赖型开源”的可持续性与责任边界,仍是悬而未决的关键命题。

评论 (5)

登录 后即可发表评论
一路长红

用 AI 协作重写是新尝试,可后续安全、可维护性和生态问题得好好解决。

0 回复
摩根士丹利

Rust 版改善明显,可 unsafe 密度太高,回归问题也麻烦,代码审查还难搞。

0 回复
许墨
许墨 3周前

这迁移速度真快,但 1.65 万美元成本看着低,实际投入高,以后维护是个大问题。

0 回复
尚竞
尚竞 3周前

11 天重写很厉害,可依赖 AI 太多,开源协作开放性和维护可持续性存疑。

0 回复
天生白玉京

迁移后指标提升不错,不过成本没算全,AI 构建的系统维护起来估计够呛。

0 回复
更多