compiler construction - ¿Cómo empiezo a escribir un transpiler? ¿Es posible?
compiler-construction code-translation (3)
Es posible que desee ver (o incluso unirse) a un proyecto de compilación de código abierto como Haxe . Ya puede compilar desde el código fuente de Haxe a Java, JavaScript, C #, C ++, NekoVM, Flash y Python (experimental).
Más información:
Debido a razones de confidencialidad, es posible que no pueda describir los detalles del punto clave, pero este es el escenario.
Varios dispositivos que tienen aplicaciones de transmisión tienen diferentes idiomas con distintas API, aunque logran lo mismo. Por lo tanto, cuando desee escribir una aplicación de transmisión para una plataforma, debe comenzar de cero al copiar la misma aplicación para otra plataforma, que está escribiendo lógica redundante. Quiero diseñar un transpiler, que tome código en un idioma y produzca código para todos los idiomas nativos, tipo de 1 a muchos, pero no estoy seguro de cómo comenzar, y no puedo encontrar suficientes referencias en Internet. ¿Es incluso factible hacerlo? los idiomas de destino incluyen variantes de javascript y principalmente java.
Sí, esto es posible, y los compiladores a menudo se escriben de esta manera.
La idea general es crear un "lenguaje intermedio", luego escribir varios traductores de un solo sentido:
C# => intermediate
JavaScript => intermediate
intermediate => C#
intermediate => JavaScript
Al pasar el resultado de uno a otro, puede traducir de un idioma a otro:
C# => intermediate => JavaScript
JavaScript => intermediate => C#
Lamentablemente, el código generado probablemente no sea humano.
Una forma de hacerlo es usar una infraestructura diseñada para construir traductores.
Mucha gente piensa que esto significa "un generador de analizadores sintácticos"; eso es realmente ingenuo Un buen traductor debe analizar el lenguaje, claro, pero la traducción también necesita rastrear lo que significan los símbolos, verificando que lo que se dice no es absurdo, generando y optimizando el código. Necesita mucho más maquinaria que solo un analizador (generador) para hacerlo bien. Ver la vida después del análisis .
Nuestro DMS Software Reengineering Toolkit es un conjunto de herramientas para construir analizadores y traductores de programas, que incluye como único elemento un generador de analizadores muy sólido.
DMS también incluye un motor de transformación de programas , que le permite a uno escribir reglas de traducción en términos de idiomas traducidos, si ve esto , transfórmelo a eso . Escribir reglas de traducción directamente en la sintaxis de la superficie de los idiomas de interés hace que sean más fáciles de escribir, inspeccionar, depurar y mantener.
Dicho esto, escribir un traductor así no es una tarea fácil; tiene que enumerar el conjunto completo de construcciones de sintaxis con semántica implícita, y descubrir cómo asociarlo a una combinación de sintaxis del lenguaje de destino más bibliotecas adicionales que puede crear a medida en el lado del objetivo. Esto toma meses-hombre, en plural, incluso para expertos, por traductor.
DMS es independiente de los lenguajes de programación involucrados. Debe definir los idiomas que le interesan; tiene una gran cantidad estable de definiciones de idioma (útiles como fuentes u objetivos, su elección) para lenguajes estándar como Java y JavaScript. Este estable disponible ayuda a acortar el ciclo de desarrollo, pero generalmente no es el costo dominante.
Hay un santo grial de construir un "traductor universal" en el que uno escribe un conjunto de reglas y todo es color de rosa a partir de entonces. Esa idea es una fantasía Vale la pena entender que un conjunto de reglas de traducción del lenguaje A al B, no es realmente útil para traducir el lenguaje C a D, porque las reglas combinan el conocimiento sobre la sintaxis específica y la semántica implícita. No obstante, si va a construir múltiples "transpilers", hacerlo sobre una base común es una gran victoria en términos de curva de aprendizaje y mantenimiento a largo plazo.
Usando herramientas como DMS, uno puede escribir traductores extremadamente precisos. .