Paradigmas de programación: definición, tipos y ejemplos
Descubre los paradigmas de programación: definición, tipos (imperativo y declarativo), ejemplos y cómo elegir el mejor para tus proyectos.
Los paradigmas de programación son formas de clasificar y entender los lenguajes de programación según el estilo, las ideas y las reglas que promueven para escribir código. Un paradigma describe cómo se estructura el programa, cómo se modela el estado y el comportamiento, y qué construcciones del lenguaje se usan para resolver problemas. Muchos lenguajes admiten más de un paradigma, por lo que no son mutuamente excluyentes.
Algunos paradigmas se fijan en la forma en que se ejecuta el código, por ejemplo si se permiten efectos secundarios (cambios de estado observables fuera de una función) o si se obliga a que las operaciones ocurran en un orden determinado. Otros paradigmas miran cómo se agrupa el código, por ejemplo poniendo la lógica en grandes bloques o en muchas piezas pequeñas y reutilizables. También hay enfoques centrados en el orden y las piezas que componen la aplicación (como flujos de datos, componentes o agentes concurrentes).
Principales familias: imperativo vs declarativo
Se suelen distinguir dos grandes familias de paradigmas:
- Imperativo: Describe los pasos que la máquina debe ejecutar. Se centra en instrucciones que modifican el estado. Dentro de esta familia están subparadigmas como el procedural y el orientado a objetos. Ejemplos: C, Java, Python (en su uso imperativo).
- Declarativo: Describe qué se quiere lograr sin especificar exactamente cómo ejecutarlo. Incluye paradigmas como el funcional y el lógico. Ejemplos: Haskell (funcional), SQL (declarativo para bases de datos), Prolog (lógico).
Subparadigmas y ejemplos prácticos
- Procedural: Organiza el código en procedimientos o funciones que se llaman en un cierto orden. Ventaja: sencillo y directo. Idiomas típicos: C, Pascal.
- Orientado a objetos (OO): Modela datos y comportamiento mediante objetos y clases, usando encapsulación, herencia y polimorfismo. Adecuado para sistemas grandes y mantenibles. Ejemplos: Java, C++, C#, Ruby.
- Funcional: Trata la computación como la evaluación de funciones puras sin efectos secundarios; enfatiza la inmutabilidad y las funciones de orden superior. Mejora la razonabilidad y facilita la concurrencia. Ejemplos: Haskell, Erlang, Clojure; lenguajes multi-paradigma como JavaScript o Scala también permiten estilo funcional.
- Lógico: Expresa relaciones y reglas; el motor del lenguaje busca soluciones que satisfagan esas reglas. Útil en IA y sistemas expertos. Ejemplo: Prolog.
- Reactor / Orientado a eventos: Diseñado para responder a eventos o mensajes (por ejemplo interfaces de usuario, servidores asíncronos). Facilita la programación asíncrona y basada en callbacks o promesas. Ejemplos: JavaScript (event loop), Node.js.
- Concurrente y paralelo: Proporciona abstracciones para ejecutar tareas simultáneamente (hilos, actores, procesos ligeros). Ejemplos: Erlang (modelo de actores), Go (goroutines), Java (hilos).
- Basado en componentes: Divide la aplicación en componentes independientes y reutilizables que se comunican mediante interfaces. Muy usado en desarrollo web y GUI. Ejemplos: arquitecturas con React, Angular, componentes en sistemas embebidos.
Lenguajes híbridos y elección de paradigma
Muchos lenguajes modernos son multi-paradigma: permiten mezclar estilos según la necesidad. Por ejemplo, Python admite programación procedimental, orientada a objetos y funcional; JavaScript se usa imperativa, orientada a eventos y funcional; Scala combina OO y funcional.
La elección del paradigma depende de varios factores:
- Tipo de problema (cálculo matemático, sistemas distribuidos, interfaces de usuario, consultas a datos).
- Requisitos de mantenimiento y escala.
- Rendimiento y concurrencia.
- Experiencia del equipo y ecosistema (bibliotecas, herramientas).
Ventajas y limitaciones generales
- Imperativo: Ventaja en control explícito y rendimiento; puede llevar a código más difícil de razonar por efectos laterales.
- Declarativo: Mejora la legibilidad y facilita la verificación formal; a veces menos control sobre detalles de ejecución y rendimiento.
- Funcional: Facilita pruebas y concurrencia por inmutabilidad; puede implicar una curva de aprendizaje si viene de un trasfondo imperativo.
- OO: Buena para modelar dominios complejos; abuso de herencia o acoplamiento puede dificultar el mantenimiento.
Consejos prácticos
- Aprende al menos un paradigma distinto al que usas habitualmente (por ejemplo, si vienes de OO prueba el estilo funcional): amplía tu forma de pensar y las soluciones posibles.
- Usa el paradigma que más se ajuste al problema y al equipo, no por moda.
- En proyectos reales, combinar paradigmas suele ofrecer beneficios: p. ej., una arquitectura orientada a componentes con funciones puras para la lógica crítica.
En resumen, los paradigmas de programación son herramientas conceptuales que ayudan a organizar ideas y código. Conocer sus principios y ejemplos facilita elegir buenas prácticas y aprovechar mejor los lenguajes modernos.
Programación imperativa
En los programas imperativos, los programadores dan al ordenador un conjunto de pasos ordenados que deben realizarse para hacer algo. Si alguien quiere que el ordenador dibuje la cara de un gato, podría darle instrucciones como "Dibuja un círculo aquí, dibuja dos círculos más pequeños allí, dibuja dos triángulos encima" y así sucesivamente. Los programas imperativos a veces tienen muchos efectos secundarios.
Hay dos grandes paradigmas imperativos, y muchas veces un lenguaje tendrá ambos:
- Estructurado - El ordenador recibe instrucciones que están siempre en un orden determinado. No se permiten pasos como "volver al paso 3" (conocidos como sentencias goto).
- Procedimental - El programa permite al programador dar un nombre a una lista de órdenes, lo que convierte esas órdenes en un "procedimiento" que puede utilizar posteriormente. La mayoría de los lenguajes estructurados también son procedimentales.
- Orientado a objetos - Las ideas se explican al ordenador mediante objetos, piezas de código que tienen un conjunto de órdenes que se les pueden dar y alguna información sobre ellas.
Programación declarativa
En los paradigmas declarativos, el programador le dice al ordenador lo que debe hacer en lugar de cómo hacerlo. Si quisieran que el ordenador dibujara la cara de un gato, podrían darle instrucciones como "Dibuja una cara, dibuja dos ojos, dos orejas y una boca".
Los paradigmas declarativos más conocidos son:
- Funcional - La mayor parte del trabajo lo realizan las funciones sin efectos secundarios.
- Lógica - Se exponen una serie de hechos y luego se formulan una o varias "preguntas".
- Dirigido por eventos - Las piezas de código se configuran para ejecutarse cuando ocurren ciertas cosas (como que el ordenador se encienda).
Otros paradigmas
Algunos paradigmas pueden encontrarse tanto en los lenguajes imperativos como en los declarativos. Estos paradigmas suelen encontrarse con uno de los paradigmas anteriores en lugar de ir por separado.
- En paralelo: Más de una pieza de código se ejecuta al mismo tiempo.
- Meta: Las cosas especiales del lenguaje permiten al programador cambiar la forma de actuar del propio lenguaje.
Resumen
Los lenguajes de programación se agrupan por paradigmas de la misma manera que las máquinas pueden agruparse por el uso que se les da.
Algunas lenguas se ajustan a un solo paradigma principal, como:
- Smalltalk (orientado a objetos)
- Ensamblaje (imperativo, pero no estructurado ni orientado a objetos)
- Haskell (funcional)
- Prolog (lógica)
Sin embargo, la mayoría de las lenguas tienen más de un paradigma. Algunos de los que destacan por tener más de uno son:
- Scala (orientado a objetos, funcional, paralelo)
- Visual Basic (orientado a eventos, orientado a objetos)
- Common Lisp (procedimental, funcional, orientado a objetos, meta)
- Esquema (funcional, procedimental, meta)
- Perl (funcional, procedimental, meta, orientado a objetos, orientado a eventos)
- Python (funcional, orientado a objetos, procedimental)
- Ruby (funcional, orientado a objetos, procedimental)
- Wolfram Language (funcional, procedimental, generalmente declarativo)
- Oz (lógica, funcional, imperativa, orientada a objetos)
- F# (funcional, imperativo, orientado a objetos, meta)
Tener más paradigmas no siempre es bueno. Una vez que tener menos paradigmas puede ser algo bueno es cuando hay un lenguaje que es sólo funcional. Una función en uno de estos lenguajes a veces hace menos trabajo (como recorrer sólo las partes de un grupo de cosas que realmente necesita) de lo que tendría que hacer si el lenguaje fuera también procedimental.
Muchos paradigmas de programación son tan conocidos por las cosas que no dejan hacer a la gente como por las que sí dejan hacer. Un caso en el que esto es cierto son los lenguajes funcionales. Cuando un lenguaje funcional es sólo o principalmente funcional, normalmente no permite efectos secundarios. Otro momento en el que esto es cierto es la programación estructurada: se diferencia de los lenguajes imperativos normales porque no permite a los programadores utilizar "sentencias goto" (sentencias que indican al programa que vaya a un paso anterior). Por esta y otras razones, la gente a veces piensa que los nuevos paradigmas no permiten suficientes cosas. Sin embargo, a veces está bien que el ordenador no permita hacer cosas: puede ayudar a la gente a evitar problemas con su código, y dejar que el ordenador haga conjeturas para que pueda ejecutar el código más rápidamente, ¡o incluso comprobar el código en busca de problemas antes de que se ejecute!
Problemas con los paradigmas
A algunas personas que estudian los lenguajes de programación no les gusta que se utilicen paradigmas para agrupar los lenguajes de programación, como Harper y Krishnamurthi. Esas personas dicen que muchos lenguajes de programación no pueden agruparse simplemente en paradigmas porque los lenguajes toman prestadas cosas e ideas de muchos paradigmas.
Historia
Se han creado nuevos paradigmas a lo largo del tiempo, y la gente los señaló en su momento, o al mirar atrás. Uno de los primeros paradigmas que se reconoció como una nueva forma de programar fue la programación estructurada de los años 60. La idea de un "paradigma de programación" es de 1978, si no anterior, cuando Robert W. Floyd la utilizó mientras enseñaba. La palabra "paradigma" en la forma en que Robert la entendía fue utilizada por primera vez por Thomas Kuhn en su libro La estructura de las revoluciones científicas (1962).
Código de la máquina
El paradigma de programación de más bajo nivel (el más cercano a cómo le gusta entender las cosas al ordenador) y más antiguo es el código máquina, un paradigma imperativo. Las instrucciones en código máquina son sólo un conjunto de números en un orden determinado. El lenguaje ensamblador es un poco menos de bajo nivel (y un poco menos antiguo). En el lenguaje ensamblador, las direcciones del ordenador reciben mnemónicos (nombres más fáciles de recordar), y las direcciones de memoria (direcciones para encontrar una pieza de información en el ordenador) pueden recibir nombres. A veces se denominan lenguajes de primera y segunda generación.
En la década de 1960, los lenguajes ensambladores mejoraron añadiendo cosas nuevas como la biblioteca COPY, las macros (trozos de código "especial" que se transformaban en código normal antes de que el programa comenzara a ejecutarse), los procedimientos de ejecución (conjuntos de direcciones a los que se les da un nombre y se guardan para más tarde) y las variables (elementos a los que se les da un nombre y se guardan para más tarde) desde fuera del programa. Esto permitía a la gente utilizar cierto código en más de un proyecto, y no tener que preocuparse por los problemas específicos del hardware (problemas que sólo se dan en un tipo de ordenador) gracias a los comandos (nombres para las direcciones) como READ/WRITE/GET/PUT.
El ensamblador se utilizaba, y a veces se sigue utilizando, en sistemas en los que es importante que el código sea rápido, y también se utiliza mucho en los sistemas embebidos porque permite al usuario tener un control exacto de lo que hace la máquina.
Lenguajes procedimentales
A finales de los años 60, la gente empezó a inventar lenguajes procedimentales. Estos lenguajes de tercera generación (los primeros de lo que ahora llamamos lenguajes de alto nivel) tenían palabras relacionadas con lo que intentaban resolver. Por ejemplo,
- COmmon Business Oriented Language (COBOL) - utiliza palabras como file, move y copy.
- FORmula TRANslation (FORTRAN) - utiliza palabras y símbolos matemáticos (formas utilizadas en la escritura y el tecleo). Se desarrolló principalmente para la ciencia y la ingeniería.
- Lenguaje ALGOrítmico (ALGOL) - hecho para escribir algoritmos (conjuntos de pasos que indican al ordenador lo que debe hacer). Utiliza palabras y símbolos matemáticos, al igual que FORTRAN.
- Lenguaje de Programación Uno (PL/I) - se suponía que era útil para todos.
- Código de instrucciones simbólicas para principiantes (BASIC): hecho para ayudar a los principiantes a programar.
- C: un lenguaje de programación pensado para hacer muchas cosas. Dennis Ritchie trabajó en él de 1969 a 1973 en los laboratorios Bell de AT&T.
Programación orientada a objetos
Después de que mucha gente empezara a utilizar lenguajes procedimentales, se inventaron los lenguajes de programación orientados a objetos. En estos lenguajes, los datos y sus "métodos" (formas de manipular los datos) se ponen en un "objeto". Algunos programadores, como Richard Stallman, no están de acuerdo en que los lenguajes orientados a objetos sean mejores para explicar ideas a un ordenador que los lenguajes procedimentales.
Dado que la programación orientada a objetos es un paradigma, no un lenguaje, la gente ha creado lenguajes de ensamblaje orientados a objetos como el HLA (ensamblaje de alto nivel).
Paradigmas declarativos
Al mismo tiempo, algunas personas estaban haciendo lenguajes de programación declarativos. Un lenguaje muy conocido por ser declarativo es SQL (un lenguaje para añadir y eliminar cosas de las tablas).
Páginas relacionadas
- Mentalidad
- Sistema tipo
- Completitud de Turing
Preguntas y respuestas
P: ¿Qué es un paradigma de programación?
R: Un paradigma de programación es una forma de agrupar los lenguajes de programación en función de su funcionamiento.
P: ¿Cuáles son los dos principales grupos de paradigmas?
R: Los dos grupos principales de paradigmas son el imperativo y el declarativo.
P: ¿En qué se diferencian los paradigmas imperativo y declarativo?
R: Los paradigmas imperativos se fijan en la forma en que se ejecuta el código, como permitir efectos secundarios o tener que hacer las cosas en un orden determinado, mientras que los paradigmas declarativos se fijan en la forma en que se agrupa el código, como poner el código en una o dos piezas (o en su lugar, muchas piezas pequeñas).
P: ¿Puede un lenguaje ser a la vez un paradigma imperativo y declarativo?
R: Sí, un lenguaje puede ser un paradigma imperativo y declarativo al mismo tiempo.
P: ¿Cómo agrupa un paradigma de programación a los lenguajes?
R: Los paradigmas de programación agrupan los lenguajes por lo que hacen. Se fijan en cómo se ejecuta el código, cómo se agrupa y qué orden y piezas componen el programa.
P: ¿Existen otros tipos de paradigmas de programación además del imperativo y el declarativo?
R: Sí, hay otros tipos de paradigmas de programación además del imperativo y el declarativo. Por ejemplo, algunos se fijan en la forma en que se ejecuta el código (como permitir los efectos secundarios), mientras que otros se fijan en la forma en que se agrupa el código (como poner el código en una o dos piezas).
P: ¿Cada lenguaje pertenece a un solo tipo de paradigma de programación?
R: No, no todos los lenguajes pertenecen a un solo tipo de paradigma de programación; algunos lenguajes pueden pertenecer a más de un tipo de paradigma.
Artículos relacionados
Autor
AlegsaOnline.com Paradigmas de programación: definición, tipos y ejemplos Leandro Alegsa
URL: https://es.alegsaonline.com/art/79379
Fuentes
- ai.uga.edu : "CSCI/ARTI 4540/6540: First Lecture on Symbolic Programming and LISP"
- people.cs.aau.dk : Overview of the four main programming paradigms
- cgi.csc.liv.ac.uk : "Characteristics of declarative programming languages"
- info.ucl.ac.be : "Programming Paradigms for Dummies: What Every Programmer Should Know"
- books.google.com : Concepts, Techniques, and Models of Computer Programming
- dl.acm.org : "Conception, Evolution, and Application of Functional Programming Languages"
- doi.org : 10.1145/214748.315722
- ecn.purdue.edu : "'GOTO Considered Harmful' Considered Harmful"
- cambridgeblog.org : "What, if anything, is a programming-paradigm?"
- dl.acm.org : "Teaching programming languages in a post-linnaean age"
- dl.acm.org : "The paradigms of programming"
- doi.org : 10.1145/359138.359140
- britannica.com : "Computer science - Programming languages"
