La división de investigación de Facebook anunció hace poco TransCoder, es decir, un sistema que permite transcribir código entre lenguajes de programación.
Este sistema es definido como un transcompilador. A diferencia de los compiladores, que traducen lenguaje de alto nivel a lenguaje de bajo nivel, como lenguaje ensamblador, para crear un código ejecutable, los transcompiladores traducen de un lenguaje de programación de alto nivel a otro del mismo nivel (C++ o Python). Los investigadores responsables explican si bien existen algunos lenguajes de programación desarrollados para incluir dentro de su características la transcompilación para ser transformados a lenguajes más comunes, en la investigación se concentraron en los transcompiladores para dos casos generales: 1) convertir un código escrito en lenguajes obsoletos, a unos más recientes; y 2) integrar código escrito en diferentes lenguajes en un solo código base.
Según mencionan, los principales problemas a los que se enfrenta una compañía o cualquier programador a transcribir de un lenguaje de programación a otro, es que cada lenguaje de programación maneja una diferente sintaxis y dependencias en diferentes plataformas, además, cada existen librerías especializadas para cada lenguaje. Generalmente, las herramientas para hacer este proceso, convierten el código inicial a un token, es decir, asignarle un código númerico a cada porción de código alfanúmerico, y luego lo convertierten a Abstract Syntax Tree en donde reescriben las reglas de sintaxis del lenguaje al que se quiere llegar. Esta transformación evidentemente supone un gasto enorme de tiempo, además del conocimiento y experticia, de quien realiza la reescritura, en ambos lenguajes. Esto sin mencionar que, dado que la naturaleza de cada lenguaje es una particular, existen lenguajes dinámicos como Python, y otros, estáticos, como Java, lo que dificulta aún más la labor, por el manejo particular de las variables en cada uno.
Para resolver este problema los investigadores retomaron los avances en Neural Machine Translation (NMT) para crear un modelo no supervisado, Transcoder, que fue entrenado por códigos en un sólo lenguaje obtenidos de GitHub, para traducir entre C++, Java y Python. La evaluación la realizaron con un conjunto de 852 funciones paralelas, junto con pruebas unitarias asociadas.
El modelo obtenido logró traducir funciones con una alta precisión y alinear correctamente las funciones de las bibliotecas propias en los 3 lenguajes, es decir, toman código específico de cada lenguaje y logran transformarlo en código entendible en otro lenguaje. Además, destancan los investigadores, el mayor logro es eliminar la necesidad de tener mucha experiencia en los lenguajes de programación entre los que se quiera traducir, y que puede ser fácilmente usado en cualquier otro lenguaje, no sólo los 3 ya mencionados. En adición, destacan que el modelo no supervisado que crearon puede superar las herramientas comerciales disponibles.
Diseño del modelo
El diseño del modelo de Neural Machine Translation consistió en un modelo de codificador, seguido de un decodificador con un transformador de arquitectura. Fue entrenado usando 3 principios: inicialización, modelado y traducción hacía atrás.
En resumen, 1) se inicializa con un modelo de lenguaje preentrenado que enmascara varios lenguajes, lo cual genera que las porciones de código que expresan las mismas instrucciones son asignadas a la misma representación. 2) Se entrena el decodificador para generar siempre secuencias validas, incluso si recibe datos de ruido, y a su vez incrementa la robustez del codificador al ruido de entrada. Finalmente, 3) permite que el modelo genere datos paralelos que puedan ser usados para entrenamiento, es decir, sin importar si está traduciendo de Python a C++, genera datos más precisos del modelo de C++ a Python, y viceversa.
Aunque el modelo no es perfecto, y en el paper destacan los errores en los que cae, consideran que gran parte de estos errores pueden ser arreglados añadiendo algunas restricciones al decodificador para asegurar que las funciones generadas tengan una apropiada sintaxis, o usando arquitecturas dedicadas para resolver el problema. También sugieren que puede mejorarse los resultados realizando una corrección iterativa de los errores, lo cual posiblemente genere que sea más lento, pero más preciso.
Lee el artículo completo en Lachaux M., Roziere B., Chanussot L. y Lample G. (2020) Unsupervised translation of programming languages
Photo by Joshua Aragon on Unsplash |
Según mencionan, los principales problemas a los que se enfrenta una compañía o cualquier programador a transcribir de un lenguaje de programación a otro, es que cada lenguaje de programación maneja una diferente sintaxis y dependencias en diferentes plataformas, además, cada existen librerías especializadas para cada lenguaje. Generalmente, las herramientas para hacer este proceso, convierten el código inicial a un token, es decir, asignarle un código númerico a cada porción de código alfanúmerico, y luego lo convertierten a Abstract Syntax Tree en donde reescriben las reglas de sintaxis del lenguaje al que se quiere llegar. Esta transformación evidentemente supone un gasto enorme de tiempo, además del conocimiento y experticia, de quien realiza la reescritura, en ambos lenguajes. Esto sin mencionar que, dado que la naturaleza de cada lenguaje es una particular, existen lenguajes dinámicos como Python, y otros, estáticos, como Java, lo que dificulta aún más la labor, por el manejo particular de las variables en cada uno.
Para resolver este problema los investigadores retomaron los avances en Neural Machine Translation (NMT) para crear un modelo no supervisado, Transcoder, que fue entrenado por códigos en un sólo lenguaje obtenidos de GitHub, para traducir entre C++, Java y Python. La evaluación la realizaron con un conjunto de 852 funciones paralelas, junto con pruebas unitarias asociadas.
El modelo obtenido logró traducir funciones con una alta precisión y alinear correctamente las funciones de las bibliotecas propias en los 3 lenguajes, es decir, toman código específico de cada lenguaje y logran transformarlo en código entendible en otro lenguaje. Además, destancan los investigadores, el mayor logro es eliminar la necesidad de tener mucha experiencia en los lenguajes de programación entre los que se quiera traducir, y que puede ser fácilmente usado en cualquier otro lenguaje, no sólo los 3 ya mencionados. En adición, destacan que el modelo no supervisado que crearon puede superar las herramientas comerciales disponibles.
Diseño del modelo
El diseño del modelo de Neural Machine Translation consistió en un modelo de codificador, seguido de un decodificador con un transformador de arquitectura. Fue entrenado usando 3 principios: inicialización, modelado y traducción hacía atrás.
En resumen, 1) se inicializa con un modelo de lenguaje preentrenado que enmascara varios lenguajes, lo cual genera que las porciones de código que expresan las mismas instrucciones son asignadas a la misma representación. 2) Se entrena el decodificador para generar siempre secuencias validas, incluso si recibe datos de ruido, y a su vez incrementa la robustez del codificador al ruido de entrada. Finalmente, 3) permite que el modelo genere datos paralelos que puedan ser usados para entrenamiento, es decir, sin importar si está traduciendo de Python a C++, genera datos más precisos del modelo de C++ a Python, y viceversa.
Extracted from Unsupervised translation of programming languages |
Extractred from Unsupervised translation of programming languages |
Lee el artículo completo en Lachaux M., Roziere B., Chanussot L. y Lample G. (2020) Unsupervised translation of programming languages
0 Comentarios