Construyendo un DSL: ¿Escrito sobre un lenguaje de propósito general o independiente?

10

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?

Jé Queue
fuente
¿Quién es el consumidor de este DSL? y cuáles son los hosts potenciales (mencionaste Java, ¿estás considerando otras posibilidades?)
Mauricio Scheffer
Considero cualquier posibilidad para los anfitriones. Los consumidores serán aquellos que escriban programas asincrónicos (mensajes con destinos).
Jé Queue

Respuestas:

9

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:

  • Menor costo de construcción. Hay mucho menos que implementar. Puede centrarse en el problema en cuestión en lugar de perder tiempo para implementar un analizador / compilador / intérprete.
  • Acceso al idioma del host: su idioma tendrá acceso a toda la potencia del idioma / plataforma existente.
codeape
fuente
Soy bastante independiente del lenguaje, pero ¿por qué crees que las encarnaciones de Python son más adecuadas?
Jé Queue
1
¿Más adecuado que qué? Supongo que Ruby y Python tienen muchos de los mismos beneficios, Ruby quizás sea aún más adecuado para DSL interno debido a su sintaxis más flexible. En cuanto a Java y C #, he visto muchas interfaces fluidas en esos idiomas (y hay versiones en versiones más recientes que facilitan la creación / uso de DSL interno, como la sintaxis de inicializador de objetos), pero en mi opinión los idiomas de "ceremonia baja" son ligeramente más adecuado que los idiomas de "alta ceremonia".
codeape
1
Elegí C # para implementar un DSL interno precisamente para aprovechar la verificación de tipo estático "libre" en tiempo de compilación. Las DSL de lenguaje dinámico no ofrecen demasiadas ventajas sobre las DSL externas.
Den
@Den, eso es exactamente lo que me decepcionó cuando intenté hacer iDSL en Python. En Java, su iDSL parece que recibe soporte instantáneo del IDE. No he encontrado un IDE que haga eso para Python.
candied_orange
2

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.

Henrik
fuente
2

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.

sintaxis
fuente
1

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.

SK-logic
fuente
1

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.

Olha Pavliuk
fuente