Mistral с помощью агентов перевела 40 000 строк кода с Fortran 77 на C++
Это первые 40 000 из 300 000 строк гидродинамического симулятора европейской энергокомпании. Полностью автономные агенты не справились, лучше всего сработали агенты под надзором человека, пишут инженеры Mistral.
Mistral перенесла с Fortran 771 на C++ 40 000 строк гидродинамического симулятора2, которым пользуется европейская энергетическая компания, рассказали инженеры Mistral Карло Антонио Патти и Расул Алакбарли в блоге компании. Название клиента не раскрывается. Тестов у программы не было, документация была разбросана по старым PDF-файлам и комментариям в коде. Это первый этап: всего в программе 300 000 строк.
По словам авторов, перевести синтаксис с одного языка на другой современные модели уже умеют. Сложнее перестроить архитектуру. Fortran 77 появился в 1977 году: в нём нет модулей и составных типов, данные лежат в общих глобальных блоках памяти COMMON, а тип переменной задаёт первая буква её имени. Из-за перестройки строка на Fortran больше не соответствует строке на C++, и напрямую сверить старый и новый код нельзя.
Поэтому сначала команда сделала механизм сверки. Программа на Fortran сохраняет промежуточные значения в точках, которые выбрали инженеры клиента. Тесты на C++ берут эти значения как эталон и проверяют, что переписанный модуль выдаёт те же числа. Агенты сами расставляли такие точки в коде на Fortran.
«Численное совпадение — самый дешёвый и самый убедительный способ доказать, что модуль готов»
из выводов авторов
Затем агенты составили документацию. Самописный парсер построил дерево вызовов всей программы, а консольный агент Mistral Vibe CLI запустил больше сотни агентов. Они описывали код от нижних функций к верхним и подтягивали старые PDF через Mistral OCR — сервис распознавания документов. Каждое описание приходило в репозиторий заявкой на изменения. По расписанию её проверял агент-рецензент и при необходимости ставил задачи на исправление.
В первой попытке каждый агент неделю переводил свою подпрограмму полностью самостоятельно. Код работал, но блоки COMMON превратились в глобальные структуры, а переходы GOTO остались на месте. Авторы назвали результат Fortran, перепечатанным синтаксисом C++. Во второй попытке над модулем работали четыре агента: планировщик, программист, тестировщик и рецензент. Код стал заметно лучше, но на сложных ошибках агенты застревали, и помочь им было некому.
В итоге команда остановилась на промежуточном варианте. Человек управляет связкой агентов — программиста, тестировщика и рецензента — и переносит программу по модулям объёмом примерно до 10 000 строк на Fortran. Все изменения проверяет человек, пока их не примут. Авторы оговариваются, что условия были удобными: код на Fortran был самодостаточным и запускался. Если программа зависит от внешних систем или в ней заложена физика, которая нигде не описана, задача будет сложнее.