java - sura - ¿El mejor diseño para generar código desde un AST?
ejemplos de ats en salud ocupacional (4)
Estoy trabajando en un DSL bastante complejo que quiero compilar en unos pocos lenguajes de alto nivel. Todo el proceso ha sido una experiencia de aprendizaje. El compilador está escrito en java.
Me preguntaba si alguien conocía las mejores prácticas para el diseño de la parte del generador de código. Actualmente tengo todo analizado en un árbol de sintaxis abstracta.
Estaba pensando en usar un sistema de plantillas, pero todavía no he investigado demasiado en esa dirección, ya que me gustaría escuchar algo de sabiduría primero por el desbordamiento de pila.
¡Gracias!
Cuando estaba haciendo esto de nuevo en mi clase de lenguajes de programación, terminamos usando emisores basados en seguir el patrón de visitantes . Funcionó bastante bien: hace que la reorientación a nuevos lenguajes de salida sea bastante fácil, siempre y cuando su AST coincida con lo que está imprimiendo bastante bien.
DSL es una buena cosa Y escribirlos es una buena práctica.
Pero no estoy seguro de que implementar su propio YACC y similares sea una buena opción en 2010, a menos que sea solo por diversión o educativo.
Cuando termine su proceso educativo y comience a buscar una buena forma de implementar sus DSL, puede considerar el uso de lenguajes dinámicos.
Al utilizar Groovy por ejemplo, puede implementar sus DSL grandes y pequeños de una manera muy fácil y divertida.
Por cierto, Groovy ha construido en la API de manipulación AST.
Lo que realmente desea es un sistema de transformación de programas , que asigne estructuras de sintaxis en un idioma (su DSL) a patrones de sintaxis en otros idiomas. Una herramienta de este tipo puede realizar transformaciones arbitrarias (las reescrituras en árbol generalizan las reescrituras de cadenas que son sistemas Post con capacidad total de Turing) durante el proyecto de generación de código, lo que significa que lo que genere y cuán sofisticado sea el proceso de generación lo determinará su ambición. , no por las propiedades "framework generador de código".
Los sofisticados sistemas de transformación de programas combinan varios tipos de análisis de alcance, análisis de flujo y / o analizadores personalizados para permitir las transformaciones. Esto no agrega ningún poder teórico, pero agrega mucho poder práctico: la mayoría de los lenguajes reales (incluso los DSL) tienen espacios de nombres, control y flujo de datos, inferencia de tipo de necesidad, etc. etc.
Nuestro kit de herramientas de reingeniería de software DMS es este tipo de sistema de transformación. Se ha utilizado para analizar / transformar tanto los lenguajes convencionales como los DSL, para lenguajes simples y complejos, y para sistemas de software pequeños, grandes e incluso enormes.
Relacionado con los comentarios de OP acerca de "convertir el AST en otros idiomas", esto se logra mediante DMS al escribir transformaciones que mapean la sintaxis de la superficie para el DSL (implementado detrás de escena su AST de DSL) a la sintaxis de la superficie para el idioma de destino (implementado con el objetivo lenguaje ASTs). A continuación, el DMS imprime de forma automática el lenguaje de destino AST para proporcionar el código fuente real en el idioma de destino, que corresponde al AST de destino.
Si ya está usando ANTLR y tiene listo su AST, le recomendamos que consulte StringTemplate: http://www.antlr.org/wiki/display/ST/StringTemplate+Documentation
También la Sección 9.6 de La referencia definitiva de ANTLR: Construyendo lenguajes específicos de dominio explica esto: http://www.pragprog.com/titles/tpantlr/the-definitive-antlr-reference
Los ejemplos de código gratuitos están disponibles en http://media.pragprog.com/titles/tpantlr/code/tpantlr-code.tgz . En el código de subcarpeta / templates / generator / 2pass / encontrará un ejemplo que convierte expresiones matemáticas a código de bytes de Java.