2008-09-19 8 views
11

¿Qué herramientas hay para que pueda crear 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.Creación de DSL externas efectivas

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 construcción de DSL que pueda haber usado o escuchado y sus impresiones sobre cómo ayuda y cuáles son sus inconvenientes.

+0

NOTA: No necesariamente estoy buscando la completitud de Turing aquí, tampoco. En su mayoría solo la sintaxis de expresión para configurar cosas en mi modelo. – chadmyers

Respuesta

9

He escrito 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 esta: si su 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 para ello usando un generador de analizadores 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 todas formas.

Acepto a largo plazo las DSL internas y externas. 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 un blog post discutiendo 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.

4

Realmente debería ver 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 pasar a través de cosas DSL externas. 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 de 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 visualizan las máquinas de estado. A continuación se muestra un ejemplo tomado de Zed Shaw'sarticle on ragel state charts.

ragel state chart http://www.zedshaw.com/tips/HelloMachine_small.png

+0

Excelente. ¡Definitivamente voy a ver esto! – chadmyers

8

Si usted está buscando en una SL independientes de escritura, entonces usted está buscando en los compiladores de construcción - no hay manera de evitarlo. La construcción del compilador es conocimiento de programación esencial, y realmente no es tan difícil como se pensaba comúnmente. El número Righ Programmer Food de Steve Yegge resume el valor de saber cómo compilar compiladores bastante bien.

Hay muchas maneras de comenzar. Recomiendo ver los 2 artículos mencionados en el artículo: Want to write a compiler? Just read these Two papers. El primero, Let's build a compiler, 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. This one 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, existe 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, desea utilizar 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 es licensed under 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.

+0

No me estás ayudando aquí. jaja. Me he metido con ANTLR antes y sé sus capacidades, pero esperaba algo no tan sofisticado/complicado. Creo que tendré que darle otra mirada. – chadmyers

1

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.

1

Si está planeando 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, como la finalización del código, la vista de esquema, intellisense, etc. Se ha utilizado para compilar varios idiomas, p. http://mobl-lang.org/. Mira esto para tener una idea sobre el soporte proporcionado.

El proyecto Spoofax viene con una implementación 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 que ayude!

0

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

2

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 idioma completa, desde analizadores , sobre el enlazador, compilador o intérprete hasta la integración de Eclipse IDE de primera calidad totalmente integrada . Viene con buenos valores predeterminados para todos estos aspectos y, al mismo tiempo, cada aspecto se puede adaptar a sus necesidades según .