Programación Declarativa

Publicado en

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.

En realidad, la programación declarativa es un término que agrupa los siguientes paradigmas de programación:

  • Programación lógica. Los problemas se representan por medio de lógica matemática.
  • Programación funcional. Todo se resuelve por medio de la evaluación de funciones matemáticas.
  • Lenguajes de dominio específico (DSLs). Lenguajes descriptivos para un propósito específico, tales como HTML, CSS y SQL.
  • Lenguajes híbridos. Un ejemplo son los archivos “make” que combinan la descripción de dependencias entre componentes, con instrucciones imperativas para compilar o instalar una aplicación.

Ventajas de la programación declarativa

Cuando pensamos en los beneficios de programar en forma declarativa, en general se empieza pensando en 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.

A pesar de todo esto, la ventaja más importante de la programación declarativa consiste en que el indicar a la computadora“qué” tarea es la que tiene que hacer, en lugar de “cómo” hacerla nos protege de cambios en el contexto tecnológico. En ese sentido, el qué perdura mucho más que el cómo.

Un primer ejemplo

Veamos un ejemplo de cómo nos puede ayudar la programación declarativa. Supongamos un caso sencillo de un programa que suma los números del 1 al 100. Una posible solución procedural podría ser un programa similar al siguiente:

int suma = 0;
for (int i = 1 to 100)
    suma += i;
return suma;

Una solución declarativa podría ser simplemente:

suma = Sum(1, 100)

Dado este ejemplo sencillo, lo primero que uno advierte es que se necesita un lenguaje de más alto nivel que dé soporte a las cosas que declaramos: en este caso alguien tiene que implementar el Sum, y el programador no tiene idea cómo se está resolviendo el proceso de la suma.

Hoy, luego de mucho tiempo, estamos frente al fenómeno de que la mejora en desempeño para una máquina no se da simplemente cambiando el procesador, sino que necesitamos sumar más procesadores. Ya muchas computadoras están equipadas con tecnología de cuádruple núcleo.

Aquellos programas como el que hace la suma imperativamente, deberá decir explícitamente (por ejemplo mediante el uso de threads) que necesita hacer uso de los nuevos procesadores. Sin embargo, el programa declarativo no cambia, será exactamente igual y la implementación de cómo se hace la suma es un tema de capas tecnológicas de más bajo nivel. Como desarrollador de aplicaciones de negocio, no quiero perder el foco de lo que quiero hacer y perderme en temas tales como threading, serialización y sincronización.

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.

En Artech, la empresa donde laboro, tenemos un producto llamado GeneXus que permite crear aplicaciones de negocio utilizando programación declarativa. La herramienta utiliza lenguajes declarativos para el modelado de las entidades de negocio, la declaración de reglas de negocio, la especificación de formularios, y la exposición de datos.

Conclusión

Ahora, después de 20 años, los grandes de la industria comienzan a darse cuenta de los beneficios de programar en forma declarativa. Antes de su retiro de Microsoft, el propio Bill Gates aconsejó que “deberíamos estar haciendo las cosas en forma declarativa (…) no deberíamos estar escribiendo tanto código procedural”. Si queremos lograr un verdadero incremento de productividad, es importante que todos dentro de la comunidad del desarrollo de software nos demos cuenta que claramente debe existir un cambio de paradigma a la hora de programar.

Bio

Gastón Milano es un ingeniero uruguayo quien ha trabajado durante muchos años en el desarrollo de software utilizando lenguajes declarativos. Actualmente es Arquitecto de Software de Genexus una herramienta de generación de aplicaciones partiendo de conocimiento declarado.