Vai al contenuto
AI.info

The Pulse

Gli agenti di Mistral migrano 40.000 righe di Fortran a C++

Mistral AI afferma di aver aiutato un operatore energetico europeo a migrare a C++ 40.000 righe di Fortran 77 di un simulatore di giacimento. Il caso di studio dell’azienda mostra che i test, la documentazione e la revisione umana hanno con

Gli agenti di Mistral migrano 40.000 righe di Fortran a C++

AI.info Team ·

«Sembrava Fortran riscritto nella sintassi di C++, più che codice modernizzato.»

Carlo Antonio Patti e Rasul Alakbarli, Mistral AI

Mistral AI afferma che i suoi agenti hanno aiutato un operatore energetico europeo a migrare a C++ 40.000 righe di Fortran 77 nel primo sprint di un progetto di modernizzazione molto più ampio. Il codice fa parte di un simulatore di giacimento che fa ampio uso di modelli fisici, composto da 300.000 righe, privo di una suite di test e di documentazione centralizzata.

L’azienda ha pubblicato il resoconto il 9 settembre, presentando il lavoro come un caso di studio sui limiti degli agenti di programmazione autonomi. Gli ingegneri di Mistral hanno constatato che tradurre la sintassi era relativamente semplice, ma trasformare un programma scientifico vecchio di decenni in codice C++ orientato agli oggetti e facile da mantenere richiedeva scelte architetturali, verifiche numeriche e ripetuti interventi di esperti del settore.

Lo stato globale di Fortran è stato il primo ostacolo

Fortran 77 è stato standardizzato nel 1977 e si fonda su scelte progettuali che rendono difficile una modernizzazione diretta. Il linguaggio non ha moduli, namespace né tipi strutturati. Lo stato del programma risiede spesso nei blocchi COMMON, strutture di memoria condivisa che si comportano come uno stato globale, mentre la tipizzazione implicita può far sì che una variabile scritta in modo errato crei un nuovo valore anziché produrre un errore del compilatore.

Mistral ha messo a confronto una breve routine Fortran per il calcolo della densità del gas con un’implementazione C++ che usa tipi espliciti, un oggetto che rappresenta le proprietà del gas e un valore restituito. La nuova versione non mantiene una corrispondenza riga per riga con la precedente: gli array dei blocchi COMMON vengono accorpati e un ciclo viene spostato nella funzione chiamante. Questo rende il C++ più facile da organizzare, ma anche più difficile verificare a occhio l’equivalenza tra le due versioni.

Il simulatore doveva inoltre integrarsi con framework moderni per il calcolo scientifico, tra cui PETSc. Prima di chiedere agli agenti di riscrivere i moduli, Mistral e il cliente hanno dovuto stabilire un modo per dimostrare che la nuova implementazione producesse ancora gli stessi risultati numerici di quella precedente.

Mistral ha preparato i test prima della migrazione

Il team ha creato quello che chiama un sistema di verifica della parità. Ha aggiunto subroutine Fortran che esportano lo stato del programma, un framework di test C++ che carica quei checkpoint e file Skill.md che spiegano agli agenti come usare il sistema di verifica.

Il confronto riguardava sia i risultati finali sia alcuni valori intermedi selezionati dagli ingegneri del cliente specializzati in giacimenti. In un esempio, il programma Fortran esportava il valore di una variabile chiamata RHOG, registrato in quell’esecuzione come 42,71834. Il test C++ usava lo stesso valore come checkpoint di riferimento.

Questo sistema forniva al team un riscontro misurabile quando un modulo migrato corrispondeva all’implementazione precedente. Riduceva anche il rischio di lasciare un agente al lavoro per un lungo periodo mentre introduceva un errore numerico non rilevato. Mistral afferma che preparare prima il sistema di verifica è stato un investimento con un beneficio netto e dovrebbe essere tra i primi passi in lavori di modernizzazione simili.

Oltre 100 agenti hanno documentato il vecchio codice

