Mistral用AI智能体帮助欧洲能源运营商将4万行Fortran 77代码迁移至C++
Mistral公司使用AI智能体帮助一家欧洲能源运营商将4万行Fortran 77代码迁移到C++,并分享了在迁移过程中总结的经验教训。
AI解读:这次迁移的核心难点不只是翻译代码,而是重构。Fortran 77是1977年的老语言,没有模块和命名空间,用全局内存共享数据,变量名只有6个字符且容易拼错就静默生成新变量。直接翻译成C++只会得到披着C++外衣的Fortran。
Mistral的解法是先做一个数值一致性验证工具,让新旧代码的输出在数字上必须完全一致,再去拆分迁移任务和用智能体干活。他们试过完全放手让智能体干,结果代码质量差,但配了人类审核和结构化流程后,质量和效率才平衡。
这给想用AI迁移老代码的团队一个提醒:别指望AI全自动搞定。先把验证标准立起来,把文档整理好,再让人和智能体配合,才可能把几万行老代码安全地换成现代语言。
Mistral帮助一家欧洲能源运营商将40,000行Fortran 77代码迁移到C++,这段代码是一个物理密集型油藏模拟器,没有测试套件和集中式文档。Mistral在官方博客中描述了这次迁移的过程,并总结了经验教训。
迁移中的重构挑战
Mistral指出,将代码从一种语言翻译到另一种语言基本已经解决;但要把一个过程式语言写的完整系统迁移到面向对象的C++,需要处理架构重构,这让任务变得复杂。
Fortran 77于1977年标准化,代码中状态存在COMMON块——整个程序共享的全局内存。变量根据首字母隐式确定类型,拼写错误会静默创建新变量而不是触发编译错误,变量名因长度上限6个字符而显得神秘。
迁移前的验证与文档准备
在让智能体开始干活前,Mistral构建了奇偶校验工具,确保新旧代码在数值上完全一致——包括最终结果和客户油藏工程师标记的关键中间点。他们添加了允许导出Fortran代码状态的子程序、用于将检查点加载到C++的测试框架,以及引导智能体正确使用这些工具的Skill.md文件。
他们还用从代码解析出的调用树,配合名为Vibe CLI的工具,启动超过一百个智能体来记录代码库。每个节点派生子智能体生成文档并打开拉取请求,一个审阅器智能体定期运行来审查新PR并安排修复任务。
Mistral表示,先构建奇偶校验工具是项目中的净正向投资,它使长时间智能体运行更安全,且数值一致性是证明模块成功迁移的易验证且有力的论据。他们认为这应该是任何代码现代化工作的第一步之一。
智能体的自动化程度尝试
在第一次尝试中,Mistral给智能体完全的自主权:每个Fortran子程序配一个agent,独立在C++中翻译其功能。结果能用,但不能称为代码现代化——COMMON块变成一对一的全局结构;GOTO驱动的控制流未被重构为循环或提前返回,看起来像用C++语法重打的Fortran。
第二次尝试中,他们为每个模块分配了规划者、编码者、测试者和代码质量审查者。代码质量比第一次大幅提高,但源码复杂性最终难倒了智能体——它们遇到bug,尝试几次修复后停滞,无人干预。
最终方案是折中:由人操作编码、测试和审查智能体的工作流,逐模块迁移代码库。这保留了第二次尝试的代码质量,同时在智能体卡住时增加了人工检查点来解除阻塞。
结构化工作流与项目限制
在运行迁移时,Mistral与客户的水库工程师合作,使用调用树识别独立模块。每个模块经历以下流程:生成目标C++架构;由水库工程师审查;批准后分解为任务队列;每个任务运行实现子工作流:计划→实现→测试→重复;最终由人工审查合并。
首个冲刺覆盖了核心功能:300,000行代码中的40,000行。Mistral指出,Fortran代码库是自包含且可运行的,这是有利的起点;依赖外部系统、缺乏可运行基线或物理规则文档缺失的迁移会带来额外挑战。
他们总结出三条经验:在写迁移代码前先构建奇偶校验工具;在依赖智能体之前整理文档;在这种规模下,带人工审核门控的结构化工作流优于完全自主或手动处理的会话。