用一队并行的 Claude 构建 C 编译器
发布日期: 2026年2月5日
作者: Nicholas Carlini,Anthropic Safeguards 团队的研究员。
概述
本文描述了一个"Agent 团队"实验——多个 Claude 实例在没有主动人工干预的情况下在共享代码库上并行工作。作者分配了16个 Agent 从零开始编写一个基于 Rust 的 C 编译器,能够编译 Linux 内核。在近2000个 Claude Code Session 和$20,000的 API 成本中,Agent 团队产生了一个100,000行的编译器,可以在 x86、ARM 和 RISC-V 上构建 Linux 6.9。
编译器可在 github.com/anthropics/claudes-c-compiler 获取。
启用长时间运行的 Claude
现有的 Agent 脚手架如 Claude Code 需要操作员在线。为了激发持续的自主进展,作者构建了一个 Harness,将 Claude 放入一个简单的循环中——当它完成一个任务时,立即拿起下一个。Bash 脚本在 while true 循环中使用 claude --dangerously-skip-permissions,每次提交记录输出。Agent 提示指示 Claude 将问题分解为小块,跟踪进度并继续前进。正如作者指出的,"循环永远运行——尽管在一个实例中,我确实看到 Claude 不小心执行了 pkill -9 bash,从而杀死了自己。"
并行运行 Claude
并行运行多个实例解决了两个弱点:单个 Session 一次只能做一件事,多个 Agent 允许专业化。
实现创建了一个裸 Git 仓库,每个 Agent 获得一个挂载了仓库的 Docker 容器。每个 Agent 克隆一个本地副本,工作,然后将更改推送到上游。一个简单的同步算法防止冲突:
- Claude 通过向
current_tasks/写入文本来"锁定"一个任务。Git 同步迫使第二个 Agent 如果两个 Agent 尝试认领同一个任务则选择不同的任务。 - Claude 工作,从上游拉取,合并更改,推送,然后移除锁定。合并冲突很频繁但 Claude 能处理。
- 无限循环在新容器中生成新的 Session。
没有编排 Agent——每个 Claude Agent 独立决定如何行动,通常拾取"下一个最明显"的问题。
使用 Claude Agent 团队编程的经验
编写极高质量的测试
Claude 自主工作,因此"任务验证器近乎完美很重要,否则 Claude 会解决错误的问题。"作者构建了持续集成流水线,并在识别出失败模式时加强了强制执行。
站在 Claude 的角度思考
测试 Harness 是为 Claude 而不是人类设计的。指令包括维护广泛的 README 和频繁更新的进度文件。作者围绕 LLM 的固有局限性进行设计:
- 上下文窗口污染: Harness 不应打印数千个无用字节。重要信息写入日志文件。日志应易于处理——"如果有错误,Claude 应该写 ERROR 并将原因放在同一行,以便 grep 能找到。"聚合摘要统计数据是预计算的。
- 时间盲视: Claude 无法判断时间,"会愉快地花几个小时运行测试而不是取得进展。"Harness 包含一个
--fast选项,运行1%或10%的随机样本,每个 Agent 确定性但在 VM 之间随机。
使并行变得简单
当有许多不同的失败测试时,并行化是微不足道的——每个 Agent 选择一个不同的测试。达到99%通过率后,每个 Agent 编译一个不同的小型开源项目(SQLite、Redis、libjpeg、QuickJS、Lua)。
编译 Linux 内核更难,因为它是一个巨大的任务——每个 Agent 都会遇到同一个 bug 并覆盖彼此的更改。修复使用 GCC 作为预言机:一个新的 Harness 随机地用 GCC 编译内核的大部分文件,只用 Claude 的编译器编译剩余的文件,使每个 Agent 能够修复不同文件中的不同 bug。对于一起失败但独立工作的文件对,仍然需要增量调试。
多个 Agent 角色
并行化启用了专业化:一个 Agent 合并重复代码,另一个改进编译器性能,第三个专注于输出高效的编译代码,另一个从 Rust 开发者的角度批评设计,还有一个处理文档。
压力测试 Agent 团队的极限
该项目作为能力基准。之前的 Opus 4 模型勉强能够产生功能性编译器。"Opus 4.5 是第一个跨越门槛的模型,使其能够产生可以通过大型测试套件的功能性编译器。"Opus 4.6 被测试以进一步推进。
评估
在两周的近2000个 Session 中,Opus 4.6 消耗了20亿个输入 Token 并生成了1.4亿个输出 Token,成本接近$20,000。这是一个干净室实现,没有互联网访问,仅依赖 Rust 标准库。
100,000行的编译器可以在 x86、ARM 和 RISC-V 上构建可启动的 Linux 6.9。它还能编译 QEMU、FFmpeg、SQLite、Postgres、Redis,在大多数编译器测试套件(包括 GCC 压力测试套件)上达到99%的通过率,并且可以编译和运行 Doom。
局限性包括:
- 缺少启动 Linux 超出实模式所需的16位 x86 编译器(为此调用 GCC)
- 没有自己的汇编器和链接器——这些仍然有些问题,演示使用了 GCC 的汇编器和链接器
- 成功构建了许多项目但不是全部——还不是真实编译器的直接替代品
- 生成的代码效率低于禁用所有优化的 GCC
- Rust 代码质量合理但远未达到专家水平
编译器几乎达到了 Opus 能力的极限。"新功能和 bug 修复经常破坏现有功能。"作为一个特别具有挑战性的例子,Opus 无法实现16位 x86 代码生成器——虽然它可以通过操作码前缀输出正确的16位 x86,但输出超过了 Linux 强制的32k 代码限制,因此 Claude 调用 GCC 来处理 x86(但完全自己编译 ARM 和 RISC-V)。
展望
作者将 Agent 团队定位为展示了"自主实现整个复杂项目的可能性",允许用户制定更雄心勃勃的目标。然而,完全自主的开发伴随着真正的风险——当测试通过时,很容易认为工作已经完成,"而这很少是事实。"作者表达了兴奋和不安,指出"程序员部署他们从未亲自验证过的软件这一想法是一个真正的担忧。"
快速进展"打开了编写大量新代码的大门",预计正面应用将超过负面,但需要"新的策略来安全导航。"
致谢
感谢 Josef Bacik、Edwin Chen、Bernardo Meurer Costa、Jake Eaton、Dan Kelley、Felix Klock、Jannet Park、Steve Weis 以及 Anthropic 其他同事。