News Hacker|极客洞察

663 3 天前 twitter.com
😬Bun Rust 重写 99.8% 过测试,AI/Anthropic 动机与可维护性争议
测试都过了,谁还需要理解代码?

🎯 讨论背景

Bun 是一个面向 JavaScript/TypeScript 的 runtime、bundler 和 package manager,底层核心依赖 JavaScriptCore(Safari 使用的 JavaScript 引擎),原实现主要用 Zig(一个接近 C 的低级语言)编写。这里讨论的是一个实验性 Rust 分支:在 Linux x64 glibc 上,它已经对 Bun 既有测试套件达到 99.8% 兼容,且代码规模接近百万行。评论里还提到,Bun 的很多测试本身就是 JavaScript/E2E 测试,天然适合把“原实现+测试套件”当作迁移目标。争议背景则来自 Anthropic 收购 Bun、作者可调用更强的内部模型(如 Mythos)以及 Zig 社区的严格 no-LLM 政策,这让技术实验、产品路线和营销意图被混在一起讨论。

📌 讨论焦点

LLM 适合带测试套件的迁移

很多人把这次重写看成一次“翻译”任务,而不是从零写系统:已有的 Bun 代码、JavaScript 测试和清晰的行为目标,让 LLM 可以边改边用测试回馈。有人指出,Bun 的测试大多本身就是在 Bun 里跑的黑盒/E2E 测试,这种环境特别适合 agent 反复迭代;还有人问到多 agent、模型选择和 token 消耗,认为这类任务会越来越依赖算力而不是人工码时长。也有评论强调,最后那 1% 往往最难,能否继续推进比“先做出原型”更关键。单纯把它当成“几天内写出 96 万行代码”并不能说明全部价值,但确实说明带测试的迁移是 LLM 的强项。

[来源1] [来源2] [来源3] [来源4] [来源5] [来源6] [来源7] [来源8]

测试通过不等于可维护/可信

反对者认为,99.8% 的测试通过率并不能说明新 Rust 代码已经真正可靠,因为测试往往只验证行为表面,覆盖不到架构、性能、UB 和全局可变状态。有人提到这次分支里可能有上万处 `unsafe`,如果这些地方没有被大幅收敛,就只是把风险从 Zig 换到 Rust。也有人担心这么快的迁移意味着没有足够的人类 review,最终会留下“没人真正懂”的代码。还有人举例说,历史上不少项目测试全绿却在真实使用里暴露出问题,因此对这种大型 runtime 直接 vibe coding 保持怀疑。

[来源1] [来源2] [来源3] [来源4] [来源5] [来源6] [来源7] [来源8] [来源9]

Rust 与 Zig 的工程取舍

讨论里反复比较 Rust 和 Zig 的安全模型:Rust 依靠 borrow checker、ownership 和 RAII 把大部分内存错误提前挡住,但也会带来更复杂的重构和更慢的编译。Zig 支持 `defer`、arena allocator、显式 allocator 和较直白的 C 风格控制,很多人觉得它更轻,但也承认它不提供 Rust 那种静态内存安全保证。与此同时,评论也在争论 `unsafe Rust` 到底是“可控地危险”还是“比 C/Zig 更难写对”。编译速度和 incremental compilation 也被反复提到,因为在 LLM 工作流里,编译回合太慢会直接拖垮迭代效率。

[来源1] [来源2] [来源3] [来源4] [来源5] [来源6] [来源7] [来源8] [来源9] [来源10] [来源11] [来源12]

Anthropic 动机与营销嫌疑

不少人把这次重写看成 Anthropic 的展示窗口:Bun 已被收购,作者又在公开场合强调 Claude/LLM 的效果,于是有人直接把它理解成 Claude Code 的宣传片。另一派则认为,工程上先跑实验、再根据结果改变方向很正常,原先说“没有意向重写”并不等于永远不改主意。真正该看的还是测试、性能和能否继续迭代,而不是把一次试验自动翻译成阴谋。争议更像是信任问题:一边觉得公司和个人动机都在包装故事,另一边觉得把一切都解释成营销阴谋太过头。

[来源1] [来源2] [来源3] [来源4] [来源5] [来源6] [来源7] [来源8] [来源9] [来源10] [来源11] [来源12] [来源13] [来源14]

对 Zig / Bun 生态的信号

有些评论把 Bun 视为 Zig 的门面项目,所以改投 Rust 会被看成对 Zig 的一记重击,甚至可能劝退想在大项目里选 Zig 的人。也有人反驳说,Zig 仍然年轻、还没 1.0,而且像 TigerBeetle、Ghostty 这类项目仍在证明它能做出稳定软件。Bun 的选择更多反映自身需求和团队节奏,不代表 Zig 这个语言本身失败。围绕 Bun 早前向 Zig 提交的补丁和 AI 政策,讨论最后也落到“这更像项目分手,而不是语言判死刑”。

[来源1] [来源2] [来源3] [来源4] [来源5] [来源6] [来源7] [来源8] [来源9] [来源10] [来源11]

LLM 把编程推向规格/自然语言

另一条线索是在讨论软件会不会越来越像“先写规格,再让 LLM 生成代码”。有人说 English 会变成编程语言的前端,甚至出现一种更适合喂给模型的“tokenese”;也有人分享自己用 Korean、Polish、French、Spanish 写提示词的经验,发现可用但不一定更精确。反对者则提醒,自然语言仍然含糊,而真正的系统规范最终还是得落回代码、测试和可验证约束。这个方向也引出更大的猜想:未来 Git 仓库里可能只剩 tests、specs,甚至连代码都由 agent 代写。

[来源1] [来源2] [来源3] [来源4] [来源5] [来源6] [来源7] [来源8] [来源9] [来源10] [来源11] [来源12] [来源13]

📚 术语解释

unsafe blocks: Rust 中显式绕过 borrow checker 的代码块,允许执行指针、FFI 等不安全操作,但也可能引入 UB。

borrow checker: Rust 编译器的所有权/生命周期检查器,用来在编译期阻止悬垂引用、数据竞争等。

RAII: Resource Acquisition Is Initialization;靠对象作用域结束自动释放资源的模式。

defer: Zig 中用于在作用域结束时执行清理代码的语法。

arena allocator: 一次性分配一大块内存、最后整体释放的 allocator,常用于临时对象管理。

FFI: Foreign Function Interface,跨语言调用接口,例如 Rust/Zig 调用 C API。

glibc: GNU C Library,Linux 上最常见的 C 标准库/运行时之一。

JavaScriptCore (JSC): Apple Safari 使用的 JavaScript 引擎,Bun 的底层核心之一。

vibe coding: 主要依赖 LLM 生成代码、人工只做轻审阅的开发方式。