compiler-construction dsl

compiler construction - Construyendo DSL externas efectivas



compiler-construction (7)

Deberías echarle un vistazo a Ragel . Es un marco para incrustar máquinas de estado en su código fuente habitual. Ragel admite C, C ++, Objective-C, D, Java y Ruby.

Ragel es ideal para escribir analizadores de archivos y protocolos, así como para analizar cosas externas de DSL. Principalmente porque te permite ejecutar cualquier tipo de código en transiciones de estado y demás.

Un par de proyectos notables que usan Ragel son, Mongrel , un gran servidor web ruby. Y Hpricot , un analizador html basado en ruby, inspirado en jQuery.

Otra gran característica de Ragel es cómo puede generar gráficos basados ​​en graphviz que visualicen sus máquinas de estado. A continuación se muestra un ejemplo tomado del artículo de Zed Shaw sobre las tablas de estado de Ragel .

tabla de estado de ragel http://www.zedshaw.com/tips/HelloMachine_small.png

¿Qué herramientas hay para que cree una DSL externa real, honesta y buena? Y no, no estoy hablando de abusar de Ruby, Boo, XML u otro lenguaje o sintaxis existente, me refiero a una DSL externa REAL, mi propio idioma para mis propios fines.

Sé que se están desarrollando algunos bancos de trabajo de idiomas y he oído hablar de cosas como "Irony" para .NET. Y, por supuesto, están ANTLR, Lex / Yaac, etc. pero me temo que son demasiado complicados para lo que estoy tratando de hacer.

Por favor, hable de una herramienta de creación de DSL que pueda haber usado u oído y sus impresiones sobre cómo ayuda y cuáles son sus inconvenientes.


Escribí DSL en Boo, Irony.NET y un kit de herramientas llamado Grammatica. Usted dice que un generador de analizadores es demasiado complicado, pero puede ser demasiado apresurado a su juicio, de hecho, son bastante simples de usar una vez que pasa una pequeña curva de aprendizaje, y abren un vasto mundo de posibilidades que anula fácilmente el esfuerzo. Encontré aprendiendo la notación requerida para escribir gramáticas para la mayoría de los generadores de analizadores de forma similar a aprender Expresiones regulares: tienes que inclinar tu mente un poco para dejarlos entrar, pero las recompensas son importantes.

Mi opinión es la siguiente: si el idioma de destino es lo suficientemente simple como para que pueda ser manejado por un diseñador visual estúpido, entonces escribir una gramática con un generador de analizador debería ser bastante fácil.

Si su DSL objetivo es lo suficientemente complicada como para necesitar sudar y escribir una gramática, entonces la herramienta visual simplificada no cortará la mostaza de todos modos y terminará teniendo que aprender a escribir una gramática de todos modos.

Sin embargo, estoy de acuerdo en el largo plazo acerca de los DSL internos vs. externos. Escribí una DSL interna en Boo y tuve que modificar mi sintaxis DSL para que funcionara, y siempre se sintió como un truco. La misma gramática usando Irony.NET o ANTLR hubiera sido igual de fácil de lograr con más flexibilidad.

Tengo una publicación en el blog sobre algunas opciones. La publicación se centra en escribir un DSL para la evaluación de la expresión en tiempo de ejecución, pero las herramientas son todas iguales.

Mi experiencia con Irony.NET ha sido positiva, y hay varios lenguajes de referencia implementados al usarla, que es un buen lugar para comenzar. Si su lenguaje es simple, no es nada complicado ponerse en marcha. También hay una biblioteca en CodeProject llamada TinyParser: esta es realmente interesante, ya que genera el analizador como código fuente puro, lo que significa que su producto final está completamente libre de referencias de terceros. No lo he usado yo mismo, sin embargo.


He estado usando Irony con buenos resultados. La gran parte de la ironía es que puedes incluirla fácilmente en cualquier tiempo de ejecución para el que uses DSL. Estoy creando una DSL externa que llené en un modelo semántico escrito en C #, así que la ironía es genial. Luego utilizo el modelo semántico para generar código con StringTemplate.


