Lenguaje específico del dominio ( eng. lenguaje específico del dominio , DSL - " lenguaje específico del dominio "): un lenguaje informático especializado para un área de aplicación específica (a diferencia de un lenguaje de propósito general aplicable a una amplia gama de áreas y que no toma en cuenta las características de las áreas específicas de conocimiento). La construcción de dicho lenguaje y/o su estructura de datos reflejan las especificidades de las tareas resueltas con su ayuda [1] . Es un concepto clave de la programación orientada al lenguaje .
Estrictamente hablando, la división de los lenguajes de programación en lenguajes de propósito general y de dominio específico es muy arbitraria, especialmente cuando se considera que formalmente cualquier protocolo o formato de archivo es un archivo . Hay muchos lenguajes de propósito general que se usan como lenguajes específicos de dominio para ciertas tareas, y viceversa, lenguajes específicos de dominio que se usan como lenguajes de propósito general. Entonces, el lenguaje ML , que dio lugar a toda una familia de lenguajes de propósito general (incluido Haskell ), se desarrolló originalmente como un DSL para el sistema de prueba de teoremas LCF . Un ejemplo que muestra la condicionalidad de la clasificación es el lenguaje BNF (y el compilador Lex / Yacc ): por un lado, este es un ejemplo vívido de un metalenguaje , por otro lado, está diseñado para una tarea específica.
Los lenguajes específicos de dominio más simples que se usan en una aplicación en particular a menudo se denominan "mini-lenguajes" [2] .
Martin Ward [ 3] en su obra "Programación Orientada al Lenguaje" [4] (que se considera el punto de partida para el desarrollo de LOP ), utilizó los términos " orientado a problemas " y " orientado al dominio ", pero en el lenguaje científico angloparlante comunidad el término " específico del dominio ", además, es " lenguaje específico del dominio ", y no " lenguaje de programación específico del dominio ". En la literatura rusa sobre programación, hay opciones " específicas de dominio ", " orientadas a problemas ", " orientadas a dominios ".
Fowler [5] y Dmitriev [6] definen el concepto de DSL como " un lenguaje de programación simplificado (en su mayoría Turing incompleto ) ".
Los principales investigadores de la programación orientada a lenguajes (Martin Ward, Paul Hudak , Walid Taha y otros) citan los siguientes ejemplos de lenguajes específicos de dominio como clásicos [4] [7] [8] :
Según Walid Tahi, desde el punto de vista de LOP , Microsoft Excel es quizás el lenguaje de programación más utilizado en el mundo [8] .
Otros ejemplos de lenguajes específicos de dominio son los lenguajes de gestión de bases de datos (además de SQL aquí, por ejemplo, se puede llamar lenguaje FoxPro ), lenguajes de comandos del sistema operativo (lenguajes de shell de comandos interactivos, principalmente Unix Shell , lote lenguajes de trabajo como JCL , etc.) [9] , Turing lenguajes de estructuración de datos incompletos ( XML , .ini , .conf), lenguaje de marcado wiki , lenguajes de modelado ( UML , GPSS ), Erlang para multi -servidores de usuario funcionando en modo ininterrumpido.
Hay lenguajes de programación integrados en el sistema de gestión de recursos empresariales (lenguaje ABAP en SAP / R3, lenguajes de sistemas Galaktika, Parus, 1C, Info-Contabilidad) y se utiliza para complementarlos con módulos específicos de la organización. El uso de un lenguaje embebido simplifica la programación de tareas específicas, ya que el lenguaje contiene inicialmente los conceptos del área temática. Alguno[ ¿Qué? ] Los sistemas de información geográfica y CAD también tienen lenguajes de programación incorporados.
Otros ejemplos:
En ocasiones, los lenguajes informáticos se implementan de forma dependiente, es decir, "dentro" de un lenguaje traducido , sin el cual estos lenguajes no solo no se pueden ejecutar, sino que muchas veces no forman un sistema de símbolos coherente y no tienen Turing . integridad _ Dichos lenguajes se denominan " lenguajes específicos de dominio incorporados " ( ing. DSL incorporado , EDSL ; a veces DSEL ) o simplemente " lenguajes incorporados " ( lenguaje incorporado ) [7] [10] , así como "lenguajes implementados en parte superior o basada en este idioma ".
Además de la división tradicional de lenguajes en lenguajes interpretados y compilados , los lenguajes integrables introducen varios tipos más de implementación de lenguaje:
Por otro lado, una implementación de un lenguaje integrable puede verse como una " implementación sin traducción ", lo que implica que el DSL será un subconjunto sintáctico y semántico del lenguaje en el que está integrado [11] .
Un lenguaje utilizado como lenguaje base para la implementación de otro a menudo se denomina metalenguaje .
Hay tres razones principales para desarrollar lenguajes de texto incrustado:
Los ejemplos más comunes de lenguajes del primer grupo son implementaciones de características orientadas a objetos en lenguajes funcionales [12] o procedimentales [13] , y CLOS es un ejemplo clásico . Cabe señalar que el término "lenguaje" no siempre se usa aquí; a veces solo hablan de " implementación de nuevas funciones en el lenguaje " o sobre " extensión del lenguaje por un subsistema destinado a resolver ciertas tareas ", y hay no existe una división estricta en “ bibliotecas ” y “lenguajes integrados”, ya que formalmente cualquier API , protocolo o estructura de datos puede ser considerado como un lenguaje [14] . Entonces, por ejemplo, una parte integral del lenguaje Lisp es un lenguaje integrado de expresión S completa que no es de Turing .
El segundo grupo de lenguajes integrables está más representado en la comunidad de lenguajes de Haskell y, por lo tanto , a veces se hace referencia a Haskell como el " DSL para la semántica denotacional " [7] . Ejemplos son Elm y otros lenguajes que representan el paradigma reactivo funcional , así como el lenguaje Curry . A veces, también hay una expresión similar en relación con Lisp : " Lisp no es un lenguaje, sino un marco para desarrollar lenguajes ". Un ejemplo de un lenguaje implementado sobre Lisp es Qi . Muchos mini-lenguajes integrables se implementan en el lenguaje OCaml a través del módulo compilador CamlpX . El lenguaje Rebol también fue diseñado para la programación a través de una fuerte implementación de minilenguajes integrados. El dialecto Scheme de Lisp implementa el lenguaje completo no Turing SXML utilizando el lenguaje S-expression , que implementa el protocolo XML de una manera integrable.
Un lenguaje incrustable puede tener una semántica completa de Turing autosuficiente , pero sin embargo, en lugar de una implementación independiente , reutiliza componentes del lenguaje base (el tercer grupo, una mezcla de los dos primeros). Un ejemplo sorprendente es el lenguaje Schelog [15] , que implementa la semántica de Prolog dentro del esquema del dialecto Lisp a través de continuaciones , y convierte a Prolog de un lenguaje "independiente" en uno integrable. La tarea educativa o “deportiva” tradicional para muchos lenguajes funcionales es la implementación de algún otro lenguaje además del lenguaje en consideración, más a menudo el lenguaje de la lógica de predicados de primer orden [16] .
En el contexto de los metalenguajes, los lenguajes independientes a veces se denominan "lenguajes de primera clase" (similares a las entidades de primera clase en los lenguajes), y los lenguajes incrustados a veces se denominan "lenguajes objeto".
En la gran mayoría de los casos, los lenguajes incrustados solo tienen una implementación compatible, y las diferencias en la representación de la máquina resultante del código en ellos dependen solo del traductor de lenguaje base utilizado. Sin embargo, hay excepciones; por ejemplo, el lenguaje ML concurrente (CML), que amplía el ML estándar con construcciones para el paralelismo explícito , tiene dos implementaciones fundamentalmente diferentes.
Uno de los lenguajes (base o incrustado) puede ser visual , que se usa a menudo en la programación de usuarios ( desarrollo de usuario final ) . Ejemplos típicos de estos pares son AutoLisp - AutoCAD y VBA - Microsoft Excel . Dichos pares forman un sistema interactivo completo y es imposible (y no necesario) determinar desde el punto de vista del usuario si las herramientas visuales son un complemento que imita los comandos del lenguaje de texto integrado o si el texto el lenguaje controla las herramientas visuales. Las relaciones reales en estos pares dependen del desarrollador.
En un par de Emacs - Emacs Lisp , la relación está más definida. Lisp se clasifica tradicionalmente como un metalenguaje , y en este caso se construye un editor de texto sobre él como un DSL visual , lo que hace que este último sea mutable y extensible.
En el caso de que ambos lenguajes sean visuales, los lenguajes incrustados generalmente se denominan con otros términos: complementos , filtros, etc., y no utilizan la terminología de la programación orientada al lenguaje. Formalmente , podemos decir, por ejemplo, que existen muchos mini-lenguajes visuales integrables para el metalenguaje visual de procesamiento de gráficos de Adobe Photoshop (ver Photoshop plugin ).
Los lenguajes de programación lógicos y funcionales parecen poco naturales en un entorno visual, ya que la programación funcional y la programación lógica pura prohíben los efectos secundarios y para la interacción con la GUI ; su integridad conceptual tiene que ser violada. Desde un punto de vista pedagógico, se considera deseable enseñar programación utilizando herramientas de consola para centrar la atención de los estudiantes en los conceptos básicos de algoritmización, y no en la ergonomía, y menos aún en las habilidades procedimentales en el uso de ciertos IDE [17] .
Las ventajas y desventajas de usar un DSL específico en lugar de un lenguaje de propósito general en una tarea particular son mucho más claras que las ventajas y desventajas de usar un lenguaje de propósito general en lugar de otro: en la mayoría de los casos, un DSL ya desarrollado resulta ser ser conceptualmente inaplicable a algunas tareas y da una ventaja indiscutible en la mayoría de los indicadores de calidad en otras, y algunas subtareas generalmente quedan sin resolver hasta el desarrollo de DSL [4] .
Por tanto, es más correcto plantear la cuestión de las ventajas y desventajas a la luz del uso de una metodología orientada al lenguaje en lugar de cualquier otra en ausencia inicial de un DSL listo para usar, comparando la ganancia potencial de su uso con la costes de su desarrollo y mantenimiento.