¿Qué es un idioma específico de dominio? ¿Alguien lo está usando? Y de que manera


107

Supongo que estoy buscando algún tipo de introducción y ver si alguien la ha usado. ¿Existen ventajas particulares de usarlo?

Wikipedia:

El lenguaje específico de dominio (DSL) es un lenguaje de programación o lenguaje de especificación dedicado a un dominio de problema particular, una técnica de representación de problema particular y / o una técnica de solución particular.

¿Alguien puede dar ejemplos específicos de cómo lo ha implementado o cómo puede ser útil en un escenario dado?


En realidad, el lenguaje específico de dominio es un término con un significado bien definido en programación - consulte el artículo de wikipedia
1800 INFORMACIÓN

Como se indica a continuación, DSL no es un solo idioma, sino el nombre de toda una clase de idiomas de propósito especial.
dmckee --- ex-moderador gatito

Entonces, ¿puedo decir que R es un DSL?
Srikar Doddi

2
Al borde de la misma, pero no lo haría. R tiene todas las estructuras de propósito general y se utiliza para una amplia gama de cálculos; los cálculos numéricos y las estadísticas no son un dominio muy amplio. Sin embargo, es una buena prueba de la definición.
Charlie Martin

Respuestas:


114

Un lenguaje de dominio específico es un lenguaje que se escribe para tratar un dominio específico o un conjunto de preocupaciones. Hay muchos de ellos, como make, ant y rake para describir compilaciones de software, o lexx y yacc para la construcción de lenguajes. En los últimos años, se han vuelto populares debido a que algunas cosas se han combinado para facilitar su construcción. Entre esas cosas, destaca la creciente popularidad de Ruby, que tiene varias características que facilitan la creación de nuevos DSL.

Martin Fowler es un gran defensor de la idea, como aquí .


3
¿Qué características tiene Ruby que facilitan la creación de un nuevo DSL?
Lernkurve

2
@Lernkurve - Ruby tenía metaprogramación, lo que ayuda. rubylearning.com/blog/2010/11/23/…
James Black

@CharlieMartin, ¿podrías dejarme saber sobre "groovy"? ¿Qué tipo de idioma es exactamente? Quiero saber, por favor
ayude

2
Groovy es un lenguaje de secuencias de comandos que se ejecuta en una JVM. Básicamente, está destinado a ser una respuesta de Java a Ruby. Es un lenguaje de propósito general, pero se puede usar para escribir DSL. docs.groovy-lang.org/docs/latest/html/documentation/…
Charlie Martin

1
Me gustaría agregar groovy de Gradle. Si no me equivoco, tienen su propio lenguaje para describir una construcción.
Neon Warge

67

Puede pensar en los DSL como argumentos demasiado complejos para funciones escritas en un lenguaje de programación más general. El lenguaje de programación real analiza el código DSL y hace algo con él, por lo general, el código DSL solo se centra en lo que desea hacer y el sistema más grande descubre el cómo .

Los ejemplos de DSL incluyen todos los lenguajes de consulta (SQL, XPath, ...), todos los lenguajes de plantilla (Django, Smarty, ...), scripts de shell, especialmente incluyendo cosas como twill, un navegador web controlado por comandos (usado principalmente para pruebas automatizadas ), lenguajes de almacenamiento e intercambio de datos (XML, YAML, ...) y lenguajes de documentos como LaTex, HTML o CSS.

Algunos lenguajes con sintaxis muy flexible como TCL y Lisp construyen su DSL directamente en el lenguaje ... cuando es posible. La mayoría de los lenguajes utilizan cadenas, normalmente cargadas desde archivos externos.

¿Existen ventajas particulares de usarlos? Usarlos para los fines previstos es muy ventajoso hasta el punto de que recurrirá a ellos sin saberlo, al igual que ha estado usando (supongo) SQL o HTML sin pensar en ellos como DSL.

Me atrevería a decir que hay suficientes DSL para cualquier tipo de aplicación que pueda necesitar; es casi seguro que no es necesario que aprenda a escribir uno propio.


