# 百万行代码两周迁完:Anthropic如何用Claude Code做大规模代码迁移
今天聊 Claude Code的最新博客。
前面我们在 动态工作流 里讲过,Claude 可以现场写 harness,把任务拆给一队 Agent;又在 Loop Engineering 实战 里讲了怎么用测试、状态和停止条件守住循环。
Anthropic 最新这篇博客(https://claude.com/blog/ai-code-migration),正好给了一个最硬的生产案例:拿 Claude Code 迁移整套编程语言,而且不是几千行 Demo,是百万行生产代码。
# 两个数字,先把迁移规模摆出来
第一个案例是 Bun。Jarred Sumner 用 Claude Code 把 Bun 从 Zig 迁到 Rust,不到两周产出 100 万行代码,合并前 CI 中原有测试全部通过。合并后暴露了 19 个回归,目前已经全部修掉。
第二个案例来自 Anthropic Labs。Mike Krieger 用一个周末,把 Python 代码库迁成 16.5 万行 TypeScript。过程中跑了数百个 Agent、8 道阶段闸门、3 轮对抗审查,最后逐条 diff 新旧程序的命令输出。
Anthropic 过去一个月一共迁了 10 个代码包,每个包都有数万到数十万行。
注意,这不是“Claude 一次把代码翻译对了”。真正让规模迁移成立的,是它把迁移改造成了一条可以反复运行、机械验收、失败后继续收敛的生产线。

人不再追着每个文件改。人负责规则、裁判和异常模式,Agent 负责把队列烧完。
原文那句最值钱的话可以翻成:别修代码,修产生代码的循环。
# 为什么代码迁移特别适合多 Agent
大规模迁移刚好满足 Agent 最喜欢的几个条件。
工作能并行。 上千个文件、crate 或模块可以切成独立批次,不需要一个 Agent 从头写到尾。
旧代码就是规格。 需求文档可能缺,但原程序已经把行为写出来了。Agent 可以同时对照源语言、目标语言和真实输出。
有机械裁判。 编译器、冒烟测试、完整测试套件、命令输出 diff,都能明确告诉 Agent 对还是错。失败结果还会自动变成下一轮任务队列。
规则可以向后传播。 一个 Agent 发现边界问题,不是只补当前文件,而是把解法写回迁移规则,后面的 Agent 全部按新规则执行。
这也是它和普通“批量翻译代码”的根本区别:并行只负责提速,统一规则和机械验收才负责不失控。
# 动手前,先造一个能判新旧代码的裁判
Anthropic 把强裁判列为前置条件。没有它,你连“迁完了”是什么意思都说不清。
很多旧测试会直接调用源语言内部函数,换语言后根本跑不了。正确做法是先把测试分类,挑出可以通过外部接口表达的行为,再改造成能同时打在新旧程序上的可移植测试。
裁判还必须做一次反向验证:原程序应该通过,故意破坏的程序必须失败。抓不住已知错误的测试,不是裁判,只是安慰剂。
Mike 没有现成的跨语言测试,就做了 7 个真实场景的 parity harness,把 Python 和 TypeScript 输出逐项比较,任何行为差异都算 Bug。
# 六步迁移,最重要的工作都发生在大规模翻译前
第一步,建立规则手册、依赖图和差距清单。
规则手册先规定类型、惯用法和架构怎么映射;依赖图决定哪些文件先迁、哪些必须放在同一批;差距清单专门记录无法直接翻译的隐性知识,比如 Zig 的手动内存管理怎么落到 Rust 所有权,Python 的动态对象怎么变成 TypeScript 接口。
顺序不能反。先定默认规则,再找默认规则盖不住的差距。
第二步,用小样本把规则撞一遍。
Bun 迁移时,一个 Agent 按规则翻 3 个文件,另一个 Agent 像资深 Rust 工程师一样翻同样的文件,第三个 Agent 比较差异并补规则。只跑这轮小实验,就提前抓到两个会扩散到 1448 个文件的关键问题。

这里最反直觉的是:试迁出来的代码全部扔掉。 这一轮的产物不是代码,是更可靠的规则。结构不保留的重设计也一样,先让对抗 Agent 攻击设计文档,再做一次可丢弃的端到端迁移。
第三步,再把翻译任务铺开。
批处理脚本从磁盘重建待办队列,“目标文件存在”才算完成,所以任务天然可以暂停、恢复。高吞吐翻译交给较小模型,写规则和做审查留给更强模型。两个独立审查 Agent 意见不一致,再交给第三个 Agent 仲裁。
如果同一种错误反复出现,别手补十个文件。给规则手册加一句,再重新生成受影响的那一批。
第四到第六步,依次编译、运行、对齐行为。
编译错误由 fixer agents 分批处理;崩溃交给冒烟测试;最后把新旧程序放到同一套测试或真实场景里比行为。昂贵的全量构建由单独的 build daemon 串行执行,避免几十个 Agent 同时抢着重编。

这时人的注意力不该放在某一个红叉,而要看哪些红叉总以同一种方式出现。单点失败交给 loop 消耗,重复模式才值得人修改上游规则。
# 百万行迁完了,账也要算清楚
AI 把语言迁移从“多年豪赌”变成了“昂贵但可以重跑的工程实验”,不等于免费。
Bun 迁移消耗了 59 亿 uncached input tokens 和 6.9 亿 output tokens,按 API 价格约 16.5 万美元。但过去百万行迁移可能是 4 年、300 万到 400 万美元的人力项目。最坏情况也从“维护两套半成品几年”,变成“删掉分支,改好规则再跑一次”。
效果也不是只看行数。Bun 的一个 2000 次重复构建基准,内存占用从 6745 MB 降到 609 MB;Linux 和 Windows 二进制缩小 19%,部分真实负载快了 2%~5%。不过约 4% 的 Rust 代码仍在 unsafe 块里,说明迁移不会凭空消灭底层边界。
Python 到 TypeScript 的项目也有明确收益:原来每个平台编译约 8 分钟,整个矩阵要等 30 分钟;迁移后约 2 秒,启动快 6 倍,还删掉了一条独立部署流水线。
所以别因为“Claude 能迁”就迁。业务收益、测试裁判、Token 预算、审查能力,四样缺一个,都可能把漂亮 Demo 变成昂贵烂尾。
# 最后
这篇博客真正改写的,不是“AI 会不会翻译 Rust”。
它改写的是大项目的风险结构:以前人怕迁到 90% 后骑虎难下,现在可以先把裁判和规则做扎实,再让机器反复重跑。
代码可以重生成,规则必须能解释,结果必须由机器验。
# 参考链接
- Anthropic 官方博客(How Anthropic runs large-scale code migrations with Claude Code):https://claude.com/blog/ai-code-migration
评论
验证登录状态...