La imagen principal de este artículo es una computadora de 1949 llamada CSIRAC (Foto de Museums Victoria en Unsplash) quizá te preguntes qué tiene que ver? pues mucho y a continuación te lo contaré, así que acompáñame en esta emocionante historia y aprende qué son los paradigmas de programación de una forma que nadie te explicó (hasta ahora).
Y es que para entender de forma integral a los paradigmas de programación tenemos que hablar de la historia de la computación como tal, ya que estos llamados paradigmas, remontan sus orígenes hacia los inicios de la computación moderna.
Entscheidungsproblem o El problema de decisión
Aquí parte todo. En 1673 el matemático alemán Gottfried Leibniz inventó la primera calculadora de propósito general. Tras esta invención, él tenía el intenso deseo de construir una máquina que pueda manipular símbolos para determinar si una frase en matemáticas es un teorema.
Fueron David Hilbert y Ailhelm Ackermann quienes en 1928 propusieron la pregunta formalmente en su libro "Grundzüge der theoretischen Logik" traducido al español sería "Principios de la lógica teórica" y traducido al inglés en 1950 el libro pasaría a llamarse "Principles of Mathematical Logic".
La pregunta estaba a modo de reto y era la siguiente: ¿Existe un procedimiento eficaz (luego se llegaría a conocer como algoritmo) que dado un conjunto de axiomas y una proposición matemática, decida si es o no demostrable a partir de los axiomas?
Hacia el año 1930 parecía que tal problema no tenía solución, sin embargo de forma casi simultánea pero independiente en 1936 sucedió algo que cambiaría el curso de la historia de la computación.
Alonzo Church y Alan Touring llegaron a dar respuesta a dicha pregunta y la respuesta fue que NO. Es imposible, pero lo más curioso es cómo llegaron a esa conclusión.
Fue Alonzo Church quien respondió primero y poco tiempo después, en ese mismo año Turing también lo hizo, sin embargo ambos llegaron a esta conclusión utilizando mecanismos distintos. Por un lado Church creó el "Cálculo lambda" y Turing la "Máquina de Turing" al ser enfoques equivalentes, ambos permiten resolver los mismos problemas y definen formalmente por primera vez la noción de algoritmo.
Cada uno de esos dos enfoques dió origen a dos formas de resolver problemas, en otras palabras dos estilos muy marcados de hacer código, estas son las dos clasificaciones o tipos de paradigmas que usamos hasta el día de hoy.
La máquina de Turing dió origen a los paradigmas declarativos y el cálculo lambda por su parte dió origen a los paradigmas imperativos.
Definición de paradigma de programación
Ahora ya estamos en la capacidad de definir qué son los paradigmas de programación: son las diferentes formas de desarrollar software, o de resolver un problema mediante código informático.
En otras palabras, son enfoques sistemáticos que son utilizados en el desarrollo de software.
Los paradigmas son como los anteojos con los que vemos el mundo, de ahí su importancia.
Tipos de paradigmas
Como ya hemos visto, gracias a Church y Turing, tenemos dos clases de paradigmas:
Paradigmas imperativos
Este tipo de paradigma tiene 4 enfoques:
- Programación estructurada
Remonta sus orígenes hasta 1946 con la descripción de la Arquitectura de Von Neumann y el teorema de la forma normal de Kleene, sin embargo fue planteado formalmente por Bohm y Jacopini en 1966 mediante su teorema del programa estructurado, mediante el cual plantean que toda función comutable puede ser implementada mediante 3 formas o estructuras de control, las cuales son: Secuencia, iteración y condicional.
Años después, en 1968 Edsger Dijkstra publicó un artículo muy importante titulado "GO TO statement considered harmful" con lo cual promovió activamente la difusión de los lenguajes de programación estructurada como el ALGOL 60, lenguaje del cual, él fue parte del comité de diseño.
- Programación procedimental
Este paradigma amplía el enfoque de los paradigmas imperativos, haciendo posible la segregación o desglose de los algoritmos en componentes llamados procedimientos, funciones, rutinas o subprogramas, según el lenguaje de programación. Esta colección de cálculos o computaciones tienen un punto de inicio (entrada) y uno de fin (salida).
Lenguajes de este tipo tenemos: FORTRAN, ALGOL, COBOL y BASIC.
- Programación modular
Es bastante similar a la programación procedimental, sin embargo aquí se hace énfasis también a dividir o segmentar no sólo los algoritmos sino de todo el programa para fines de mantenibilidad. Cada uno de estos segmentos es llamado módulo y a su vez estos módulos pueden ser nuevamente divididos en otros más pequeños llamados sub-módulos buscando siempre obtener sub-rutinas lo más simples posibles.
Esta visión permitió que los programas sean más fáciles de leer, es decir permitió un código más legible y mantenible, además de reutilizable.
Lenguajes con este paradigma tenemos a: C, ADA, PL/I, Erlang, PASCAL, ALGOL, COBOL
- Programación orientada a objetos
Esta es la especialidad de la casa, en esta serie puedes aprender este paradigma completo.
Está basada en objetos, los cuales tienen características y funcionalidades. Estos objetos están contenidos en una plantilla que se llama clase.
Por ejemplo en un sistema de ventas, tendríamos a una clase llamada Clientes los cuales a su vez tienen instancias de clientes, es decir al cliente llamado Marcos, Gerson o Lucy; éstos clientes tienen características o datos como nombres, apellidos, edad, sexo y funcionalidades como comprar, pagar, anular venta.
Lenguajes con este paradigma tenemos a SmallTalk, C, C++, C#, PHP, Python, Visual basic, Java y Typescript.
Paradigmas declarativos
Esta clase de paradigma tiene 3 enfoques:
- Programación lógica
También llamada programación por predicados, o predicativa, está basada en la lógica matemática. En este paradigma el programa contiene un conjunto de principios y reglas definidas por el programador, entonces el programa se espera que interprete estos principios y les aplique las reglas para llegar a un resultado.
Un ejemplo de lenguaje de programación que hace uso de este paradigma es PROLOG.
- Programación funcional
Aquí se trabaja a través de funciones matemáticas. Estas expresiones que vienen a ser funciones pueden ser asignadas a variables. También este paradigma hace uso de la recursividad.
Ejemplos de lenguajes funcionales tenemos a LISP, ERLANG, RUST, SCALA.
- Programación reactiva
Este paradigma otorga mucha importancia a los flujos de datos y a la consecuente propagación de los cambios, de allí viene su nombre, ya que "reacciona" a los cambios en los estados dentro de un flujo de datos.
Por ejemplo cuando YouTube reacciona y cambia la calidad de video que estás utilizando por cuestiones de velocidad de conexión a internet, en palabras sencillas, cuando pasas de 1080p a 360p porque tu conexión está lenta, se está haciendo uso de este paradigma de programación.
Los lenguajes que hacen uso de este paradigma lo hacen a través de librerías añadidas al lenguaje por ejemplo: Java mediante la librería RxJava, .NET con Rx.NET. También librerías como React y frameworks como Angular con su librería RxJS y Vue.
Algunas veces la información en internet está un poco dispersa y notarás que algunos no hacen esta clasificación de paradigmas sino que van directo a los paradigmas en sí, o que obvian algunos paradigmas. Lo cierto es que si queremos ser coherentes deberíamos saber clasificarlos y considerar al menos estos 7 paradigmas ya que las fuentes más respetadas así lo establecen.
Debes tener en cuenta que una de las características de los lenguajes de programación es su paradigma, y algunos de los lenguajes pueden tener varios, como por ejemplo C# o Java los cuales son principalmente lenguajes orientados a objetos, pero también tienen capacidades funcionales, convirtiéndose así en multiparadigmas.
Y es así cómo aprendiste un poquito más de la historia de la computación y su relación con los paradigmas de programación que hoy utilizamos programadores de todo el mundo.
Espero esta entrada te haya gustado estimado lector, si es así, entonces compártela 🙂