Estoy debatiendo el diseño de un lenguaje específico de dominio para simplificar un modelo de programación oscuro y dado. Parte del debate es si construirlo (como un script) sobre un lenguaje / tiempo de ejecución existente (por ejemplo, Java) o hacerlo independiente (compilador propio, & c).
Aquellos de ustedes con experiencia en diseño de DSL, ¿tienen pros / contras y / o una respuesta segura al enfoque apropiado?
language-design
scripting
dsl
runtime
Jé Queue
fuente
fuente
Respuestas:
Recomendaría crear su DSL sobre un idioma existente (DSL interno). Lo hice varias veces con Python, creando sistemas en los que el consumidor de DSL escribe un archivo de Python que se utiliza como archivo de configuración para el sistema. El archivo de configuración usa construcciones (clases, funciones) que he definido. Estas construcciones forman el DSL.
OMI, un lenguaje como Python (IronPython o Jython si el sistema host es .NET o Java) o Ruby (IronRuby, JRuby) es mejor para basar su DSL que Java o C #.
En mi caso, los sistemas host también han sido (C) Python, por lo que elegir Python para DSL ha sido lo más natural.
Algunos pros:
fuente
Mire Xtext (http://www.eclipse.org/Xtext/) y Xbase (http://blog.efftinge.de/2010/09/xbase-new-programming-language.html). Si los usuarios no son programadores, no creo que deba basar su DSL en un lenguaje de programación existente. Será demasiado complicado para ellos. Un DSL "limpio" puede ser muy eficiente si se hace correctamente.
fuente
En lugar de recomendar un enfoque particular, permítame recomendarle los Idiomas específicos de dominio de Martin Fowler como un excelente recurso para tomar la decisión. Tiene un examen extenso y estimulante de los méritos relativos de las DSL internas y externas.
fuente
Hay una tercera opción: construir un DSL como compilador sobre un lenguaje de propósito general. Cualquier lenguaje con cierto grado razonable de capacidades de metaprogramación hará el trabajo, incluso algo tan de bajo nivel como C ++. Prefiero Lisp y lenguajes similares para este tipo de cosas, pero Template Haskell o Nemerle también podrían proporcionar el mismo nivel de flexibilidad.
fuente
En su libro "Idiomas específicos del dominio", Martin Folwer describe DSL internos y externos .
Internal DSL
= es un subconjunto del lenguaje de programación existente, por ejemplo, Ruby / Java, etc.External DSL
= define una sintaxis y un vocabulario.Un DSL externo puede ser mucho más expresivo, pero puede requerir un análisis externo y generación de código.
Si bien un DSL interno no requiere un procesamiento adicional, a veces es difícil de entender para los expertos en dominios que no son de programación (por ejemplo, analistas de negocios, probadores).
Al elegir su tipo de DSL, es importante analizar quiénes son sus usuarios. Si en su mayoría son personas no técnicas, un DSL externo puede ser una mejor opción. Para un pequeño equipo de programadores experimentados, se puede elegir un DSL interno, si el lenguaje de programación que usan es lo suficientemente expresivo.
fuente