Article

Code2Code

Come sfruttare l'intelligenza artificiale nella traduzione del codice

Compilatori source-to-source

Al giorno d’oggi, l’evoluzione dei sistemi informatici è abilitata anche dai nuovi linguaggi di programmazione che si stanno progressivamente diffondendo, come Swift di Apple, Rust di Mozilla, Go di Google, TypeScript di Microsoft e molti altri. Anche se non esiste il linguaggio di programmazione perfetto per ogni problema, è sempre possibile trovare quello più adatto a ciascuna circostanza: la sua adozione, però, dipende da diversi fattori e non sempre è possibile. Considerando poi che fino ad oggi sono già state scritte miliardi di righe di codice, non sarebbe utile avere un modo per passare direttamente da un qualsiasi linguaggio di programmazione ad un altro? Questo è esattamente ciò che fa un compilatore source-to-source.

Core Reply, la company del gruppo Reply specializzata nell’innovazione dei Core Systems delle istituzioni finanziarie, ha già iniziato ad affrontare la sfida della trasformazione del codice nel contesto della modernizzazione di piattaforme legacy. Molte banche e istituzioni finanziarie si affidano, per esempio, a piattaforme legacy caratterizzate da miliardi di righe di codice COBOL, un linguaggio costoso da mantenere e che rappresenta una fonte sconfinata di debito tecnico. Uno degli approcci portati avanti da Core Reply per risolvere questi problemi è la trasformazione automatica del codice finalizzata a ridurre i costi diretti e indiretti dovuti all’arretratezza dell’infrastruttura tecnologica. È proprio in scenari come questo che risulta particolarmente utile l’utilizzo di compilatori source-to-source efficaci ed automatici.

Cos'è la transcompilazione?

Un tipico compilatore traduce il codice sorgente da un linguaggio di programmazione di alto livello di astrazione ad un linguaggio di programmazione di un livello inferiore, come ad esempio il codice macchina. Un transcompiler, o transpiler o compiler source-to-source, invece, può essere considerato come un traduttore che agisce tra linguaggi di programmazione che operano ad un livello di astrazione similare.

Oggi il mercato richiede che le aziende evolvano il più rapidamente possibile, ma spesso questo processo è ostacolato da soluzioni legacy preesistenti in cui apportare cambiamenti può essere rischioso e dispendioso in termini di tempo e risorse. Le banche e gli istituti finanziari tradizionali sono un buon esempio in questo senso: solitamente hanno un'enorme quantità di codice scritto in COBOL, scarsamente documentato, ma cruciale per la loro attività. In casi come questo, la reimplementazione del codice potrebbe essere addirittura impossibile, mentre la traduzione manuale potrebbe essere un’attività troppo ampia e richiedere anni. Un transpiler può colmare questo gap producendo automaticamente una nuova code base, completamente iso-funzionale a quella vecchia e pronta per essere distribuita in un ambiente open.

Come funziona solitamente un transcompiler?

Negli approcci tradizionali, la transcompilazione viene eseguita costruendo alberi sintattici a partire dal codice sorgente, e utilizzando regole scritte a mano per effettuare la conversione dal linguaggio di origine a quello di destinazione. Questo approccio presuppone due elementi fondamentali:
• Un elevato livello di conoscenza approfondita sia del linguaggio di programmazione iniziale che di quello di destinazione;
• Una difficile, se non impossibile, deduzione del tipo di variabili nel caso di traduzione da linguaggi dynamically-typed, come Python, e da linguaggi statically-typed, come Java.

Picture

Il processo può essere visto come la traduzione da una lingua parlata all’altra. In entrambi gli scenari, il “traduttore” ha bisogno di conoscere approfonditamente entrambe le lingue. L’IA ha contribuito a risolvere il problema della traduzione tra le lingue parlate e rappresenta ormai lo stato dell’arte. Le due principali branche della ricerca in questo ambito sono la Machine Translation, ovvero la traduzione automatica di testo da una lingua ad un’altra, e la Neural Machine Translation, o NMT, che fa uso di reti neurali per la determinazione di un modello statistico da applicare alla Machine Translation.

