En ciencias de la computación , la programación declarativa es un paradigma de programación, un estilo de construcción de la estructura y los elementos de los programas de computadora, que expresa la lógica de una computación sin describir su flujo de control . [1]
Muchos lenguajes que aplican este estilo intentan minimizar o eliminar los efectos secundarios describiendo lo que el programa debe lograr en términos del dominio del problema , en lugar de describir cómo lograrlo como una secuencia de las primitivas del lenguaje de programación [2] (el cómo se deja hasta la implementación del lenguaje ). Esto contrasta con la programación imperativa , que implementa algoritmos en pasos explícitos. [3]
La programación declarativa a menudo considera los programas como teorías de una lógica formal y los cálculos como deducciones en ese espacio lógico. La programación declarativa puede simplificar enormemente la escritura de programas paralelos . [4]
Los lenguajes declarativos comunes incluyen los de los lenguajes de consulta de bases de datos (por ejemplo, SQL , XQuery ), expresiones regulares , programación lógica , programación funcional y sistemas de gestión de configuración .
Definición
La programación declarativa se define a menudo como cualquier estilo de programación que no sea imperativo . Varias otras definiciones comunes intentan definirlo simplemente contrastándolo con la programación imperativa. Por ejemplo:
- Un programa de alto nivel que describe lo que debe realizar un cálculo.
- Cualquier lenguaje de programación que carece de efectos secundarios (o más específicamente, es referencialmente transparente )
- Un lenguaje con una clara correspondencia con la lógica matemática . [5]
Estas definiciones se superponen sustancialmente.
La programación declarativa es un estilo de programación no imperativo en el que los programas describen los resultados deseados sin enumerar explícitamente los comandos o pasos que deben realizarse. Los lenguajes de programación funcional y lógica se caracterizan por un estilo de programación declarativa. En los lenguajes de programación lógica , los programas constan de declaraciones lógicas y el programa se ejecuta buscando pruebas de las declaraciones.
En un lenguaje funcional puro , como Haskell , todas las funciones no tienen efectos secundarios , y los cambios de estado solo se representan como funciones que transforman el estado, que se representa explícitamente como un objeto de primera clase en el programa. Aunque los lenguajes funcionales puros no son imperativos, a menudo proporcionan una facilidad para describir el efecto de una función como una serie de pasos. Otros lenguajes funcionales, como Lisp , OCaml y Erlang , admiten una mezcla de programación funcional y procedimental.
Algunos lenguajes de programación lógica, como Prolog , y lenguajes de consulta de bases de datos, como SQL, aunque declarativos en principio, también admiten un estilo de programación procedimental.
Subparadigmas
La programación declarativa es un término general que incluye varios paradigmas de programación más conocidos .
Programación de restricciones
La programación de restricciones establece relaciones entre variables en forma de restricciones que especifican las propiedades de la solución de destino. El conjunto de restricciones se resuelve dando un valor a cada variable para que la solución sea consistente con el número máximo de restricciones. La programación de restricciones a menudo complementa otros paradigmas: programación funcional, lógica o incluso imperativa.
Idiomas específicos del dominio
Ejemplos bien conocidos de lenguajes declarativos específicos de dominio (DSL) incluyen el lenguaje de entrada del generador de analizador yacc , QML , el lenguaje de especificación de compilación Make , el lenguaje de gestión de configuración de Puppet , expresiones regulares y un subconjunto de SQL (consultas SELECT, por ejemplo ). Los DSL tienen la ventaja de ser útiles aunque no necesariamente necesitan ser Turing-completos , lo que facilita que un lenguaje sea puramente declarativo.
Muchos lenguajes de marcado como HTML , MXML , XAML , XSLT u otros lenguajes de marcado de la interfaz de usuario suelen ser declarativos. HTML, por ejemplo, solo describe lo que debería aparecer en una página web; no especifica ni el flujo de control para representar una página ni las posibles interacciones de la página con un usuario.
Como de 2013[actualizar]algunos sistemas de software [ ¿cuáles? ] combinan los lenguajes de marcado de la interfaz de usuario tradicionales (como HTML) con el marcado declarativo que define qué (pero no cómo) deben hacer los sistemas de servidor back-end para admitir la interfaz declarada. Dichos sistemas, que suelen utilizar un espacio de nombres XML específico del dominio , pueden incluir abstracciones de la sintaxis de la base de datos SQL o llamadas parametrizadas a servicios web mediante transferencia de estado representacional (REST) y SOAP . [ cita requerida ]
Programación funcional
Los lenguajes de programación funcional como Haskell , Scheme y ML evalúan expresiones a través de la aplicación de funciones. A diferencia del paradigma relacionado pero más imperativo de la programación procedimental , la programación funcional pone poco énfasis en la secuenciación explícita. Por ejemplo, en Scheme , el orden de evaluación de muchos tipos de subexpresiones no está definido o está implícito. [6] En cambio, los cálculos se caracterizan por varios tipos de aplicación y composición de funciones recursivas de orden superior , con referencias explícitas a E / S y datos que aparecen con moderación , y la mutación de estado se evita o se encapsula siempre que sea posible.
Idiomas híbridos
Los Makefiles, por ejemplo, especifican las dependencias de forma declarativa, [7] pero también incluyen una lista imperativa de acciones a realizar. De manera similar, yacc especifica una gramática libre de contexto de manera declarativa, pero incluye fragmentos de código de un lenguaje anfitrión, que generalmente es imperativo (como C ).
Programación lógica
Lenguajes de programación lógica como el estado de Prolog y las relaciones de consulta. Los detalles de cómo se responden estas consultas depende de la implementación y su demostrador de teoremas, pero generalmente toman la forma de algún tipo de unificación . Al igual que la programación funcional, muchos lenguajes de programación lógica permiten efectos secundarios y, como resultado, no son estrictamente declarativos.
Modelado
Los modelos o representaciones matemáticas de sistemas físicos pueden implementarse en código de computadora que es declarativo. El código contiene una serie de ecuaciones, no asignaciones imperativas, que describen ("declaran") las relaciones de comportamiento. Cuando un modelo se expresa en este formalismo, una computadora puede realizar manipulaciones algebraicas para formular mejor el algoritmo de solución. La causalidad matemática se impone típicamente en los límites del sistema físico, mientras que la descripción conductual del sistema en sí es declarativa o acausal. Los lenguajes y entornos de modelado declarativo incluyen Analytica , Modelica y Simile . [8]
Ver también
- Comparación de paradigmas de programación
- Programación inductiva
- Lista de lenguajes de programación declarativos
Referencias
- ^ Lloyd, JW, ventajas prácticas de la programación declarativa
- ^ "lenguaje declarativo" . FOLDOC . 17 de mayo de 2004 . Consultado el 26 de enero de 2020 .
- ^ Sebesta, Robert (2016). Conceptos de lenguajes de programación . Boston: Pearson. ISBN 978-0-13-394302-3. OCLC 896687896 .
- ^ "DAMP 2009: Taller sobre Aspectos Declarativos de la Programación Multinúcleo" . Cse.unsw.edu.au. 20 de enero de 2009 . Consultado el 15 de agosto de 2013 .
- ^ Chakravarty, Manuel MT (14 de febrero de 1997). Sobre la ejecución masiva paralela de programas declarativos (tesis doctoral). Universidad Técnica de Berlín . Consultado el 26 de febrero de 2015 .
En este contexto, el criterio para llamar declarativo a un lenguaje de programación es la existencia de una correspondencia clara, matemáticamente establecida entre el lenguaje y la lógica matemática, de modo que una semántica declarativa para el lenguaje pueda basarse en el modelo o en la teoría de la prueba (o en ambos). de la lógica.
- ^ " 7 Informe revisado sobre el esquema de lenguaje algorítmico" (PDF) . Grupo de trabajo del esquema 1 . Consultado el 5 de diciembre de 2020 .
- ^ [1] Archivado el 23 de octubre de 2007 en la Wayback Machine.
- ^ "Modelado declarativo" . Simulística . Consultado el 15 de agosto de 2013 .
enlaces externos
- Frans Coenen. Características de los lenguajes de programación declarativos . 1999.
- Robert Harper .
- ¿Qué es, si es que hay algo, un lenguaje declarativo? . 2013.
- Existe algo como un lenguaje declarativo y es el mejor DSL del mundo . 2013.
- Olof Torgersson. Una nota sobre los paradigmas de programación declarativa y el futuro de la programación definitoria . 1996.