LenguajeDeDominioEspecífico
Escrito por Martin Fowler
Traducido por Miguel Figueroa-Calix
Revisado por Carmen Vidal
La idea básica de un lenguaje de dominio específico (DSL por sus siglas en ingles) es que en vez de ser una lengua de proposito general que se dirige a cualquier clase de problema de programación, es un lenguaje de programación que ataca a un problema particular. Los lenguajes de dominio específico se han discutido y utilizado casi desde los inicios de la computación.
Una comunidad que utiliza mucho los DSLs es la comunidad de Unix donde se les refiere a menudo como pequeños idiomas o mini idiomas. (Eric Raymond proporciona una buena discusión de esta tradición). El enfoque más común al estilo unix es definir una sintaxis de la lengua y entonces o bien usar la generación de código para un lenguaje de propósito general, o escribir un intérprete para el DSL. Unix tiene muchas herramientas que hacen esto más fácil. Yo utilizo el término DSL Externo para referirme a esta clase de DSL. Los archivos de configuración de XML son otra forma común del DSL externo.
Las comunidades de Lisp y Smalltalk también tienen una fuerte tradición de DSLs, pero tienden a hacerlo de otra forma. En vez de definir un nuevo lenguaje, ellos moldean el lenguaje de proposito general dentro del DSL. (Paul Graham proporciona una buena descripción en Programación de abajo para arriba .) Este DSL Interno (también llamado el DSL encajado) utiliza la construcción del lenguaje de programación en sí mismo para definir al DSL. Esta es una manera común de trabajar en cualquier lenguaje, yo siempre he pensado en definir funciones de tal manera que proporcione una forma de DSL para mi problema. Pero a menudo lispers y smalltalkers toman esto a niveles mas altos.
Tengo un ejemplo más amplio de ambas clases de DSL en mi reciente articulo Language Workbenches. También hablo mucho más sobre los pros y contras de los dos estilos y el desarrollo reciente de plataformas de desarrollo para los lenguajes con la esperanza de dar más difusión a los DSLs.
Estas dos corrientes llegan a una confluencia interesante en la figura de PragDave. Los programadores pragmáticos han sido grandes admiradores de DSLs, primeramente por su tradición en Unix (hay una discusión excelente en la sección 12 de El Programador Pragmático - quizás lo debería llamar Pragmaticum 12). En una bien pensada entrevista Dave dijo que mientras él utiliza regularmente generación de código, él raramente la utiliza cuando programa en Ruby.
Siempre he utilizado la analogía de crear un DSL para ayudarme a pensar cuando estoy moldeando un diseño – desarrollando clases y métodos con la intención de que se conviertan en un DSL. Aplico esto lo más posible dentro del lenguaje que estoy usando, pero si no puedo entonces estoy más que listo para cambia a la generación de código. En ThoughtWorks hemos utilizado extensamente la generación del código y técnicas similares en nuestros sistemas más grandes. El punto en el cual abro la compuerta para un DSL separado es claramente diferente entre los lenguajes de programación. Nunca sentí la necesidad en Smalltalk de usar un lenguaje separado, mientras que es muy común en C++/Java/C #.
Por lo tanto me parece ciertamente que unos lenguajes son mas apropiados para usar DSL implantado que otros. Al considerar lisp y Smalltalk he concluido que los lenguajes más convenientes son los minimalistas con una sóla idea básica que es más profunda y más simple que los lenguajes tradicionales (el uso de funciones en lisp, objetos y mensajes en Smalltalk). Pero Ruby es más convencional y mucho más grande que estos dos, con todo y eso sigue siendo conveniente para DSLs implantados.
Quizás entonces es que los lenguajes de programación necesitan tener una idea básica y concisa. Necesitan hacer fácil decir cosas comunes y darnos una sintaxis agradable y así evitar situaciones complejas. Yo pienso que existe un punto importante aquí. A menudo encuentro difícil poner en palabras por qué disfruto mucho más la programación en Smalltalk o Ruby que en Java o C #. La razón más discutida es los tipos estáticos contra los dinámicos, pero siempre he sentido que esa discusión olvida lo importante. La aceptación hacia DSLs implantados se acerca más a la esencia de la diferencia.