1
Curiosamente, el único ejemplo que no enumeró es el primero en el que pienso: regex
CoffeeTableEspresso

12

(abordando el quid de la pregunta)

Creo que la primera vez que vi DSL en algún lugar y su definición como "lenguaje específico de dominio" , también pensé que era un lenguaje concreto y particular del que no había oído hablar, pero no, es un término general para los lenguajes que son adaptado a un área de aplicación particular.

Irónicamente, si acaba de escuchar acerca de TCL como un "lenguaje de comandos de herramientas", podría pensar, como los DSL, que habría muchos TCL para varias herramientas, pero no, es el nombre específico de un lenguaje de scripting en particular.


10

Creo que es un lenguaje adecuado para resolver problemas en un dominio específico. Podría ser algún lenguaje de procesamiento de reglas o lenguaje de descripción de servicios.

Un opuesto a un lenguaje de dominio específico (DSL) es un lenguaje de propósito general .


10

Todo es un DSL ...

Ensamblador: MOV R1 a R2
Compiladores: Declaraciones de asignación - A = A + 1, Condicionales - IF (TRUE) ..., Branch - RETURN
HTML: ... describe una estructura anidada
TCP / IP: describe hacia / desde direcciones
PDF: describe la ubicación del texto / imagen en papel
Fuentes: describe los caracteres

Cualquier lenguaje que usemos para describir un proceso específico es un DSL. Desafortunadamente, hay una falta de lenguajes específicos de dominio para describir incluso nuestros procesos más básicos, por lo que usamos los pocos lenguajes que tenemos para describir todo lo que hacemos. "Comprimir todos los archivos html en mi sitio web" requiere 300 líneas de 3 o 4 idiomas diferentes para completar.

Para crear un DSL, determine la cantidad mínima de caracteres necesarios para describir un proceso que pueda recordar y que no requiera documentación. Recuerde que la velocidad y la facilidad de uso son los principales criterios de diseño. El análisis es tan rápido que cualquier sintaxis que use está bien, prefiero el lenguaje natural como mi sintaxis en la mayoría de los casos, "Pague a los empleados el primer día del mes", pero el dominio específico es solo eso, específico del dominio, usted determina la sintaxis que mejor encaja con el problema.

Me mantendría alejado de usar otras soluciones que podrían ser convenientes pero que no se ajustan al problema, como HTML que se usó para definir datos (XML). CSV es muy útil, se adapta a la mayoría de los problemas. JSON no se ajusta a la parte de facilidad de uso, es exagerado que agrega complicaciones innecesarias donde CSV funciona para la mayoría de los problemas. Usamos mucho EXCEL para DSL, funciona muy bien para describir pequeños problemas, menos de 65K a 1M filas, como estructuras de árbol o menús, la columna A es el nivel, otras columnas son iconos, colores, etiquetas y demás (EXCEL es un CSV editable).

Descubrí que HTML no solucionaba realmente el problema del diseño de página, así que me deshice de él y definí un DSL que encajaba. Definí 6 regiones en la página, ENCABEZADO, CUERPO, PIE DE PIE, MÁRGENES IZQUIERDA / DERECHA y MÁRGENES COMPLETOS IZQUIERDA / DERECHA. Entonces podría decirle al generador de páginas que agregue una BARRA DE TÍTULO, BARRA DE ESTADO, MENÚS, TABLA, FORMULARIOS, ..., a celdas específicas. Cada una de estas celdas se podría dividir en filas y columnas a cualquier profundidad. El diseño de la página toma unos segundos para cualquier estilo.

BODY contiene una tabla de mis empleados
HEADER contiene un título de la barra de título 'Hola mundo' con inicio de sesión en Collins Software

Un menú DSL no encaja en el diseño de página DSL, así que construí un DSL único para menús.

Recurso Mi menú principal
* define: menú, m, nivel, etiqueta, icono, acción;
m, 0, archivo;
m, 1, open, open.gif, Diálogo Abrir archivo;

