Bun PR :从 Zig 到 Rust 的技术迁移
近期,JavaScript 运行时 Bun 的 GitHub 仓库中出现了一个名为 "Porting Bun to Rust" 的 Pull Request (#30412) (https://github.com/oven-sh/bun/pull/30412)。该 PR 标志着 Bun 核心代码库从 Zig 语言向 Rust 语言的逐步迁移。
这次 Pull Request 的改动非常多,大家可以看到上面这个图中:共有 6,755 个 commit 涉及 2,188 个文件的改动。截止目前,这个 PR 已经成功 merge 了。
从首页的语言占比上可以看到,Rust 语言占比已经达到 46.5%,Zig 仍然占比 32.3%。所以看起来 Rust 并没有完全替代掉 Zig,但这可能只是第一步。
Bun 在发布之初,因其出色的性能表现而受到广泛关注。其核心部分采用 Zig 语言编写,旨在利用 Zig 提供的底层控制能力和与 C/C++ 的良好互操作性,以实现高性能的运行时。然而,Bun 对 Zig 的使用并非完全遵循原生 Zig 的标准实践。
据观察,Bun 团队对 Zig 语言及其工具链进行了一定程度的定制和修改 (https://weeklyrust.substack.com/p/the-great-zig-to-rust-experiment)。[2] 这种定制化在项目早期可能有助于满足 Bun 的特定性能需求,但也带来了一系列挑战:
- 维护负担
:Zig 语言本身仍处于快速发展阶段,其规范和工具链不断演进。Bun 团队需要投入额外资源来维护其定制化的 Zig 版本,并使其与上游 Zig 的更新保持同步,这增加了项目的长期维护成本。 - 生态系统兼容性
:由于采用了定制化的 Zig 版本,Bun 在利用 Zig 社区的现有库和工具时可能面临兼容性问题。这限制了 Bun 借力 Zig 生态系统的能力,并可能导致在某些功能实现上需要重复造轮子。 - 人才招募
:Zig 语言的开发者社区相对较小,而熟悉 Bun 定制化 Zig 版本的开发者则更为稀缺,这可能对项目的人才招募和社区贡献造成一定障碍。
在权衡了 Zig 带来的优势与挑战后,Bun 团队决定将核心代码迁移至 Rust。这一决策主要基于以下几点考量:
- 内存安全与可靠性
:Rust 以其所有权系统和借用检查器在编译时强制执行内存安全,有效避免了空指针、数据竞争等常见的底层编程错误。对于 Bun 这种需要处理复杂内存管理和并发操作的运行时而言,Rust 提供的内存安全保证能够显著提升系统的稳定性和可靠性。 - 成熟的生态系统
:Rust 拥有一个庞大且成熟的生态系统,提供了丰富的第三方库、框架和完善的工具链。这使得 Bun 团队能够更高效地开发新功能,并集成现有高质量的解决方案,从而加速项目发展并降低开发成本。 - 性能与工程效率
:Rust 提供了接近 C/C++ 的高性能,同时通过其强大的类型系统和并发模型,提升了开发者的工程效率。Bun 可以在保持甚至提升性能的前提下,利用 Rust 的特性来优化代码结构和可维护性。 - 社区与人才
:Rust 社区活跃且规模庞大,吸引了大量优秀的系统级开发者。转向 Rust 有助于 Bun 吸引更多贡献者,进一步壮大其开源社区,并为项目的长期发展提供更坚实的人才基础。
值得注意的是,Bun 仓库中存在一个 .claude 目录 (https://github.com/oven-sh/bun/blob/main/CLAUDE.md),其中包含skills、commands 和 hooks 等子目录。这表明 Bun 团队可能正在利用 AI 辅助工具来管理和执行此次大规模的语言迁移。这种工程实践可能包括:
- 知识库与指南
: .claude/skills目录下的SKILL.md文件 (例如:JavaScriptCore 绑定相关 (https://github.com/oven-sh/bun/blob/main/.claude/skills/implementing-jsc-classes-zig/SKILL.md)、系统调用 (https://github.com/oven-sh/bun/blob/main/.claude/skills/zig-system-calls/SKILL.md) 和垃圾回收机制 (https://github.com/oven-sh/bun/blob/main/.claude/skills/javascriptcore-garbage-collector/SKILL.md) 等) 可能作为 AI 代理的参考资料,指导其理解和执行特定的代码转换或重构任务。 - 自动化流程
: .claude/settings.json(https://github.com/oven-sh/bun/blob/main/.claude/settings.json) 中定义的PreToolUse和PostToolUse钩子,以及相关的脚本 (如pre-bash-zig-build.js(https://github.com/oven-sh/bun/blob/main/.claude/hooks/pre-bash-zig-build.js) 和post-edit-zig-format.js(https://github.com/oven-sh/bun/blob/main/.claude/hooks/post-edit-zig-format.js)),可能用于自动化代码检查、格式化、构建前验证等任务,以确保迁移过程中的代码质量和一致性。
这种 AI 辅助的迁移方式,体现了 Bun 团队在应对复杂技术挑战时的创新性工程实践。
Bun 从 Zig 到 Rust 的迁移是一项重大的技术决策,旨在通过利用 Rust 的内存安全、成熟生态系统和强大社区,进一步提升 Bun 的稳定性、可靠性和长期可维护性。尽管迁移过程将面临工程量大、兼容性处理等挑战,但如果成功,Bun 有望在 JavaScript 运行时领域继续保持其竞争力,并为开发者提供一个更健壮、更高效的工具。
参考链接:
Bun PR #30412: Porting Bun to Rust (https://github.com/oven-sh/bun/pull/30412) The Register: Anthropics Bun Rust rewrite merged at speed of AI (https://www.theregister.com/2026/05/14/anthropics_bun_rust_rewrite_merged_at_speed_of_ai/) Bun 仓库中的 CLAUDE.md (https://github.com/oven-sh/bun/blob/main/CLAUDE.md) Bun 仓库中的 implementing-jsc-classes-zig/SKILL.md (https://github.com/oven-sh/bun/blob/main/.claude/skills/implementing-jsc-classes-zig/SKILL.md) Bun 仓库中的 zig-system-calls/SKILL.md (https://github.com/oven-sh/bun/blob/main/.claude/skills/zig-system-calls/SKILL.md) Bun 仓库中的 javascriptcore-garbage-collector/SKILL.md (https://github.com/oven-sh/bun/blob/main/.claude/skills/javascriptcore-garbage-collector/SKILL.md) Bun 仓库中的 .claude/settings.json (https://github.com/oven-sh/bun/blob/main/.claude/settings.json) Bun 仓库中的 .claude/hooks/pre-bash-zig-build.js (https://github.com/oven-sh/bun/blob/main/.claude/hooks/pre-bash-zig-build.js) Bun 仓库中的 .claude/hooks/post-edit-zig-format.js (https://github.com/oven-sh/bun/blob/main/.claude/hooks/post-edit-zig-format.js)