Un Domain-Specific Language (DSL) es un lenguaje de programación o especificación con un alcance limitado, diseñado específicamente para un dominio de aplicación particular. A diferencia de los General-Purpose Languages (GPLs) como Java, Python o C++, que son versátiles para una amplia gama de problemas, un DSL se enfoca en la terminología y las abstracciones de un dominio específico. Esto permite a los expertos del dominio expresar soluciones de manera más concisa, legible y menos propensa a errores, ya que el lenguaje está intrínsecamente alineado con los conceptos del problema a resolver. Los DSLs pueden ser internos (implementados dentro de un GPL) o externos (con su propio parser y compilador/intérprete).

En el mundo real, los DSLs son omnipresentes. Ejemplos incluyen SQL para la gestión de bases de datos relacionales, HTML y CSS para la descripción de la estructura y estilo de páginas web, o Regex para la definición de patrones de búsqueda de texto. En el ámbito de la infraestructura y la configuración, herramientas como Terraform utilizan un DSL (HashiCorp Configuration Language - HCL) para describir la infraestructura como código, mientras que Kubernetes emplea YAML/JSON con un esquema específico como un DSL para definir el estado deseado de los clústeres. Makefiles para la automatización de compilaciones y Antlr para la generación de parsers son otros ejemplos claros de DSLs que simplifican tareas complejas en sus respectivos dominios.

Para un arquitecto, la elección de implementar o utilizar un DSL es una decisión estratégica con importantes trade-offs. Un DSL puede mejorar significativamente la productividad y la claridad para los expertos del dominio, reducir la complejidad de la lógica de negocio y facilitar la validación y el mantenimiento. Sin embargo, su creación y mantenimiento (especialmente para DSLs externos) implican una inversión considerable en herramientas de parsing, compilación y depuración. Los arquitectos deben evaluar si la complejidad del dominio justifica la creación de un DSL, considerando el costo de desarrollo, la curva de aprendizaje para los usuarios, la integración con otros sistemas y el riesgo de crear un 'lenguaje de nicho' que pueda ser difícil de soportar a largo plazo. Un DSL bien diseñado puede ser una poderosa herramienta para encapsular conocimiento y automatizar procesos, pero uno mal concebido puede añadir una capa innecesaria de complejidad.