Para DSL externas graves, no puede evitar el problema de análisis sintáctico; ANTLR es lo menos que necesitas. Lo que quiere verificar son los sistemas de transformación de programas, que se pueden usar para mapear sintaxis DSL arbitraria en lenguajes de destino como Java.

Ver http://en.wikipedia.org/wiki/Program_transformation


Si estás buscando escribir DSL independientes, entonces estás buscando construir compiladores, no hay forma de evitarlo. La construcción del compilador es un conocimiento de programación esencial, y realmente no es tan difícil como comúnmente se piensa. La comida del programador de Righ de Steve Yegge resume el valor de saber cómo construir compiladores bastante bien.

Hay muchas formas de comenzar. Recomiendo ver los 2 artículos mencionados en el artículo: ¿Quieres escribir un compilador? Solo lea estos dos documentos . El primero, construyamos un compilador , es muy accesible. Utiliza Turbo Pascal como lenguaje de implementación, pero puede implementarlo fácilmente en cualquier otro idioma; el código fuente es muy claro. Pascal es un lenguaje simple.

Una vez que tenga una buena idea de cómo funcionan las cosas y la terminología involucrada, le recomiendo profundizar en algo como ANTLR . ANTLR tiene un buen IDE, ANTLRWorks , que viene con un intérprete y un depurador. También produce visualizaciones muy buenas de tus gramáticas sobre la marcha. Lo encontré invaluable en el aprendizaje.

ANTLR tiene varios buenos tutoriales, aunque pueden ser un poco abrumadores al principio. Este es bueno, aunque está en contra de ANTLR 2.0, por lo que podría encontrarse con incompatibilidades con una versión más reciente (actualmente la última es 3.1).

Finalmente, hay otro enfoque para las DSL: el enfoque Lisp. Dada la naturaleza sintaxis de Lisp (tu código es básicamente árboles sintácticos abstractos), puedes formar interminables idiomas, siempre que te acostumbres a los paréntesis :).

Si lo hace con ese enfoque, quiere usar un Lisp incrustable. En Java, tiene Clojure , un dialecto Lisp que interactúa sin problemas con JVM y sus bibliotecas. No lo he usado personalmente, pero se ve bien. Para Scheme, hay GNU Guile , que tiene licencia bajo LGPL . Para Common Lisp, hay ECL , también bajo LGPL. Ambos usan una interfaz C para la interoperabilidad, por lo que puedes integrarlos en cualquier otro idioma. ECL es único entre Lisp en que cada función Lisp se implementa como una función C, por lo que puede escribir código Lisp en C si lo desea (por ejemplo, dentro de sus propios métodos de extensiones; puede crear funciones C que operen en objetos Lisp, y luego llamarlos desde Lisp). He estado usando ECL para un proyecto paralelo mío por un tiempo, y me gusta. El mantenedor es bastante activo y receptivo.


Si planea implementar una DSL externa, Spoofax ( http://strategoxt.org/Spoofax ) es un buen entorno de trabajo de idiomas para hacer esto. Es un Langauge Workbench textual basado en el analizador que aprovecha varias tecnologías de última generación como SDF, Stratego. Además de la implementación de DSL, puede obtener servicios de editor muy completos, tales como compleción de código, vista de esquema, intellisense, etc. Se ha utilizado para compilar varios idiomas, por ejemplo, http://mobl-lang.org/ . Mira esto para tener una idea sobre el soporte proporcionado.

El proyecto Spoofax viene con una implementación de DSL de muestra lista para usar y un generador de código Java. Puede funcionar como un punto de partida para comenzar con las herramientas.

Siguiendo los detalles del tutorial sobre el uso de este banco de trabajo de idioma: http://strategoxt.org/Spoofax/Tour .

¡Espero eso ayude!


Xtext fue construido para esto.

Desde el sitio web:

Xtext es un marco para el desarrollo de lenguajes de programación y lenguajes específicos de dominio.

Cubre todos los aspectos de una infraestructura de lenguaje completa, desde analizadores, sobre vinculador, compilador o intérprete hasta integración Eclipse IDE de primera categoría. Viene con buenos valores predeterminados para todos estos aspectos y, al mismo tiempo, cada aspecto se puede adaptar a sus necesidades.