Introducción a los paradigmas de programación.




En este blog intentaré desarrollar acerca de los paradigmas de programación, haciendo posteriormente énfasis en uno específico.
Primero, comencemos por lo más básico, la pregunta que todos suponen pero nadie se plantea generalmente. Todos saben que hay diversos paradigmas en el área de programación, pero ¿Qué es un paradigma?

Hay varias definiciones para el mismo:

  •  Según la R.A.E. (Real Academia Española): la palabra paradigma procede del griego paradeigma, que significa: Ejemplo o modelo.
  • Thomas S. Kuhn (1962) 1 en su libro “La Estructura de las Revoluciones Científicas”, considera que el paradigma es un ejemplo o un esquema básico de interpretación de la realidad.
  • Adam Smith define paradigma, en su libro “Los poderes de la mente”, como “un conjunto compartido de suposiciones”.
  • F. Alonso Amo, en su libro “Paradigmas de Programación”, define paradigma “como ejemplo a seguir y como modelo o marco de referencia filosófico/conceptual/cultural/social/moral.”

En conclusión a las definiciones anterior volvemos al tema principal, que es un ¿Paradigma de programación? Aunque en base a las definiciones anteriores con un poco de deducción se podría formar una posible respuesta, vamos a desarrollar un poco el tema, desde lo más básico.

  •  Los paradigmas de programación fue aplicado por primera vez por Robert Floyd en coautoría con Richard Beigel en donde se definió el concepto de Paradigma de Programación como un proceso de diseño que va más allá de una gramática, semántica y algoritmos, sino que es un conjunto de métodos sistemáticos aplicables en todos los niveles de diseño de programas.
  • F. Alonso Amo, en su libro “Paradigmas de Programación”, define paradigmas de programación como “los pilares que definen el desarrollo informático de los programas y por extensión el desarrollo computacional”.
  • Otra definición: Paradigma de programación es una propuesta tecnológica que es adoptada por una comunidad de programadores cuyo núcleo central es incuestionable en cuanto a que unívocamente trata de resolver uno o varios problemas claramente delimitados.



Bueno, ahora que están establecidas las bases del tema se puede adentrar un poco más profundo. Los paradigmas están separados en distintos subgrupos, cuya cantidad varía según los autores; eso es exactamente lo que demostraremos ahora exponiendo distintos puntos de vistas o enfoques.



















Como verán, se presentan algunos diversos puntos de vistas acerca de como separar o diferenciar los distintos paradigmas de programación. Pero para desarrollarlos cada uno por separados en este caso usaremos el caso de la primer imagen (el que refiere como 4 paradigmas separados).




1- Paradigma Imperativo: 

"Este paradigma se caracteriza porque presenta como idea central un modelo abstracto de una computadora que consiste en un gran almacenamiento de memoria, en la que se incorporan unos datos que posteriormente son transformados en unos resultados."
                                                             (F. Alonso Amo, Paradigmas de Programación, 2003)


En la programación imperativa se describen sentencias que modifican el estado de un programa. La implementación de hardware de la mayoría de las computadoras es imperativa; prácticamente todo hardware de las computadoras está diseñado para ejecutar código de máquina, el cual es nativo de las mismas, escrito en forma imperativa, esto se debe a que el hardware de las computaras implementa el paradigma  de las Máquinas de Turing.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 sub-rutinas o funciones.
Los lenguajes imperativos de alto nivel usan variables y sentencias más complejas, pero aún siguen el mismo paradigma.

Las características fundamentales de este paradigma son [Ghezzi, 1986]:

  • Concepto de celda de memoria ("variable") para almacenar valores.
  • Operaciones de asignación
  • Repetición

Algunos lenguajes de programación que utilizan/pertenecen a este paradigma:
  • Representado por: C, BASIC, PASCAL.
  • Otros lenguajes: Fortran, Perl, PHP, Java, LUA, Go, Python.


2- Paradigma Funcional: 

Este paradigma concibe a la computación como la evaluación de funciones matemáticas y evita declarar y cambiar datos para producir mejores efectos y que sus resultados sean más eficientes. La función se define basándose en procedimientos y ésta puede ser recursiva.

