La società IBM ha presentato l'iniziativa CodeNet, mirata a fornire ai ricercatori un insieme di dati per sperimentare l'uso di metodi di apprendimento automatico per creare traduttori da un linguaggio di programmazione all'altro, oltre a generatori e analizzatori di codice. CodeNet include una collezione di 14 milioni di esempi di codice che risolvono 4053 problemi tipici di programmazione. In totale, la collezione conta circa 500 milioni di righe di codice e copre 55 linguaggi di programmazione, sia linguaggi moderni come C++, Java, Python e Go, sia linguaggi obsoleti come COBOL, Pascal e FORTRAN. I risultati del progetto sono distribuiti sotto licenza Apache 2.0, e si prevede che i dataset saranno resi disponibili come dominio pubblico.
Gli esempi sono forniti con annotazioni e implementano algoritmi identici in diversi linguaggi di programmazione. Si prevede che il set proposto aiuti nell'addestramento dei sistemi di apprendimento automatico e nello sviluppo di innovazioni nel campo della traduzione e del parsing automatico del codice, analogamente a come il database di immagini annotate ImageNet ha aiutato nello sviluppo dei sistemi di riconoscimento delle immagini e visione artificiale. Come una delle principali fonti di creazione della collezione vengono citate diverse competizioni di programmazione.
A differenza dei traduttori tradizionali, realizzati sulla base di regole di trasformazione, i sistemi di apprendimento automatico possono catturare e considerare il contesto di utilizzo del codice. Nella conversione da un linguaggio di programmazione a un altro, il contesto è altrettanto importante che nella traduzione da un linguaggio umano a un altro. È proprio la mancanza di considerazione del contesto a ostacolare la conversione di codice da linguaggi obsoleti, come il COBOL.
La disponibilità di un ampio database di implementazioni di algoritmi in diversi linguaggi aiuterà nella creazione di sistemi di apprendimento automatico universali, che invece di operare una traduzione diretta tra linguaggi specifici, manipolano una rappresentazione più astratta del codice, indipendente dai linguaggi di programmazione specifici. Un tale sistema potrebbe essere utilizzato come traduttore, convertendo il codice fornito in uno qualsiasi dei linguaggi supportati nella sua rappresentazione astratta interna, da cui può poi essere generato codice in molteplici linguaggi.
Il sistema sarà in grado di eseguire trasformazioni bidirezionali. Ad esempio, nelle banche e nelle pubbliche amministrazioni continuano ad essere utilizzati progetti in COBOL, un linguaggio obsoleto. Un traduttore basato su un sistema di apprendimento automatico sarà in grado di convertire il codice COBOL in una rappresentazione in Java, e, se necessario, tradurre un frammento di Java nuovamente in codice COBOL.
Oltre alla traduzione tra linguaggi, CodeNet menziona anche aree di applicazione come la creazione di sistemi di ricerca intelligente per il codice e l'automazione del rilevamento dei cloni, nonché lo sviluppo di ottimizzatori e sistemi di correzione automatica del codice. In particolare, gli esempi presentati in CodeNet sono forniti di metadati che descrivono i risultati dei test delle prestazioni, la dimensione risultante del programma, il consumo di memoria e lo stato che consente di distinguere il codice corretto da quello contenente errori (per distinguere il codice corretto da quello errato, nella raccolta sono stati appositamente inclusi esempi con errori, la cui percentuale è del 29,5%). Il sistema di apprendimento automatico può tenere conto di questi metadati per generare il codice più ottimale o per identificare le regressioni nel codice analizzato (il sistema può capire che nell'algoritmo fornito nel codice non è implementato in modo ottimale o contiene errori).
Fonte: opennet.ru
