Con el surgimiento de la metodología de Modelado Específico de Dominio (Domain-specific modelling) para el desarrollo de sistemas, cada vez se utiliza más el término de Lenguaje Específico de Dominio (o DSL).
En este artículo veremos exactamente qué es un Lenguaje Específico de Dominio, cuál es su uso, que ejemplos existen que usamos a diario, y las ventajas y desventajas de su aplicación.
¿Qué es un DSL?
En el desarrollo de software, un lenguajes específico de dominio (domain-specific language - DSL) es un lenguaje de programación dedicado a un problema de dominio en particular, o una técnica de representación o resolución de problemas específica. Este concepto no es nuevo, ya que desde siempre existieron lenguajes de programación de propósito específico.
Lo opuesto a un lenguaje específico de dominio son:
- los lenguajes de programación de propósito general, como C o Java.
- los lenguajes de modelado de propósito general, como UML.
Como ejemplos de DSL podemos mencionar a las fórmulas y macros de las planillas de cálculo, las expresiones regulares de ciertas utilidades, Csound (un lenguaje para crear archivos de audio), y más.
Crear un DSL (con el software que lo soporte) puede valer la pena si el lenguaje permite expresar tipos de problemas y soluciones particulares que los lenguajes pre-existentes no pueden modelar tan fácilmente.
La creación de un DSL
Los DSL se crean específicamente para resolver problemas dentro de un dominio en particular, y no están pensandos para resolver problemas fuera de este dominio (aunque pueda ser técnicamente posible). En cambio, los lenguajes de propósito general se crean para resolver probelmas en muchos dominios. Un dominio también puede ser un área de negocio específica. Algunos ejemplos de áreas de negocio son:
- lenguajes específicos de dominio para políticas de seguros de vida desarrollado internamente en la empresa.
- lenguajes específicos de dominio para simulacros de combate.
- lenguajes específicos de dominio para cálculos de salarios.
- lenguajes específicos de dominio para facturación.
Implementaciones
Los DSL son lenguajes con objetivos muy específicos, tanto en su diseño como en su implementación. Un DSL puede ser tanto un lenguajes de diagramación visual (como el creado por Generic Eclipse Modeling System), o lenguajes textuales. Por ejemplo, la utilidad de línea de comandos grep tiene una sintáxis de expresiones regulares para buscar líneas de texto.
La línea que divide a los DSL y a los lenguajes de scripting es bastante borrosa, pero en general los DSL no tienen funciones de bajo nivel para acceder al sistema de archivos, ni control de interprocesos ni otras características que caracterizan a los lenguajes completos. Muchos DSL no se compilan a código ejecutable, sino a diferentes objetos: por ejemplo, GraphViz exporta a PostCript, GIF, JPEG, etc., Csound compila a archivos de audio, y el lenguaje POV compila hacia archivos gráficos.
El lenguaje SQL es un caso interesante: podría considerarse un DSL porque es específico para un dominio (en este caso, acceder a las bases de datos relacionales), y se suele utilizar dentro de otra aplicación; pero SQL tiene más palabras clave y funciones que muchos lenguajes de scripting, y se suele pensar en SQL como en un lenguaje completo (quizás por la enorme presencia de manipulación de bases de datos en los programas, y por la gran cantidad de experiencia que se necesita para ser experto en este lenguaje).
Para resumir, la siguiente analogía podría ser útil: un Lenguaje Muy Chiquito es como un cuchillo, el cual puede usarse en cientos de formas diferentes, desde cortar comida hasta talar árboles. Un Lenguaje Específico de Dominio es como un taladro eléctrico: es una herramienta poderosa que varios usos, pero dentro de un contexto específico, como ser hacer agujeros (aunque podría usarse también para mezclar pintura o quitar tornillos). Un Lenguaje de Propósito General es como un taller completo, con muchas herramientas para hacer varias tareas. Los DSL deben usarse cuando un programador que está trabajando en su taller se da cuenta que necesita un taladro mejor, y encuentra que ese DSL se ajusta perfectamente a su tarea.
¿Y porqué usar un DSL?
Existen riesgos y oportunidades al adoptar un DSL a nuestras aplicaciones. Un DSL bien diseñado va a lograr el balance apropiado entre ambas.
Los DSL tienen metas de diseño importantes que contrastan con aquellas de los lenguajes de propósito general:
- los DLS tienen menos alcance.
- los DSL son muchos más expresivos dentro de su dominio.
Ventajas de los DSL
- Los DSL permiten expresar soluciones usando los términos y el nivel de abstracción apropiado para el dominio del problema. En consecuencia, los mismos expertos de dominio pueden comprender, validar, modificar y a menudo desarrollar programas en DSL.
- Es código auto-documentado.
- Los DSL mejoran la calidad, productividad, confianza, mantenibilidad, portabilidad y reusabilidad de las aplicaciones.
- Los DSL permiten validaciones a nivel del dominio. Mientras las contrucciones del lenguaje estén correctas, cualquier sentencia escrita puede considerarse correcta.
Desventajas de los DSL
- El costo de aprender un nuevo lenguaje vs. su aplicación limitada.
- El costo de diseñar, implementar y mantener un DSL y las herramientas para trabajar con él.
- Encontrar, establecer y mantener el alcance adecuado.
- Dificultad para balancer las ventajas y desventajas entre las construcciones de los DSL y de los lenguajes de propósito general.
- Potencial périda de eficiencia y rendimiento en comparación con el software escrito "a mano".
Leer más
Pueden leer más sobre los Lenguajes específicos de dominio en la Wikipedia.