用 AI agent 现代化遗留代码
来自 Mistral AI · 期号 2026-09-09
摘要
Mistral AI 用 AI agent 帮一家欧洲能源运营商把 4 万行 Fortran 77 迁移到了 C++。 关键做法是把代码拆成可独立测试的小单元,让 agent 并行生成翻译和测试用例。人工审查仍然必不可少,尤其是涉及安全的关键逻辑。 原文给出了完整的迁移流程和教训总结。
深读
导读 Mistral AI 的工程团队分享了他们用 AI agent 帮助一家欧洲能源运营商将 4 万行 Fortran 77 代码迁移到 C++ 的完整流程与教训。这不是一篇泛泛的「AI 能写代码」的宣传,而是详细记录了从构建数值校验框架、用 agent 并行文档化代码库,到最终确定「结构化工作流 + 人工把关」这一折中方案的全过程。读完能带走一套可复用的迁移方法论,以及 agent 在真实工程中能做什么、不能做什么的清晰边界。 关键信息 - 迁移对象是一个物理模拟器(油藏模拟器),4 万行 Fortran 77,没有测试套件,没有集中式文档。 - 迁移前先构建了数值一致性校验框架:在 Fortran 代码中插入状态导出子程序,C++ 端加载检查点进行逐值比对。 - 第一轮全自主 agent 尝试的结果是「用 C++ 语法重写的 Fortran」——COMMON 块变成全局结构体、GOTO 控制流原封不动。 - 最终采用的结构化工作流包含:生成目标 C++ 架构 → 工程师审查 → 拆成任务队列 → 每个任务走 plan → implement → test → repeat → 人工审查 PR 并请求修改。 - 第一个 sprint 完成了核心功能(4 万行),整个 Fortran 代码库共 30 万行。 逐节讲解 为什么语法翻译解决不了迁移问题 Fortran 77 在 1977 年标准化,代码直接反映了当时的语言约束:没有模块、没有命名空间、没有结构化类型。状态通过 COMMON 块(全局共享内存)传递,变量按首字母隐式决定类型,拼写错误会静默创建新变量而非报错。迁移到 C++ 需要做架构重构,把散布在 COMMON 数组中的数据封装成对象、把网格循环移到调用方,这使得逐行对照验证变得不可能。文章用一个一阶泰勒展开的例子展示了这种差异:Fortran 版输入输出都在全局 COMMON 块中,C++ 版则返回一个带显式类型的值。 先建校验框架,再动代码 在让 agent 开始翻译之前,团队先构建了数值一致性校验框架。一致性定义为输出结果的数值相等,包括最终结果和客户油藏工程师标定的一组关键中间点。具体做法是:在 Fortran 代码中添加子程序导出状态快照,C++ 端用测试框架加载这些检查点进行比对。团队认为这是整个项目中回报最高的投入:它让长时间 agent 运行更安全,且数值一致是最容易验证、最有说服力的迁移完成证明。 用 agent 文档化代码库 项目的文档散落在旧 PDF 和 Fortran 代码注释中。团队利用 Fortran 过程式代码的一个便利性质,整个程序可以画成一棵调用树,用自定义解析器生成调用树,然后通过 Vibe CLI 启动超过一百个 agent 并行文档化。每个 agent 从叶节点开始向上工作,子节点生成文档后向原仓库发起…