Diferencias entre paradigmas de programación

14 comentarios


evolucion.jpg


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.

Anunciate aquí
Anunciate aquí
Anunciate aquí

¿Quieres saber más?

Artículos

Artículos relacionados que probablemente también te interesen

Ver más

Respuestas

Preguntas sobre este tema que ha contestado la comunidad

+ Deja tu comentario

Comentarios

  • 1

    interesante

    Avatar de Juan M Gomez !

    Muy buen artículo Oscar, y la última frase, una verdad como un templo: "sobre todo mantener una postura abierta y alejar los talibanismos y la polémica estéril". No podría estar más de acuerdo; el fanatismo es el pan de cada día.

    Las herramientas, herramientas son, y como tales se diseñaron para un fin en concreto, el conocer el máximo número posible es lo que marcará la diferencia. Algo muy difícil teniendo en cuenta los prejuicios que señalas.

    -- editado por última vez a las 00:30

  • 2

    !

    Es por estos articulos que leo GenbetaDev! +1

  • 3

    Avatar de guepard !

    Hay un error, dice que C# y Java no son orientados a objetos, son basados en objetos.

    -- editado por última vez a las 09:14

  • Respondiendo a #3:
  • 4

    Avatar de Oscar Campos !

    Los lenguajes que cumplen el paradigma de la programación orientada a objetos pueden estar basados en clases o prototipos.

    Sintiéndolo mucho discrepo completamente de que haya ningún error en el texto en referencia a lo que comentas.

    Un saludo.

  • Respondiendo a #4:
  • 5

    Avatar de guepard !

    No no, te equivocas, basado en objeto significa que es imposible hacer nada que no esté contenido en un objeto.

    Por ejemplo, tu en C++ puedes hacer funciones sueltas, pero en C# y en Java SI O SI, deben estar dentro de una funcion, aunque sean métodos estáticos.

    Eso es un lenguaje BASADO en objetos.

  • Respondiendo a #5:
  • 6

    Avatar de Oscar Campos !

    ¿Y qué?, sigue siendo programación orientada a objetos.

    No soporta la programación estructurada pero no veo por que dices que no es orientado a objetos cuando obviamente lo es y es además bastante restrictivo.

  • Respondiendo a #5:
  • 7

    Avatar de guepard !

    Equivocación, queria decir "deben estar dentro de una CLASE".

    -- editado por última vez a las 11:15

  • Respondiendo a #6:
  • 11

    Avatar de guepard !

    Pues que en este caso se llama basado en objetos, no entiendo que problema tienes con que se llame asi.

  • Respondiendo a #11:
  • 12

    Avatar de Oscar Campos !

    Me da la impresión de que estás un poco confundido.

    No existe ningún paradigma de programación llamado "Programación basada en objetos" por lo tanto no, no se llama así.

    Si eso me enlazas un artículo en castellano o inglés donde se diga que la "programación basada en objetos" (que es un término que solo he visto alguna vez en libros o manuales de Java pero en el mismo contexto que la programación basada en eventos por ejemplo) es un paradigma de programación además aceptado por la Comunidad de desarrolladores y entonces lo cambio.

    Que Java (o C#) no permita el uso de funciones ni estructuras de control de ningún tipo si no es a través de un método de una clase, es una característica del lenguaje.

    En Java y C# la implementación del paradigma de orientación a objetos es más restrictivo y por ello no permite el control del flujo de la aplicación si no es a través de un objeto, pero eso no lo convierte en un nuevo paradigma ni mucho menos.

  • 8

    Avatar de charli_htp !

    La idea es clara: según lo que quieras hacer habrá un lenguaje mejor que otro.
    Frecuentemente se comparan lenguajes que no tienen nada que ver, y que realmente son incomparables porque cada uno tiene unas características que lo hacen idóneo para determinados proyectos concretos.

    Es bueno saber que hay otra manera de hacer las cosas en otros lenguajes y paradigmas distintos.

  • 9

    Avatar de Gerardo !

    PHP también es reflexivo

  • Respondiendo a #9:
  • 10

    Avatar de Oscar Campos !

    Cierto, ahora mismo lo corrijo. Gracias por el feedback.

  • 13

    !
    farlop | 1 estrellas

    Aún recuerdo con cierta angustia mis primeras prácticas en programación declarativa con Prolog, en la universidad. Mi mente totalmente bloqueada, no fui capaz de hacer ni la primera práctica. Y no porque no lo intentara, es que era incapaz de comprender o formarme una idea de cómo actuar. Fue verdaderamente fustrante la verdad. Igual es que mi cerebro no está preparado para esa forma de pensar ;)

  • Respondiendo a #13:
  • 14

    Avatar de Gerardo !

    Lo más difícil es intentar olvidar todo lo que se ha aprendido de programación imperativa. Normalmente, las personas que nunca han programado sólo tardan un par de meses en empezar a programar cosas que funcionen con Prolog.

Escribir un comentario

Para hacer un comentario es necesario que te identifiques: ENTRA o conéctate con Facebook Connect

Anunciate aquí

WSL Weblogs SL