La empresa IBM ha presentado la iniciativa CodeNet, destinada a proporcionar a los investigadores un conjunto de datos que les permita experimentar con métodos de aprendizaje automático para crear traductores de un lenguaje de programación a otro, así como generadores y analizadores de código. CodeNet incluye una colección de 14 millones de ejemplos de código que resuelven 4053 problemas típicos de programación. En total, la colección cuenta con aproximadamente 500 millones de líneas de código y cubre 55 lenguajes de programación, tanto lenguajes modernos como C++, Java, Python y Go, como lenguajes obsoletos, incluyendo COBOL, Pascal y FORTRAN. Los desarrollos del proyecto se distribuyen bajo la licencia Apache 2.0, y se espera que los conjuntos de datos se distribuyan en forma de dominio público.
Los ejemplos están acompañados de anotaciones e implementan algoritmos idénticos en diferentes lenguajes de programación. Se supone que el conjunto propuesto ayudará al entrenamiento de sistemas de aprendizaje automático y al desarrollo de innovaciones en el campo de la traducción y el análisis automático de código, de manera similar a cómo la base de datos de imágenes anotadas ImageNet ha ayudado al desarrollo de sistemas de reconocimiento de patrones y visión por computadora. Se menciona como una de las principales fuentes para la formación de la colección diversas competiciones de programación.
A diferencia de los traductores tradicionales, implementados sobre la base de reglas de transformación, los sistemas de aprendizaje automático pueden captar y considerar el contexto de uso del código. Al traducir de un lenguaje de programación a otro, el contexto es igualmente importante que al traducir de un idioma humano a otro. Precisamente la falta de consideración del contexto dificulta la transformación de código de lenguajes obsoletos, como COBOL.
La existencia de una gran base de implementaciones de algoritmos en varios lenguajes ayudará a la creación de sistemas universales de aprendizaje automático, que en lugar de realizar una traducción directa entre lenguajes específicos, manipulan una representación más abstracta del código, independiente de los lenguajes de programación concretos. Tal sistema podría utilizarse como un traductor que convierte el código transmitido en cualquiera de los lenguajes soportados a su representación abstracta interna, a partir de la cual puede generarse código en múltiples lenguajes.
El sistema podrá realizar transformaciones bidireccionales. Por ejemplo, en bancos y entidades gubernamentales aún se utilizan proyectos en el antiguo lenguaje COBOL. Un traductor basado en un sistema de aprendizaje automático podrá convertir el código en COBOL a una representación en Java y, si es necesario, traducir un fragmento en Java de nuevo a código en COBOL.
Además de la traducción entre lenguajes, se mencionan aplicaciones de CodeNet como la creación de sistemas inteligentes para buscar código y la automatización de la detección de clones, así como el desarrollo de optimizadores y sistemas de corrección automática de código. En particular, los ejemplos presentados en CodeNet incluyen metadatos que describen los resultados de las pruebas de rendimiento, el tamaño resultante del programa, el consumo de memoria y un estado que permite distinguir entre código correcto y código con errores (para distinguir el código correcto del incorrecto, se incluyen intencionadamente ejemplos con errores, que representan el 29.5%). El sistema de aprendizaje automático puede tener en cuenta estos metadatos para generar el código más óptimo o para identificar regresiones en el código analizado (el sistema puede entender que el algoritmo en el código proporcionado no está implementado de manera óptima o contiene errores).
Fuente: opennet.ru
