Programación Declarativa

por Violeta León

"Si al escribir un programa de cómputo lo que hacemos es explicarle a la computadora por medio de instrucciones detalladas “cómo hay que realizar una tarea”, entonces estamos programando en forma imperativa. Es decir, estamos alimentando los pasos o conjunto de instrucciones necesarias para resolver un problema. Por otro lado, si al escribir un programa estamos describiendo “qué hay que hacer”, entonces estamos programando en forma declarativa. Es decir, describimos el problema que queremos solucionar, pero no las instrucciones necesarias para resolverlo. La programación declarativa es tan solo eso"

    La programación declarativa es un paradigma de programación basado en la lógica en el que se estudian de forma simple muchos aspectos avanzados de los lenguajes de programacion modernos. Este estilo de programación encuentra numerosas aplicaciones industriales en campos como las bases de datos, ingeniería del software, procesadores de lenguajes, lenguaje natural, investigación operativa, seguridad de redes, etc. Por otra parte, la programación declarativa puede interpretarse como aquella dónde el componente lógico determina el significado del programa mientras que el componente de control solamente afecta a su eficiencia. 
Los principales requisitos que debe cumplir la lógica empleada son:

  1. Disponer de un lenguaje que sea suficientemente expresivo;
  2. Disponer de una semántica operacional (un mecanismo de cómputo que permita ejecutar los programas);
  3. Disponer de una semántica declarativa que permita dar un significado a los programas de forma independiente a su posible ejecución;
  4. Resultados de corrección y completitud.
Ventajas de la Programación Declarativa

     Cuando pensamos en los beneficios de programar en forma declarativa, en general se empieza analizando las ventajas propias del lenguaje a utilizar. Por ejemplo, si se está usando un lenguaje funcional, la principal ventaja es que al lidiar puramente con funciones, no necesitamos preocuparnos por el estado de la información, ya que los datos sean inmutables. Por otro lado, en el caso de los lenguajes basado en reglas, los programas son más claros y entendibles incluso por los usuarios. Otras ventajas que podemos mencionar son:

  1. Elegancia, claridad, sencillez, potencia y concisión.
  2. Semánticas claras, simples y matemáticamente bien fundadas.
  3. Cercanos al nivel de abstracción de las especificaciones formales/informales de los problemas a resolver.
  4. Referencialmente transparentes: Comportamiento matemático adecuado que permite razonar sobre los programas.
  5. Soportan técnicas muy avanzadas de desarrollo, mantenimiento y validación de programas.
  6. Altas dosis de paralelismo implícito.
  7. Aplicaciones variadas y de gran interés.
  8. Son fiables, elegantes y expresivos. 
   Por otra parte, el autor Federico Pereiro en su artículo llamado "la programación declarativa, ¿de verdad existe?" menciona las siguientes ventajas desde su propia experiencia:

Ventajas de la Programación Declarativa Según Federico Pereiro

  1. Legibilidad/usabilidad: un DSL usualmente se acerca más a un lenguaje natural (como el Inglés o Español) que a un pseudocódigo y por ello es más fácil de leer y aprender por personas que no son programadores.
  2. Concisión: la mayor parte de la tablatura es extraída por el DSL, dejando así menos líneas para hacer el mismo trabajo.
  3. Reutilización: es más fácil crear un código que puede ser usado para diferentes propósitos; algo que todos saben es extremadamente difícil cuando se usan construcciones imperativas.
  4. Idempotencia: puedes trabajar con estados finales y dejar que el programa haga el resto. Por ejemplo, en una operación de upsert puedes insertar una fila si no está ahí o puedes modificarla si ya se encuentra ahí, esto en lugar de escribir un código que se encargue de ambos casos.
  5. Error de Recuperación: es fácil identificar una construcción que se detendrá ante el primer error, en lugar de tener que añadir listados de errores para cada posible error. (Si alguna vez has escrito 3 retrollamadas o callbacks anidadas en node.js entonces sabes de lo que habló.)
  6. Transparencia Referencial: aunque esta ventaja se asocia más a la programación funcional, la verdad es que es válida para cualquier enfoque que minimice la manipulación manual del estado y se base en efectos secundarios.
  7. Conmutatividad: la posibilidad de expresar un estado final sin que se especifique el orden real en el que se implementará.
Lenguajes Declarativos
 

    Existen una gran cantidad de lenguajes declarativos. En el caso de los funcionales, entre los más populares están Scheme, Erlang, y otros más nuevos como F#. para cierto dominio específico. Los lenguajes de dominio específico comunmente son utilizados para declarar formulario, por ejemplo HTML, XAML, XUL e incluso las hojas de cálculo. Sin embargo, podemos clasificar a los lenguajes declarativos de la siguiente manera:


  • Lenguajes lógicos
Prolog (Programación funcional),
ML (Programación funcional),
Lisp (Programación funcional),
Curry (Programación Lógico-Funcional)
F-Prolog (Programación Lógica Difusa)
 

  • Lenguajes algebraicos
Maude
SQL

  • Lenguajes funcionales
Haskell, (Programación funcional)

Ejemplo de un programa en un Lenguaje Declarativo:


Este sería el código de un programa que determina el factorial de un número en un lenguaje declarativo inventado:

factorial(0) = 1 
factorial(n) = n*factorial(n-1)
 

Como se puede ver, el programa utiliza simplemente 2 líneas. En una está el "caso base", que nos dice que el factorial del número 0 es 1. La otra línea nos dice que el factorial de un número n es n por el factorial de n-1. Un ejemplo de ejecución sería: 

factorial(3)? = 3*factorial(2) = 3*2*factorial(1) = 3*2*1*factorial(0) = 3*2*1*1 = 6

Nótese que el caso base es necesario, sino el programa entraría en un bucle infinito, sin terminar jamás.


Anuncio

Comentarios