Diferencias entre paradigmas de programación

Diferencias entre paradigmas de programación
Facebook Twitter Flipboard E-mail



Existen muchos paradigmas de programación diferentes, cada uno de ellos tiene sus propias características y tratan de solucionar los problemas clásicos del desarrollo de software desde diferentes perspectivas y filosofías. Hoy vamos a ver algunas diferencias entre paradigmas de programación populares.

Los paradigmas de programación solo son propuestas tecnológicas adoptadas por la Comunidad de desarrolladores que se enfocan a resolver uno o varios problemas definidos y delimitados. Existen muchos paradigmas de programación diferentes, posiblemente el más ampliamente utilizado hoy en día sea el de la programación orientada a objetos.

Introducción

Algunos lenguajes de programación puede soportar múltiples paradigmas de programación. Por ejemplo, C++ puede ser empleado para desarrollar software utilizando para ello un modelo de programación puramente orientado a objetos o bien puramente estructurado. En casos como el de C++, somos los programadores los que decidimos que utilizar.

Por otro lado, algunos lenguajes han sido diseñados para soportar un único paradigma de programación, ese es el caso de Smalltalk que soporta únicamente la programación orientada a objetos o Haskell que solo soporta la programación funcional.

Algunos paradigmas prohiben el uso de ciertos mecanismos o técnicas. Por ejemplo, en la programación funcional se elimina el uso del efecto secundario en las funciones mientras que en la programación estructurada se desaprueba o incluso elimina el uso de la sentencia goto.

Es realmente común el diseño de lenguajes que soporten múltiples paradigmas de programación. Estos lenguajes son aquellos que soportan al menos dos paradigmas. Dentro de esta categoría podemos encontrar nuevas caras y viejos conocidos:

  • Scala: Imperativo, orientado a objetos, funcional, genérico y concurrente

  • Erlang: Funcional, concurrente y distribuido

  • Perl: Imperativo, orientado a objetos y funcional

  • PHP: Imperativo, orientado a objetos, funcional y reflexivo

  • JavaScript: Imperativo, orientado a objetos (prototipos) y funcional

  • Java: Imperativo, orientado a objetos, reflexivo y genérico

  • Python y Ruby: Imperativo, orientado a objetos, reflexivo y funcional

  • C++: Imperativo, orientado a objetos, funcional y genérico

  • C#: Imperativo, orientado a objetos, funcional (lambda), reflexivo y genérico

Estos son algunos ejemplos, existen lenguajes como Oz que soporta nueve paradigmas de programación, para algunos es un acierto y para otros un error. En cualquier caso en este artículo no vamos a argumentar si soportar uno, dos, seis o diez paradigmas es un acierto o no, eso lo dejamos a decisión de cada cual.

Programación Imperativa

En la programación imperativa se describen sentencias que modifican el estado de un programa. En muchos sentidos la programación imperativa es la programación natural para las CPUs que se basan en ese paradigma al nivel más básico.

En este paradigma se expresa como debe solucionarse un problema especificando una secuencia de acciones a realizar a través de uno o más procedimientos denominados subrutinas o funciones.

Dentro de esta categoría se engloban la programación estructurada que restringe el uso de la instrucción goto, la programación modular y la programación orientada a objetos. Cada una de estas extensiones o evoluciones han permitido mejorar la mantenibilidad y la calidad de los programas imperativos.

Programación Declarativa

A la programación imperativa se le contrapone la programación declarativa en la que se describe la lógica de computación necesaria para resolver un problema sin describir un flujo de control de ningún tipo. Efectivamente, en la programación declarativa no es necesario definir algoritmos puesto que se detalla la solución del problema en lugar de como llegar a esa solución.

En la programación declarativa, la solución es alcanzada a través de mecanismos internos de control pero no se especifica exactamente como llegar a ella. Las variables son utilizadas con transparencia referencial, es decir una expresión puede ser sustituida por el resultado de ser evaluada en el programa sin alterarlo semánticamente.

Dentro de esta categoría se engloban la programación funcional cuyo lenguaje más expresivo y culmen sea seguramente el lenguaje Haskell, la programación lógica donde sin duda el campeón es Prolog (ampliamente usado en ambientes académicos) y la programación restringida o con restricciones entre otras.

En los lenguajes funcionales puros como Haskell, todas las funciones son puras, es decir, no tienen efectos secundarios, y los cambios de estado están solo representados como funciones que transforman el estado. Aunque no son imperativos, por norma general proporcionan algún mecanismo por el que describir el efecto de una función como una serie de pasos.

Diferencias principales

La principal diferencia entre ambos paradigmas es que en la programación imperativa se describe paso a paso un conjunto de instrucciones que han de ejecutarse con la finalidad de variar el estado del programa y resolver un problema para hallar una solución. Es decir, se describe un algoritmo en el que se detallan los pasos secuenciales necesarios a seguir para la resolución de un problema.

Y en la programación declarativa solo se describe el problema pero no los pasos necesarios para llegar a su solución, la cual es hallada mediante mecanismos internos de inferencia de información a partir de la descripción del problema en si.

La programación imperativa se basa en la máquina de Turing mientras que la programación declarativa se basa en el cálculo lambda.

¿Cómo diferenciar una de la otra?

Podemos diferenciarlas sin temor a equivocarnos en los siguientes supuestos:

  • Un programa que describe que problemas deben resolverse pero no como, está programado con programación declarativa

  • Cualquier programa que evita los efectos secundarios o es referencialmente transparente, está programado con programación declarativa

  • Todo lo que no cuadre con las dos afirmaciones anteriores usa programación imperativa o una mezcla de ambas

¿Y qué hay de la programación orientada a objetos?

Bueno, como ya he dicho anteriormente, la programación orientada a objetos es una forma de programación imperativa puesto que al programar orientando a objetos se describe la secuencia que debe seguir el programa para resolver un problema dado.

La diferencia con otras formas de programación imperativas como la programación estructurada es que en la orientación a objetos se hace uso de estructuras de datos llamadas objetos que aglutinan propiedades y métodos conjuntamente con sus interacciones.

Un objeto es una estructura abstracta que describe con la mayor fiabilidad posible un objeto del mundo real y como se relaciona o interactúa con el resto del mundo que lo rodea a través de interfaces. La programación orientada a objetos se basa también en conceptos como la abstracción de datos, la encapsulación, los eventos, la modularidad, la herencia y el polimorfismo.

Conclusión

Aunque la diferencia entre la programación estructurada y la programación orientada a objetos es grande, realmente la mayor diferencia se encuentra en las ramas superiores. Las diferencias entre programación imperativa y programación declarativa es mucho más severa y compleja que las diferencias entre diferentes sub-paradigmas dentro de la programación imperativa.

Sobre lo que nos depara el futuro, no estoy seguro, ni siquiera tengo una opinión propia bien formada al respecto, pero es aconsejable no perder la pista de lenguajes como Haskell e intentar comprender el paradigma de la programación declarativa para crecer como profesionales del desarrollo de software y sobre todo mantener una postura abierta y alejar los talibanismos y la polémica estéril.

Comentarios cerrados
Inicio