Cada problema es único, la computadora puede usar cualquier formato, es el humano para el que están diseñados los DSL, así que hágalo comprensible para los humanos, algo que ellos puedan escribir, y haga el lenguaje de palabras reales; porque son personas, lugares y cosas reales lo que estamos describiendo.


8

Un DSL es una buena forma de desarrollar un lenguaje para que lo utilicen los no programadores. Por ejemplo, si tiene un DSL para el personal de finanzas de una empresa, entonces, en lugar de programar según sus especificaciones, puede dejar que escriban el programa que quieren que se haga. Luego, si es demasiado lento, puede tomar lo que escribieron que funciona como quieran, escribirlo en un lenguaje compilado para acelerarlo.


5

¡Bien! hay muchas cosas explicadas arriba. Intentaré explicar esto de una manera mucho más sencilla, ya que alguien como yo lo entenderá.

Como los lenguajes de propósito general se utilizan para una gran variedad de propósitos, el DSL solo se hace para un dominio específico. Como HTML o CSS.

Puede decir si escribió instrucciones en un papel que solo una persona o su único mejor amigo puede entender y nadie más. Entonces puede ser un DSL. Pero si escribió instrucciones en términos que muchas personas pudieran entender y seguir, entonces esto no es DSL.

I onces creó una placa de conmutación para el usuario que podría operarse a través del puerto serie de una computadora y el usuario quiere un programa para esa placa que pueda ejecutarse en esa placa y los interruptores de relé se encenderán y apagarán en consecuencia. Así que escribí algunas instrucciones y le dije al usuario que programara esa placa de acuerdo con estas instrucciones. Este es un ejemplo de DSL. No inventé un nuevo lenguaje, sino que simplemente creé un montón de cadenas que el microcontrolador podía leer desde EEPROM y podía analizar en consecuencia y podía realizar una tarea específica.


4

Escribí una breve publicación de blog sobre por qué me gusta usar DSL:

Ojalá usáramos idiomas específicos de dominio (DSL) Más

En él, defino un DSL como:

Un pequeño lenguaje de programación diseñado específicamente para comunicar soluciones para un dominio particular de problemas.

En términos de uso, si alguna vez ha utilizado Ant, Structured Query Language (SQL) o Cascading Style Sheets (CSS), ha utilizado un DSL.

Me gusta usar DSL porque se enfocan en facilitar la comunicación de soluciones a espacios de problemas específicos, y lo hacen de una manera que promueve la inclusión de expertos en el dominio.


3

Un ejemplo simple de lenguaje específico de dominio (DSL) es HTML, que se utiliza para el dominio particular llamado aplicaciones basadas en web.


3

Hace poco escuché DSL pero encontré un ejemplo realmente útil: LUNA (antes lunascript).

Es un lenguaje / marco de programación personalizado creado por el equipo de Asana para su propia plataforma.

Como descubrí además, muchas empresas crean sus propios marcos y lenguajes para crear una ventaja competitiva adecuada, algunos ejemplos son:

  • SAP con AbAp
  • PeopleSoft con PeopleCode
  • Apple con Objective-C
  • Facebook tiene cosas como FBML y FQL

Esos son específicos del dominio porque los usará casi exclusivamente para trabajar en estas plataformas.

Espero que esta respuesta te ayude a aclarar el concepto.


3
Objective-C no es de dominio lenguaje específico
boraseoksoon

Tampoco fue hecho por (y para) Apple.
Alexander Rossa

2

Un ejemplo de DSL utilizado en Machine Learning es patsy en python: https://patsy.readthedocs.io/en/latest/formulas.html#

que se basa en la fórmula DSL de R: https://stat.ethz.ch/R-manual/R-devel/library/stats/html/formula.html

https://cran.r-project.org/web/packages/Formula/vignettes/Formula.pdf

y Hadley tiene una buena sección de su libro R avanzado que describe cómo construir un DSL w / R: http://adv-r.had.co.nz/dsl.html

