La programación declarativa
Comenzaremos el estudio de los paradigmas de programación con el más sencillo de todos: la programación funcional.
Los motivos, mencionados en la introducción se pueden resumir del siguiente modo:
- es el más simple
- es la base para todos los demás paradigmas
Esto último significa que todos los demás paradigmas se pueden obtener añadiendo nuevos conceptos uno por uno a los ya incluidos en el paradigma funcional.
Pero antes de entrar de lleno con el estilo funcional, hace falta aclarar primero un concepto mucho más amplio que abarca al estilo funcional y a muchos de los otros paradigmas que revisaremos más adelante: este es el concepto de programación declarativa. El paradigma funcional es de hecho un tipo de programación declarativa. Así que resulta conveniente comprender bien este concepto antes de revisar a la programación funcional en sí.
La programación declarativa
qué es la programación declarativa se puede considerar desde dos perspectivas: una a largo plazo y otra a corto plazo.
A largo plazo:
- es una visión hacia el futuro
- sólo decimos el resultado que queremos (dando las propiedades que debe tener el resultado)
- dejamos que la computadora descifre por sí misma cómo alcanzar ese resultado
Lo opuesto a declarativo se denomina «imperativo». En este último, las instrucciones dadas a la computadora son «comandos», el cómo llegar al resultado que buscamos. En cambio, la programación declarativa sólo se limita a instruir a la computadora con las propiedades que debe tener el resultado que buscamos.
¿Cómo se vuelve realidad la visión declarativa de la programación?
La historia de la computación se podría resumir en una serie de diseños progresivos de lenguajes de programación, compiladores, sistemas, herramientas, etc.. que tienen por objetivo hacer más y más fácil la vida del desarrollador. En otras palabras, en ir volviendo poco a poco más real la capacidad de hacer mucho más con el mismo esfuerzo de programación. Podría considerarse, por lo tanto, toda la historia de la computación como un progreso hacia lo más declarativo. (Pues se facilita el desarrollo si el programador se concentra más en el problema, en sus propiedades, que en diseñar los «comandos» para obtener su solución) Y por supuesto, también hacia lo más rápido y lo más barato - las tres cosas están conectadas. El hecho de que obtengamos más rápidez a menor precio nos permite volver las cosas más declarativas. Y hoy en día, esto se ha vuelto muy sofisticado. Por ejemplo, hay una técnica llamada aprendizaje automático en la que tenemos un algoritmo que aprende cómo hacer algo. En lugar de decir a la computador cómo hacer algo, podemos decirle que aprenda a hacerlo. Esta es otra forma de programar muy declarativa.
A corto plazo:
- el uso de matemáticas en la programación (aplicando conceptos como funciones y relaciones). De este modo una computación se puede modelar y calcular, por ejemplo, como si se tratara de una función o una relación, y desde allí, simplificar la programación con el poder de las matemáticas. (Con cosas como la confluencia y la transparencia referencial)
La programación declarativa es muy común en la práctica. Hay muchos lenguajes que implementan derivados de este tipo de programación, como lo es la programación funcional. Para este último, por ejemplo, están LISP, Scheme, ML, Haskell, y OCaml, entre algunos. También hay lenguajes muy comunes que siguen un paradigma derivado conocido como programación lógica. En estos se encuentran: SQL y Prolog. Y también algunos que siguen una suerte de combinación entre los estilos anteriormente mencionados, entre los que están lenguajes como XSL y XSLT para formatear y transformar documentos, respectivamente.
A este tipo de programación que hace uso de las matemáticas para modelar y estudiar sus computaciones, también se le llama «programación sin estados», donde estado se refiere a la capacidad de actualizar las estructuras de datos (asignarles destructivamente nuevos valores) que forman parte del programa. En el enfoque declarativo no se actualizan/modifican las estructuras, sino que una vez definidas/creadas se mantienen sin cambiar a lo largo del programa. Esto implica que la verificación y testing que se realice posteriormente al programa sea mucho más simple. En esta forma de ver las cosas, se puede diferenciar lo declarativo de lo imperativo, en que lo primera es una programación «sin estados» y lo último, una programacion «con estados».
El paradigma funcional
Comprendiendo qué es la programación declarativa, y que la programación funcional es un derivado de ella, podemos entender ciertas ventajas claves que rodean a la programación funcional.
Las funciones no cambian. Esto significa que un programa que funcione hoy, debería funcionar mañana. Una función sólo describe un problema, y las propiedades del problema, o cuál es el problema, no debería cambiar con el tiempo. Lo único que cambia son los argumentos, pero no las funciones.
Esta última característica es tan poderosa, que por sí misma es suficiente para argumentar que todos los lenguajes deberían animar a programar en este estilo. Por ejemplo, a programar cosas muy comunes hoy en día como «servidores sin estado» para aplicaciones de cliente/servidor, o «componentes sin estado» para una aplicación de servicios.
Aprender programación funcional nos ayuda a pensar en este estilo. Concentrarse en las propiedades del problema. Y dado que es un derivado de la programación declarativa, es una excelente manera de empezar a pensar de forma declarativa.