La documentazione poneva un problema a parte. Le conoscenze pertinenti erano sparse tra vecchi file PDF e commenti incorporati nel sorgente Fortran. Mistral ha analizzato il codice per costruire un albero delle relazioni tra funzioni chiamanti e chiamate, rappresentando i rapporti all’interno del programma come una gerarchia che va dalle routine di livello inferiore alle funzioni che le invocano.

L’azienda ha poi usato Vibe CLI per avviare oltre 100 agenti incaricati di documentare l’albero. Gli agenti potevano recuperare i PDF pertinenti tramite librerie di documenti e Mistral OCR. Partendo dalle foglie dell’albero, i sottoagenti hanno scritto la documentazione e aperto pull request nel repository originale. Un agente revisore controllava le nuove pull request a intervalli programmati e assegnava compiti successivi quando servivano modifiche.

Mistral descrive il lavoro di documentazione come uno dei maggiori benefici collaterali del progetto. Il lavoro ha portato le spiegazioni più vicino al codice prima che il team incaricato della migrazione iniziasse ad apportare modifiche strutturali.

La piena autonomia ha prodotto codice funzionante ma datato

Nel primo tentativo di implementazione, a ogni subroutine Fortran è stato assegnato un agente autonomo. Gli agenti hanno lavorato indipendentemente per una settimana e prodotto codice C++ funzionante, ma hanno in gran parte conservato la vecchia struttura. I blocchi COMMON sono diventati struct globali e il flusso di controllo basato su GOTO è rimasto al suo posto, anziché essere riorganizzato in cicli o istruzioni di ritorno anticipato.

Nel secondo approccio, Mistral ha suddiviso le responsabilità per ciascun modulo tra un agente incaricato della pianificazione, uno della scrittura del codice, uno dei test e uno della revisione della qualità del codice. Il risultato è migliorato notevolmente, ma alla fine gli agenti si sono bloccati di fronte a bug difficili. Hanno provato diverse correzioni, senza avere una persona a disposizione per risolvere il problema di fondo o cambiare il piano.

Il flusso di lavoro definitivo ha mantenuto gli stessi ruoli per gli agenti, aggiungendo però un operatore umano. L’operatore faceva avanzare la migrazione un modulo alla volta, interveniva quando gli agenti si bloccavano e rivedeva le pull request finché non erano pronte per essere integrate.

Il primo sprint ha riguardato 40.000 delle 300.000 righe

In collaborazione con gli ingegneri del cliente specializzati in giacimenti, Mistral ha suddiviso il sistema in sottoalberi indipendenti, generalmente inferiori a circa 10.000 righe di Fortran. Ogni modulo seguiva una sequenza fissa: generare l’architettura C++ di destinazione, rivederla con un ingegnere specializzato in giacimenti, suddividere il progetto approvato in compiti, eseguire un ciclo di pianificazione, implementazione e test e sottoporre le pull request risultanti alla revisione umana.

Il primo sprint ha riguardato funzionalità fondamentali distribuite su 40.000 righe di una base di codice di 300.000 righe. Mistral sottolinea che le condizioni iniziali erano favorevoli: il simulatore era autonomo e poteva essere eseguito. Progetti che dipendono da sistemi esterni, non dispongono di una versione di riferimento eseguibile o contengono regole scientifiche non documentate potrebbero presentare problemi più difficili di quelli affrontati nel caso di studio.

Il resoconto dell’azienda avanza una tesi più circoscritta rispetto all’idea di una migrazione del software completamente autonoma. Gli agenti hanno svolto gran parte del lavoro di documentazione, produzione del codice e revisione, ma il progetto dipendeva da una versione precedente eseguibile come riferimento, da checkpoint numerici e da ingegneri specializzati in giacimenti in grado di approvare le scelte architetturali. Per questo sistema, il risultato concreto è arrivato inserendo gli agenti in un flusso di lavoro controllato, anziché escluderne le persone.

Fonte

Esplora

Altri articoli