Paradigmas de programación

Existe una enorme variedad de lenguajes de programación, no sólo en cuanto a su sintaxis, sino también en cuanto a su comportamiento o semántica.

Hemos visto que cada año el número de lenguajes se incrementa, de forma que para los informáticos es prácticamente imposible conocer cada nuevo lenguaje que aparece. Pero eso no es un problema, ya que todos esos lenguajes tienen características comunes y se pueden agrupar en cuatro grandes grupos o modelos computacionales llamados paradigmas.

Imagen del libro Programming Languages. Design and Implementation, de Terrence W. Pratt y Marvin V. Zelkowitz.

 

Todos los lenguajes pertenecen a uno de esos cuatro paradigmas. De forma que, si se conocen las características de los paradigmas de programación, es muy sencillo aprender a programar en un nuevo lenguaje, porque tendrá las características del paradigma de programación al que pertenezca.

El origen de la palabra paradigma entendida como un marco general en el que se desarrollan teorías científicas se encuentra en el trabajo de 1962 del filósofo e historiador de la ciencia Thomas S. KuhnLa estructura de las revoluciones científicas. Esa palabra ha sido después adoptada por el mundo de la computación para definir un conjunto de ideas y principios comunes de grandes grupos de lenguajes de programación.

La definición de la palabra paradigma más cercana a lo que se quiere decir en la expresión paradigma de programación es la siguiente:

"Un marco filosófico y teórico de una escuela o disciplina científica en el que se formulan teorías, leyes y generalizaciones y los experimentos realizados en soporte de ellas."

Un paradigma define un conjunto de reglas, patrones y estilos de programación que son usados por los lenguajes de programación que usan ese paradigma.

Podemos distinguir cuatro grandes paradigmas de programación:

  • Paradigma funcional
  • Paradigma lógico
  • Paradigma imperativo o procedural
  • Paradigma orientado a objetos

Algunas características importantes de cada uno de estos paradigmas.

Paradigma funcional

 

En el paradigma funcional la computación se realiza mediante la evaluación de expresiones.

  • Definición de funciones
  • Funciones como datos primitivos
  • Valores sin efectos laterales, no existe la asignación
  • Programación declarativa
(define (factorial x)
   (if (= x 0)
      1
      (* x (factorial (- x 1)))))

>(factorial 8)
40320
>(factorial 30)
265252859812191058636308480000000

Paradigma lógico

 

  • Definición de reglas
  • Unificación como elemento de computación
  • Programación declarativa
padrede('juan', 'maria'). % juan es padre de maria
padrede('pablo', 'juan'). % pablo es padre de juan
padrede('pablo', 'marcela').
padrede('carlos', 'debora').

hijode(A,B) :- padrede(B,A).
abuelode(A,B) :-  padrede(A,C), padrede(C,B).
hermanode(A,B) :- padrede(C,A) , padrede(C,B), A \== B.        

familiarde(A,B) :- padrede(A,B).
familiarde(A,B) :- hijode(A,B). 
familiarde(A,B) :- hermanode(A,B).

?- hermanode('juan', 'marcela').
yes
?- hermanode('carlos', 'juan').
no
?- abuelode('pablo', 'maria').
yes
?- abuelode('maria', 'pablo').
no

Paradigma imperativo

Los lenguajes de programación que cumplen el paradigma imperativo se caracterizan por tener un estado implícito que es modificado mediante instrucciones o comandos del lenguaje. Como resultado, estos lenguajes tienen una noción de secuenciación de los comandos para permitir un control preciso y determinista del estado.

  • Definición de procedimientos
  • Definición de tipos de datos
  • Chequeo de tipos en tiempo de compilación
  • Cambio de estado de variables
  • Pasos de ejecución de un proceso
type 
   tDimension = 1..100;
   eMatriz(f,c: tDimension) = array [1..f,1..c] of real;
   
   tRango = record
      f,c: tDimension value 1;
   end;
   
   tpMatriz = ^eMatriz;


procedure EscribirMatriz(var m: tpMatriz);
var filas,col : integer;
begin
   for filas := 1 to m^.f do begin
      for col := 1 to m^.c do
         write(m^[filas,col]:7:2);
      writeln(resultado);
      writeln(resultado)
     end;    
end;

Paradigma orientado a objetos (POO)

 

  • Definición de clases y herencia
  • Objetos como abstracción de datos y procedimientos
  • Polimorfismo y chequeo de tipos en tiempo de ejecución
public class Bicicleta {
    public int marcha;
    public int velocidad;
        
    public Bicicleta(int velocidadInicial, int marchaInicial) {
        marcha = marchaInicial;
        velocidad = velocidadInicial;
    }
        
    public void setMarcha(int nuevoValor) {
        marcha = nuevoValor;
    }
        
    public void frenar(int decremento) {
        velocidad -= decremento;
    }
        
    public void acelerar(int incremento) {
        velocidad += incremento;
    }
}

public class MountainBike extends Bicicleta {
    public int alturaSillin;

    public MountainBike(int alturaInicial, int velocidadInicial, int marchaInicial) {
        super(velocidadInicial, marchaInicial);
        alturaSillin = alturaInicial;
    }   
        
    public void setAltura(int nuevoValor) {
        alturaSillin = nuevoValor;
    }   
}

public class Excursion {
   
        public static void main(String[] args) {
           MountainBike miBicicleta = new MoutainBike(10,10,3);
           miBicicleta.acelerar(10);
           miBicicleta.setMarcha(4);
           miBicicleta.frenar(10);
        }
}

Una reflexión importante es que la separación entre los paradigmas y los lenguajes no es estricta. Existen ideas comunes a distintos paradigmas, así como lenguajes de programación que soportan más de un paradigma. Por ejemplo, el paradigma funcional y lógico comparten características declarativas, mientras que el paradigma orientado a objetos y procedural tienen características imperativas.

Otros paradigmas de programación menos comunes:

  • Paradigmas de programación paralela y concurrente
  • Paradigmas basados en restricciones
  • Paradigmas visuales

Se puede encontrar más información sobre distintos paradigmas de programación en la Wikipedia.