El lenguaje funcional posee cuatro componentes:

  • Un grupo de funciones primitivas
  • Un grupo de formas funcionales
  • La operación de la aplicación
  • Un grupo de datos
Su utilidad radica en conseguir lenguajes expresivos y matemáticamente elegantes, en los que no sea necesario bajar al nivel de la maquina para describir el proceso llevado a cabo por el programa, y evitando el concepto de estado del cómputo.

Este lenguaje es apreciado por presentar ciertas ventajas:

  • Elegancia, claridad, sencillez, potencia y concisión
  • Semánticas claras, simples y matemáticamente bien fundadas.
  • Cercanos al nivel de abstracción de las especificaciones de los problemas a resolver
  • Referencialmente transparentes
  • Altas dosis de paralelismo implícito
  • Aplicaciones variadas
  • Es bastante útil para el desarrollo de prototipos
  • Ausencia de efectos colaterales
  • Proceso de depuración menos problemático
  • Pruebas de unidades más confiables
Algunos lenguajes de programación que utilizan/pertenecen a este paradigma:
  • Representado por: Scheme o Haskell
  • Otros lenguajes: Miranda,  Scala, Lisp, Clojure, Ocaml, SAP Standard ML

3- Paradigma Lógico: 

Se basa en la definición de reglas lógicas para luego, a través de un motor de inferencias lógicas, responder preguntas planteadas al sistema y así resolver los problemas. Este paradigma está dentro del paradigma de programación declarativa junto con el funcional.
Sus campos de aplicación principales son el área de Sistemas Expertos, e Inteligencia Artificial. La mayoría de los lenguajes de programación lógica se basan en la teoría lógica de primer orden, aunque también incorporan algunos comportamientos de orden superior como la lógica difusa.
Por su esencia declarativa, un programa lógico no tiene un algoritmo que indique los pasos que detallen la manera de llegar a un resultado, sino que es el sistema internamente el que proporciona la secuencia de control. No existe el concepto de asignación de variables, sino el de unificación.

Presenta ciertas características principales:

  • Sintaxis y semántica bien definidas
  • Reglas de inferencia
  • Caracterización de propiedades y relaciones
  • Doble dirección (Entrada/Salida) de los datos
  • Datos parcialmente construidos

Algunos lenguajes de programación que utilizan/pertenecen a este paradigma:
  • Representado por: PROLOG.
  • Otros lenguajes: LISP, CLIPS.



2- Paradigma Orientado a Objetos (PaOO):

está basado en la idea de encapsular estado y operaciones en objetos. En general, la programación se resuelve comunicando dichos objetos a través de mensajes (programación orientada a mensajes). Su principal ventaja es la reutilización de códigos y su facilidad para pensar soluciones a determinados problemas. Introduce nuevos conceptos, que superan y/o amplían conceptos antiguos ya conocidos. Entre ellos están:

  • Clase
  • Herencia
  • Objeto
  • Método
  • Evento
  • Mensaje
  • Atributo
  • Estado interno
  • Componentes de un objeto
  • Representación de un objeto
También, por otro lado, la POO (Programación Orientada a Objetos), posee algunas características que, aunque hay cierto desacuerdo sobre cuáles lo definen como "orientado a objeto" cabe nombrarlas por su importancia, las mas destacadas son:
  • Abstracción
  • Encapsulamiento
  • Principio de ocultación
  • Polimorfismo
  • Herencia
  • Recolección de basura

Algunos lenguajes de programación que utilizan/pertenecen a este paradigma:
  • Representado por: Smalltalk.
  • Otros lenguajes: Java, Php, Perl, Bash, ASP

En conclusión, si bien es importante tanto el paradigma a utilizar como el lenguaje, no son una única alternativa, existen diversos lenguajes de programación que son capaces de utilizar más de un paradigma, a continuación muestro algunos ejemplos para concluir parcialmente el tema.

LENGUAJES QUE AL MENOS SOPORTAN DOS PARADIGMAS:

  • 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





Fuentes: