Un lenguaje específico de dominio ( 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 solo una o unas pocas piezas de software, como el código suave MUSH . Los DSL se pueden subdividir aún más por 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 la informática, pero el término "lenguaje específico de dominio" se ha vuelto más popular debido al auge del modelado específico de dominio . Los DSL más simples, particularmente los utilizados por una sola aplicación, a veces se denominan informalmente minilenguajes .
La línea entre lenguajes de propósito general y lenguajes de dominio específico no siempre es nítida, ya que un lenguaje puede tener características especializadas para un dominio particular pero ser aplicable de manera más amplia, o por el contrario puede en principio ser capaz de una amplia aplicación pero en la práctica usarse principalmente para un dominio específico. Por ejemplo, Perl fue desarrollado originalmente como un lenguaje de procesamiento de texto y pegamento, para el mismo dominio que AWK y los scripts de shell , pero luego se usó principalmente como un lenguaje de programación de propósito general. Por el contrario, PostScript es un lenguaje Turing-completo y, en principio, se puede usar para cualquier tarea, pero en la práctica se usa estrictamente como un lenguaje de descripción de páginas .
El diseño y uso de DSLs apropiados es una parte clave de la ingeniería de dominios , 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 nuevo DSL. La programación orientada al lenguaje considera la creación de lenguajes de propósito especial para expresar problemas como parte estándar del proceso de resolución de problemas. Crear un lenguaje específico de dominio (con software para respaldarlo), en lugar de reutilizar un lenguaje existente, puede valer la pena si el lenguaje permite que un tipo particular de problema o solución se exprese con mayor claridad de lo que permitiría un lenguaje existente y el tipo de problema en cuestión reaparece con suficiente frecuencia. Pragmáticamente, un DSL puede estar especializado en un dominio de problemas en particular, una técnica de representación de problemas en particular, una técnica de solución en particular u otros aspectos de un dominio.
Un lenguaje específico de dominio se crea específicamente para resolver problemas en un dominio en particular y no está pensado para 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 de negocios. Algunos ejemplos de áreas de negocios incluyen:
Un lenguaje específico de dominio se encuentra en algún punto intermedio entre un lenguaje de programación diminuto y un lenguaje de script , y se suele utilizar de forma análoga a una biblioteca de programación . Los límites entre estos conceptos son bastante difusos, al igual que el límite entre los lenguajes de script y los lenguajes de uso general.
Los lenguajes específicos de dominio son lenguajes (o, a menudo, sintaxis o gramáticas declaradas) con objetivos muy específicos en cuanto a diseño e implementación. Un lenguaje específico de dominio puede ser un lenguaje de diagramación visual, como los creados por el Sistema de modelado genérico de Eclipse , abstracciones programáticas, como el Marco de modelado de Eclipse , 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 lenguajes específicos de dominio y lenguajes de scripting es algo difusa, pero los lenguajes específicos de dominio a menudo carecen de funciones de bajo nivel para el acceso al sistema de archivos, control entre procesos y otras funciones que caracterizan a los lenguajes de programación con todas las funciones, scripting o de otro tipo. Muchos lenguajes específicos de dominio no compilan a código de bytes o código ejecutable, sino a varios tipos de objetos multimedia: GraphViz exporta a PostScript , GIF , JPEG , etc., donde Csound compila a archivos de audio, y un lenguaje específico de dominio de trazado de rayos como POV compila a archivos gráficos.
Un lenguaje de definición de datos como SQL presenta un caso interesante: puede considerarse un lenguaje específico de dominio 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 script, 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 específicos del dominio 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 funcionar como bibliotecas de programación.
Algunos lenguajes específicos de un dominio 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 específico de un dominio 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 su inicio para permitir (en particular en su versión 2.0) varias formas de interacción con el 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 específicos de dominio, como OCL , un lenguaje para decorar modelos con aserciones, o QVT , un lenguaje de transformación específico de dominio. Sin embargo, los lenguajes como UML suelen ser lenguajes de modelado de propósito general.
Para resumir, una analogía puede ser útil: un lenguaje muy pequeño es como un cuchillo, que puede usarse de miles de maneras diferentes, desde cortar comida hasta talar árboles. [ aclaración necesaria ] Un lenguaje específico de dominio es como un taladro eléctrico: es una herramienta poderosa con una amplia variedad de usos, pero un contexto específico, a saber, hacer agujeros en 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 específicos de dominio deberían ser utilizados por programadores que, al observar su banco de trabajo actual, se dan cuenta de que necesitan un taladro mejor y descubren que un lenguaje específico de dominio en particular proporciona exactamente eso. [ cita requerida ]
Los DSL implementados a través de un intérprete o compilador independiente se conocen como lenguajes específicos de dominio externos . Algunos ejemplos conocidos son TeX o AWK. Una categoría separada conocida como lenguajes específicos de dominio integrados (o internos) se implementa normalmente dentro de un lenguaje anfitrión como una biblioteca y tiende a estar limitada a la sintaxis del lenguaje anfitrión, aunque esto depende de las capacidades del lenguaje anfitrión. [1]
Existen varios patrones de uso para lenguajes específicos de dominio: [2] [3]
Muchos lenguajes específicos de dominio se pueden utilizar de más de una manera. [ cita requerida ] El código DSL incrustado en un lenguaje host 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 ingeniería de software basado en un lenguaje específico de dominio implica riesgos y oportunidades. Un lenguaje específico de dominio bien diseñado logra encontrar el equilibrio adecuado entre ambos.
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:
Entre los ejemplos de lenguajes de programación específicos del dominio se incluyen HTML , Logo para dibujos similares a lápices, los 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 , el 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 sintácticos , expresiones regulares para especificar analizadores léxicos , 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 específico de dominio dirigido a programadores novatos para que puedan aprender a programar fácilmente. Si bien el lenguaje funciona como una mezcla de varios lenguajes, incluidos Delphi , C++ y BASIC . La mayoría de las funciones en ese lenguaje, después de compilarse, de hecho llaman a funciones de tiempo de ejecución escritas en un lenguaje específico para la plataforma de destino, por lo que su implementación final no es visible para el usuario. El lenguaje sirve principalmente para que sea fácil para cualquiera aprender el lenguaje y desarrollar un juego, y gracias al tiempo de ejecución GM que maneja el bucle principal del juego y mantiene la implementación de las funciones llamadas, se requieren pocas líneas de código para el juego más simple, en lugar de miles.
El lenguaje de programación asociado de ColdFusion es otro ejemplo de lenguaje específico de dominio para sitios web basados en datos. Este lenguaje de programación se utiliza para combinar 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 de ColdFusion (CFML) incluye un conjunto de etiquetas que se pueden usar en páginas de ColdFusion para interactuar con fuentes de datos, manipular datos y mostrar resultados. La sintaxis de las etiquetas CFML es similar a la sintaxis de los elementos HTML.
FilterMeister es un entorno de programación, con un lenguaje de programación basado en C, cuyo propósito específico es crear complementos de filtros de procesamiento de imágenes compatibles con Photoshop ; FilterMeister se ejecuta como un complemento de Photoshop en sí mismo 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 los lenguajes específicos de dominio para mejorar la productividad y la calidad de la ingeniería de software . Los lenguajes específicos de dominio podrían proporcionar un conjunto sólido de herramientas para una ingeniería de software eficiente. Dichas herramientas están comenzando a abrirse camino en el desarrollo de sistemas de software críticos.
Un ejemplo de esto es el kit de herramientas de reducción de costos de software [5] . El kit de herramientas es un conjunto de utilidades que incluye un editor de especificaciones para crear una especificación de requisitos , un navegador de gráficos de dependencia para mostrar dependencias de variables, un verificador de consistencia para detectar casos faltantes en fórmulas bien formadas en la especificación, un verificador de modelos y un demostrador de teoremas para verificar las propiedades del programa contra la especificación, y un generador de invariantes que construye automáticamente invariantes en función de los requisitos.
Un desarrollo más reciente es la programación orientada al lenguaje , una metodología de ingeniería de software integrada basada principalmente en la creación, optimización y uso de lenguajes específicos del dominio.
Como complemento a la programación orientada al lenguaje , así como a todas las demás formas de lenguajes de dominio específico, se encuentra la clase de herramientas de escritura de compiladores denominadas metacompiladores . Un metacompilador no solo es útil para generar analizadores sintácticos y generadores de código para lenguajes de dominio específico, sino que un metacompilador compila por sí mismo un metalenguaje de dominio específico diseñado específicamente para el dominio de la metaprogramación .
Además de analizar lenguajes específicos de dominio, los metacompiladores son útiles para generar una amplia gama de herramientas de análisis e ingeniería de software. La metodología de metacompiladores se encuentra a menudo en sistemas de transformación de programas .
Los metacompiladores que desempeñaron un papel importante tanto en la ciencia informática como en la industria informática incluyen Meta-II , [6] y su descendiente TreeMeta . [7]
Unreal y Unreal Tournament presentaron un lenguaje llamado UnrealScript . Esto permitió un rápido desarrollo de modificaciones en comparación con el competidor Quake (que utilizaba 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 estaba optimizado 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 scripting. [ cita requerida ]
Se han desarrollado varios motores de reglas de negocios para automatizar las políticas y las reglas de negocios que se utilizan tanto en el gobierno como en la industria privada. ILOG , Oracle Policy Automation , DTRules, Drools y otros brindan soporte para DSL destinados a respaldar varios dominios de problemas. DTRules llega al punto de definir una interfaz para el uso de múltiples DSL dentro de un conjunto de reglas.
El objetivo de los motores de reglas de negocio es definir una representación de la lógica de negocio de la forma más legible posible para los humanos. Esto permite que tanto los expertos en la materia como los desarrolladores trabajen con la misma representación de la lógica de negocio y la comprendan. La mayoría de los motores de reglas ofrecen un enfoque para simplificar las estructuras de control de la lógica de negocio (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 específicos de dominio 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.
Generar manejo de objetos y servicios basados en un lenguaje de descripción de interfaz para un lenguaje específico del dominio como JavaScript para aplicaciones web, HTML para documentación, C++ para código de alto rendimiento, etc. Esto se hace mediante marcos de trabajo multilenguaje como Apache Thrift o Google Protocol Buffers .
Gherkin es un lenguaje diseñado para definir casos de prueba para comprobar el comportamiento del software, sin especificar cómo se implementa ese comportamiento. Está pensado para que lo lean y lo utilicen usuarios no técnicos utilizando una sintaxis de lenguaje natural y un diseño orientado a líneas . Las pruebas definidas con Gherkin deben implementarse luego 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 los no desarrolladores.
Otros ejemplos destacados de lenguajes específicos de dominio incluyen:
Algunas de las ventajas: [2] [3]
Algunas de las desventajas:
{{cite journal}}
: Requiere citar revista |journal=
( ayuda ){{cite journal}}
: Requiere citar revista |journal=
( ayuda )