Una vez que el campo de aprendizaje profundo se estabilice un poco (o incluso ahora), me encantaría ver surgir algo similar dentro del proyecto Apache MXnet. Sin embargo, todavía no he visto ninguna propuesta para eso en la página de propuestas .


1

Los lenguajes específicos del dominio expresan los procesos y conocimientos de su dominio en un lenguaje que utiliza directamente los conceptos y la lógica de su campo en particular.

Definitivamente, la comunidad está creciendo, pero aún no al nivel de otras tecnologías "convencionales".

La mayoría de las veces, los DSL están hechos para mejorar la productividad dentro de las empresas, por lo que lo mantienen privado y no comparten sus resultados / conocimientos.

Aquí hay una conferencia donde el ponente da algunos ejemplos de DSL utilizando JetBrains MPS , con la tecnología de edición proyectiva: https://vimeo.com/197381453


1

DSL: lenguaje específico del dominio. Comencemos con lo que es dominio: el dominio es un área definida, alcance. Este dominio puede tener el aspecto de un sitio web, y usted tiene CSS y el segundo dominio puede ser la estructura del sitio web, y aquí tiene HTML.

Pero, el dominio también puede ser la Aplicación Company X. Y en el ámbito de este dominio se puede crear algún lenguaje. El lenguaje no significa: cosa totalmente aromatizada con su propia grama, sintaxis, compilador o tiempo de ejecución. DSL puede ser solo una lista de herramientas que resuelven problemas de dominio.

Consideremos OOP y su modelo para representar objetos de dominio por clases y métodos como comportamientos de esos objetos. Si creamos tal estructura y les damos comportamientos a estos objetos, entonces podemos escribir un código usando esos conceptos. Considere este ejemplo de pseudocódigo:

cookie = async getCookie(cookieId)
user = async getUser(userId)
result async user.buy(cookie)
if (result.isError()) {
  error.showAlert("User has not enough money")
} else {
  confirmation.showSuccess("Cookie was bought")
}

Cuánto de arriba es GPL (lenguaje de propósito general) y cuánto es terminología y herramientas de dominio específico. Esta es una combinación de dos, pero todos los comandos son aquí específicos del dominio. Dicho esto, podemos decir que lo anterior está escrito en DSL donde el dominio es alguna aplicación x.

En el futuro con este ejemplo, puedo crear herramientas aún más abstractas y, principalmente, realizar el flujo de control con esas herramientas, considere (esto es más FP, pero espero que entienda lo que quiero decir):

waitForMany(getCookie(cookieId), getUser(userId)
  .andThen([cookie, user] -> user.buy(cookie))
  .andThen(showSuccess("Cookie was bought"))
  .whenError(showError("User has not enough money"))

Como puede ver, pude abstraer bastante y usar esta abstracción para realizar el flujo de control. Y todo está basado en GPL y funciona dentro del alcance de GPL.

Para revelar la verdad, todos escribimos DSL, cada abstracción específica de dominio que puede usar es amable. Pero la mayoría de esas abstracciones no son soluciones completas, por eso no solemos usar esta palabra con demasiada frecuencia. Pero si tiene un conjunto de herramientas, funciones que abstraen su dominio, forman una especie de DSL.

Lo que también es DSL, muchas cosas, por ejemplo, cualquier marco que proporcione un conjunto de reglas es DSL. Si ve que alguien dice que es un desarrollador de React, entonces sabrá que es un desarrollador específico de dominio, ya que React es exactamente DSL, que es una alternativa para usar la plataforma web nativa. Si puede componer funcionalidad a partir de herramientas específicas de dominio existentes, entonces está escribiendo usando DSL. Profundizando en React, lo siento, todas las personas que no son de este DSL: D, pueden crear un conjunto de componentes y componerlos como bloques de construcción, y ¡hurra !, ahora hicieron DSL sobre DSL.

Sí, repitió DSL demasiadas veces aquí, lo siento.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.