In questo contesto si inserisce il progetto TansCoder, sviluppato dai Facebook AI Labs, che sfrutta potenzialità dell’AI, e in particolare le conoscenze provenienti dalla Neural Machine Translation, e le applica al campo della transcompilazione.

Transcoder: un transpiler basato sull'intelligenza artificiale

L'applicazione dell’intelligenza artificiale alla traduzione del codice sorgente può potenzialmente superare le criticità dei transcompilatori tradizionali, legati soprattutto alle conoscenze tecniche richieste ed al tempo necessario per costruire un sistema di questo tipo. Considerando che il task non è così diverso dalla traduzione del testo, è ragionevole supporre che i risultati raggiunti in quest'ultimo campo possano condurre agli stessi risultati anche nella traduzione del codice sorgente. Il principale ostacolo nel perseguimento di questo approccio è la mancanza di dati paralleli necessari per addestrare i modelli NMT tradizionali.

L’innovazione del progetto TransCoder è stata quella di prende in prestito alcuni principi dalle tecniche innovative di NMT e averli applicati alla traduzione del codice sorgente, implementando al contempo un approccio di training semi-supervisionato per superare il problema della mancanza di dati.

Per valutare l'efficacia del modello, i ricercatori di Facebook hanno proposto una nuova misura per valutare l’accuracy dei modelli, chiamata Computational Accuracy, che prende in considerazione l’output prodotto dall’esecuzione del codice sorgente originale e del codice tradotto, a parità di input, e li confronta. Questo approccio si differenzia dalle misure di accuracy tradizionali per questi task che, tipicamente, confrontano il codice prodotto vero e proprio. Infatti, utilizzando le tradizionali misure di accuracy in ambito di traduzione del testo, gli output aventi piccole differenze sintattiche rispetto al risultato atteso sarebbero considerati come risultati molto validi, anche se, quando si fa riferimento ai linguaggi di programmazione, i codici sorgente con piccole differenze possono produrre risultati molto diversi una volta eseguiti.

Picture

Il modello TransCoder ha così dimostrato di essere in grado di ottenere risultati migliori rispetto a tecniche e soluzioni commerciali all'avanguardia nel processo di traduzione dal linguaggio C ++ a Java e da Java a Python.

Nuovi ambiti di applicazione del modello transcoder

Reply sta da tempo lavorando a questo nuovo ramo degli strumenti transpiler potenziati dall’intelligenza artificiale, con l'obiettivo di fornire la miglior soluzione sul mercato per le aziende che devono tradurre la propria code base in un nuovo linguaggio di programmazione più avanzato, veloce e, potenzialmente, più economico di quello precedente.

Grazie anche all’esperienza di Core Reply nell’utilizzo di tecniche di transcompilazione nell’ambito di progetti di modernizzazione di piattaforme legacy, il team Reply sta verificando la validità dell’approccio proposto dai Facebook AI Lab testandolo su una serie di casi reali di traduzione di frammenti di codice con diversi linguaggi di programmazione.

Una volta raggiunti risultati soddisfacenti, la sperimentazione Reply proseguirà con l’arricchimento e l’addestramento del modello TransCoder per affrontare anche il compito di traduzione del linguaggio COBOL ad altro linguaggio con una Computational Accuracy paragonabile a quella già raggiunta nella traduzione da C ++ a Java e da Java a Python.

Questa attività di ricerca si innesta all’interno di uno stream più ampio, che vede Reply lavorare al fianco dei propri clienti per ottimizzare il processo di creazione di prodotti digitali, attraverso l’utilizzo di automazione e machine learning applicati lungo tutto il processo di sviluppo software, dal requisito fino al go live e successiva evoluzione.

Potrebbe interessarti anche

No contents here.