Un lenguaje de dominio específico ( DSL ) es un lenguaje informático especializado en un dominio de aplicación particular . Esto contrasta con un lenguaje de propósito general (GPL), que es ampliamente aplicable en todos los dominios. Existe una amplia variedad de DSL, que van desde lenguajes ampliamente utilizados para dominios comunes, como HTML para páginas web, hasta lenguajes utilizados por sólo uno o unos pocos programas de software, como el código software MUSH . Los DSL se pueden subdividir aún más según el tipo de lenguaje e incluyen lenguajes de marcado específicos de dominio, lenguajes de modelado específicos de dominio (más generalmente, lenguajes de especificación ) y lenguajes de programación específicos de dominio . Los lenguajes informáticos de propósito especial siempre han existido en la era de las computadoras, pero el término "lenguaje específico de dominio" se ha vuelto más popular debido al aumento del modelado específico de dominio . Los DSL más simples, en particular los utilizados por una sola aplicación, a veces se denominan informalmente minilenguajes .
La línea entre los lenguajes de propósito general y los lenguajes de dominio específico no siempre es clara, ya que un lenguaje puede tener características especializadas para un dominio en particular pero ser aplicable de manera más amplia, o por el contrario, puede en principio ser capaz de una aplicación amplia pero en la práctica usarse principalmente para un dominio específico. Por ejemplo, Perl se desarrolló originalmente como un lenguaje de procesamiento de texto y pegamento, para el mismo dominio que AWK y los scripts de shell , pero más adelante se utilizó principalmente como un lenguaje de programación de propósito general. Por el contrario, PostScript es un lenguaje completo de Turing y, en principio, puede usarse para cualquier tarea, pero en la práctica se usa estrictamente como lenguaje de descripción de páginas .
El diseño y uso de DSL apropiados es una parte clave de la ingeniería de dominio , mediante el uso de un lenguaje adecuado para el dominio en cuestión; esto puede consistir en usar un DSL o GPL existente, o desarrollar un DSL nuevo. La programación orientada a lenguajes considera la creación de lenguajes de propósito especial para expresar problemas como parte estándar del proceso de resolución de problemas. Puede valer la pena crear un lenguaje de dominio específico (con software que lo respalde), en lugar de reutilizar un lenguaje existente, si el lenguaje permite que un tipo particular de problema o solución se exprese más claramente de lo que permitiría un lenguaje existente y el tipo de El problema en cuestión reaparece con suficiente frecuencia. Pragmáticamente, un DSL puede estar especializado en un dominio de problema particular, una técnica de representación de problema particular, una técnica de solución particular u otros aspectos de un dominio.
Un lenguaje de dominio específico se crea específicamente para resolver problemas en un dominio en particular y no pretende poder resolver problemas fuera de él (aunque eso puede ser técnicamente posible). Por el contrario, los lenguajes de propósito general se crean para resolver problemas en muchos dominios. El dominio también puede ser un área comercial. Algunos ejemplos de áreas de negocio incluyen:
Un lenguaje de dominio específico está en algún lugar entre un pequeño lenguaje de programación y un lenguaje de secuencias de comandos , y a menudo se usa de manera análoga a una biblioteca de programación . Los límites entre estos conceptos son bastante borrosos, muy parecidos a los límites entre los lenguajes de programación y los lenguajes de propósito general.
Los lenguajes de dominio específico son lenguajes (o, a menudo, sintaxis o gramáticas declaradas) con objetivos muy específicos en diseño e implementación. Un lenguaje de dominio específico puede ser un lenguaje de diagramación visual, como los creados por el Generic Eclipse Modeling System , abstracciones programáticas, como el Eclipse Modeling Framework , o lenguajes textuales. Por ejemplo, la utilidad de línea de comandos grep tiene una sintaxis de expresión regular que coincide con patrones en líneas de texto. La utilidad sed define una sintaxis para hacer coincidir y reemplazar expresiones regulares. A menudo, estos pequeños lenguajes se pueden usar juntos dentro de un shell para realizar tareas de programación más complejas.
La línea entre los lenguajes de dominio específico y los lenguajes de secuencias de comandos es algo borrosa, pero los lenguajes de dominio específicos a menudo carecen de funciones de bajo nivel para el acceso al sistema de archivos, el control entre procesos y otras funciones que caracterizan a los lenguajes de programación con todas las funciones, ya sean secuencias de comandos o de otro tipo. Muchos lenguajes de dominio específico no se compilan en código de bytes o código ejecutable, sino en varios tipos de objetos multimedia: GraphViz exporta a PostScript , GIF , JPEG , etc., mientras que Csound compila en archivos de audio y un dominio de trazado de rayos. lenguaje específico como POV se compila en archivos de gráficos.
Un lenguaje de definición de datos como SQL presenta un caso interesante: puede considerarse un lenguaje de dominio específico porque es específico de un dominio específico (en el caso de SQL, acceder y administrar bases de datos relacionales) y, a menudo, se llama desde otra aplicación, pero SQL tiene más palabras clave y funciones que muchos lenguajes de secuencias de comandos y, a menudo, se lo considera un lenguaje por derecho propio, tal vez debido a la prevalencia de la manipulación de bases de datos en la programación y la cantidad de dominio requerido para ser un experto en el lenguaje.
Para desdibujar aún más esta línea, muchos lenguajes de dominios específicos tienen API expuestas y se puede acceder a ellos desde otros lenguajes de programación sin interrumpir el flujo de ejecución o llamar a un proceso separado y, por lo tanto, pueden operar como bibliotecas de programación.
Algunos lenguajes de dominio específico se expanden con el tiempo para incluir herramientas de programación con todas las funciones, lo que complica aún más la cuestión de si un lenguaje es de dominio específico o no. Un buen ejemplo es el lenguaje funcional XSLT , diseñado específicamente para transformar un gráfico XML en otro, que se ha ampliado desde sus inicios para permitir (particularmente en su versión 2.0) diversas formas de interacción del sistema de archivos, manipulación de cadenas y fechas, y tipificación de datos. .
En la ingeniería basada en modelos , se pueden encontrar muchos ejemplos de lenguajes de dominio específico como OCL , un lenguaje para decorar modelos con aserciones o QVT , un lenguaje de transformación de dominio específico. Sin embargo, lenguajes como UML suelen ser lenguajes de modelado de propósito general.
Para resumir, una analogía podría ser útil: Very Little Language es como un cuchillo, que puede usarse de miles de maneras diferentes, desde cortar comida hasta talar árboles. [ se necesita aclaración ] Un lenguaje de dominio específico es como un taladro eléctrico: es una herramienta poderosa con una amplia variedad de usos, pero en un contexto específico, es decir, hacer agujeros en las cosas. Un lenguaje de propósito general es un banco de trabajo completo, con una variedad de herramientas destinadas a realizar una variedad de tareas. Los lenguajes de dominio específico deben ser utilizados por programadores que, al observar su banco de trabajo actual, se dan cuenta de que necesitan un mejor ejercicio y descubren que un lenguaje de dominio específico en particular proporciona exactamente eso. [ cita necesaria ]
Los DSL implementados a través de un intérprete o compilador independiente se conocen como lenguajes específicos de dominio externo . Ejemplos bien conocidos incluyen LaTeX o AWK. Una categoría separada conocida como lenguajes específicos de dominio integrados (o internos) generalmente se implementa dentro de un idioma anfitrión como una biblioteca y tiende a limitarse a la sintaxis del idioma anfitrión, aunque esto depende de las capacidades del lenguaje anfitrión. [1]
Existen varios patrones de uso para lenguajes de dominios específicos: [2] [3]
Muchos lenguajes de dominios específicos se pueden utilizar de más de una forma. [ cita necesaria ] El código DSL incrustado en un lenguaje anfitrión puede tener soporte de sintaxis especial, como expresiones regulares en sed, AWK, Perl o JavaScript, o puede pasarse como cadenas.
La adopción de un enfoque de lenguaje de dominio específico para la ingeniería de software implica tanto riesgos como oportunidades. El lenguaje específico de dominio bien diseñado logra encontrar el equilibrio adecuado entre estos.
Los lenguajes de dominio específico tienen objetivos de diseño importantes que contrastan con los de los lenguajes de propósito general:
En programación, los modismos son métodos impuestos por los programadores para manejar tareas de desarrollo comunes, por ejemplo:
Los lenguajes de programación de propósito general rara vez admiten dichos modismos, pero los lenguajes de dominio específico pueden describirlos, por ejemplo:
Ejemplos de lenguajes de programación de dominio específico incluyen HTML , Logo para dibujar con lápiz, lenguajes de descripción de hardware Verilog y VHDL , MATLAB y GNU Octave para programación matricial, Mathematica , Maple y Maxima para matemáticas simbólicas , lenguaje de especificación y descripción para sistemas reactivos y distribuidos. , fórmulas y macros de hojas de cálculo , SQL para consultas de bases de datos relacionales , gramáticas YACC para crear analizadores , expresiones regulares para especificar lexers , el sistema de modelado genérico Eclipse para crear lenguajes de diagramación, Csound para síntesis de sonido y música y los lenguajes de entrada de GraphViz y GrGen . paquetes de software utilizados para el diseño y la reescritura de gráficos , el lenguaje de configuración de Hashicorp utilizado para Terraform y otras herramientas de Hashicorp , Puppet también tiene su propio lenguaje de configuración.
El lenguaje de programación GML utilizado por GameMaker Studio es un lenguaje de dominio específico dirigido a programadores novatos para que puedan aprender a programar fácilmente. Si bien el lenguaje sirve como una combinación de múltiples lenguajes, incluidos Delphi , C++ y BASIC , faltan estructuras, tipos de datos y otras características de un lenguaje de programación completo. Muchas de las funciones integradas están protegidas para facilitar su portabilidad. El lenguaje sirve principalmente para que cualquiera pueda aprenderlo fácilmente y desarrollar un juego.
El lenguaje de secuencias de comandos asociado a ColdFusion es otro ejemplo de un lenguaje de dominio específico para sitios web basados en datos. Este lenguaje de secuencias de comandos se utiliza para entrelazar lenguajes y servicios como Java, .NET, C++, SMS, correo electrónico, servidores de correo electrónico, http, ftp, Exchange, servicios de directorio y sistemas de archivos para su uso en sitios web.
El lenguaje de marcado ColdFusion (CFML) incluye un conjunto de etiquetas que se pueden usar en páginas ColdFusion para interactuar con fuentes de datos, manipular datos y mostrar resultados. La sintaxis de la etiqueta CFML es similar a la sintaxis del elemento HTML.
La plataforma Erlang Open Telecom se diseñó originalmente para su uso dentro de Ericsson como un lenguaje de dominio específico. El lenguaje en sí ofrece una plataforma de bibliotecas para crear máquinas de estados finitos, servidores genéricos y administradores de eventos que permiten rápidamente a un ingeniero implementar aplicaciones o bibliotecas de soporte, que se ha demostrado en los puntos de referencia de la industria que superan a otros lenguajes destinados a un conjunto mixto de dominios. , como C y C++. El lenguaje ahora es oficialmente de código abierto y se puede descargar desde su sitio web.
FilterMeister es un entorno de programación, con un lenguaje de programación basado en C, con el propósito específico de crear complementos de filtro de procesamiento de imágenes compatibles con Photoshop ; FilterMeister se ejecuta como un complemento de Photoshop y puede cargar y ejecutar scripts o compilarlos y exportarlos como complementos independientes. Aunque el lenguaje FilterMeister reproduce una parte importante del lenguaje C y la biblioteca de funciones, contiene solo aquellas características que se pueden usar dentro del contexto de los complementos de Photoshop y agrega una serie de características específicas que solo son útiles en este dominio específico.
La función Plantilla de MediaWiki es un lenguaje integrado de dominio específico cuyo propósito fundamental es respaldar la creación de plantillas de páginas y la transclusión (inclusión por referencia) de páginas de MediaWiki en otras páginas de MediaWiki.
Ha habido mucho interés en lenguajes de dominios específicos para mejorar la productividad y la calidad de la ingeniería de software . El lenguaje específico de un dominio posiblemente podría proporcionar un conjunto sólido de herramientas para una ingeniería de software eficiente. Estas herramientas están empezando a abrirse camino en el desarrollo de sistemas de software críticos.
El kit de herramientas de reducción de costos de software [5] es un ejemplo de esto. El kit de herramientas es un conjunto de utilidades que incluyen un editor de especificaciones para crear una especificación de requisitos , un navegador de gráficos de dependencia para mostrar dependencias variables, un verificador de coherencia para detectar casos faltantes en fórmulas bien formadas en la especificación, un verificador de modelos y un demostrador de teoremas para verifique las propiedades del programa con las especificaciones y un generador de invariantes que construya automáticamente invariantes según los requisitos.
Un desarrollo más reciente es la programación orientada a lenguajes , una metodología integrada de ingeniería de software basada principalmente en la creación, optimización y uso de lenguajes de dominio específico.
Como complemento a la programación orientada a lenguajes , así como a todas las demás formas de lenguajes de dominio específico, se encuentra la clase de herramientas de escritura de compiladores llamadas metacompiladores . Un metacompilador no solo es útil para generar analizadores y generadores de código para lenguajes de dominios específicos, sino que también compila un metalenguaje de dominio específico diseñado específicamente para el dominio de la metaprogramación .
Además de analizar lenguajes de dominios específicos, los metacompiladores son útiles para generar una amplia gama de herramientas de análisis e ingeniería de software. La metodología del metacompilador se encuentra a menudo en sistemas de transformación de programas .
Los metacompiladores que desempeñaron un papel importante tanto en la informática como en la industria informática incluyen Meta-II , [6] y su descendiente TreeMeta . [7]
Unreal y Unreal Tournament dieron a conocer un lenguaje llamado UnrealScript . Esto permitió un rápido desarrollo de modificaciones en comparación con el competidor Quake (que utiliza el motor Id Tech 2 ). El motor Id Tech utilizaba código C estándar , lo que significa que C debía aprenderse y aplicarse correctamente, mientras que UnrealScript se optimizó para facilitar su uso y eficiencia. De manera similar, el desarrollo de juegos más recientes introdujo sus propios lenguajes específicos; un ejemplo más común es Lua para secuencias de comandos. [ cita necesaria ]
Se han desarrollado varios motores de reglas comerciales para automatizar políticas y reglas comerciales utilizadas tanto en el gobierno como en la industria privada. ILOG , Oracle Policy Automation , DTRules, Drools y otros brindan soporte para DSL destinados a admitir varios dominios de problemas. DTRules llega incluso a definir una interfaz para el uso de múltiples DSL dentro de un conjunto de reglas.
El propósito de los motores de reglas de negocios es definir una representación de la lógica de negocios de la manera más legible posible para los humanos. Esto permite que tanto los expertos en la materia como los desarrolladores trabajen y comprendan la misma representación de la lógica empresarial. La mayoría de los motores de reglas proporcionan un enfoque para simplificar las estructuras de control de la lógica empresarial (por ejemplo, utilizando reglas declarativas o tablas de decisiones ) junto con alternativas a la sintaxis de programación a favor de los DSL.
Los modeladores estadísticos han desarrollado lenguajes de dominio específico como R (una implementación del lenguaje S ), Bugs , Jags y Stan . Estos lenguajes proporcionan una sintaxis para describir un modelo bayesiano y generan un método para resolverlo mediante simulación.
Genere manejo de objetos y servicios basados en un lenguaje de descripción de interfaz para un lenguaje específico de dominio, como JavaScript para aplicaciones web, HTML para documentación, C++ para código de alto rendimiento, etc. Esto se realiza mediante marcos de trabajo en varios lenguajes como Apache Thrift o Búferes de protocolo de Google .
Gherkin es un lenguaje diseñado para definir casos de prueba para verificar el comportamiento del software, sin especificar cómo se implementa ese comportamiento. Está destinado a ser leído y utilizado por usuarios no técnicos utilizando una sintaxis de lenguaje natural y un diseño orientado a líneas . Las pruebas definidas con Gherkin deben luego implementarse en un lenguaje de programación general. Luego, los pasos de un programa Gherkin actúan como una sintaxis para la invocación de métodos accesible para quienes no son desarrolladores.
Otros ejemplos destacados de lenguajes de dominio específico incluyen:
Algunas de las ventajas: [2] [3]
Algunas de las desventajas:
{{cite journal}}
: Citar diario requiere |journal=
( ayuda ){{cite journal}}
: Citar diario requiere |journal=
( ayuda )