Un paradigma de programación es una forma relativamente elevada de conceptualizar y estructurar la implementación de un programa informático . Un lenguaje de programación puede clasificarse según admita uno o varios paradigmas. [ 1 ]
Los paradigmas se dividen y describen según diferentes dimensiones de la programación. Algunos paradigmas se refieren a las implicaciones del modelo de ejecución , como permitir efectos secundarios o si la secuencia de operaciones está definida por dicho modelo. Otros paradigmas se refieren a la forma en que se organiza el código, como agruparlo en unidades que incluyen tanto estado como comportamiento. Otros, en cambio, se refieren a la sintaxis y la gramática .
Algunos paradigmas de programación comunes incluyen (mostrados en relación jerárquica ): [ 2 ] [ 3 ] [ 4 ]
- Imperativo : el código controla directamente el flujo de ejecución y el cambio de estado; instrucciones explícitas que modifican el estado de un programa.
- procedimental – organizado como procedimientos que se llaman entre sí
- Orientado a objetos : organizado como objetos que contienen tanto la estructura de datos como el comportamiento asociado, utiliza estructuras de datos que consisten en campos de datos y métodos junto con sus interacciones (objetos) para diseñar programas.
- Programación basada en clases: programación orientada a objetos en la que los tipos de datos abstractos y la herencia se logran definiendo clases de objetos, en lugar de los objetos mismos.
- Basado en objetos : paradigma en el que el objeto tiene una estructura para encapsular el estado y el comportamiento, pero sin herencia ni subtipado.
- Programación orientada a objetos basada en prototipos que evita las clases e implementa la herencia mediante la clonación de instancias.
- Datos, Contexto e Interacción : paradigma que enfatiza los modelos mentales y el comportamiento en tiempo de ejecución de redes de objetos, cuyas responsabilidades se otorgan dinámicamente en función de los roles que desempeñan en las interacciones con otros objetos.
- Declarativo : el código declara las propiedades del resultado deseado, pero no cómo calcularlo; describe qué cálculo debe realizar, sin especificar cambios de estado detallados.
- funcional : el resultado deseado se declara como el valor de una serie de evaluaciones de funciones, utiliza la evaluación de funciones matemáticas y evita el estado y los datos mutables.
- lógica – se declara un resultado deseado como la respuesta a una pregunta sobre un sistema de hechos y reglas, utiliza lógica matemática explícita para la programación
- reactivo : se declara un resultado deseado con flujos de datos y la propagación del cambio.
- La programación concurrente posee construcciones de lenguaje para la concurrencia, que pueden incluir multihilo, soporte para computación distribuida, paso de mensajes, recursos compartidos (incluida la memoria compartida) o futuros.
- Programación basada en actores : computación concurrente con actores que toman decisiones locales en respuesta al entorno (capaces de comportamiento egoísta o competitivo).
- Programación con restricciones : las relaciones entre variables se expresan como restricciones (o redes de restricciones), que dirigen las soluciones permitidas (utiliza la satisfacción de restricciones o el algoritmo simplex ).
- Programación de flujo de datos : recálculo forzado de fórmulas cuando cambian los valores de los datos (por ejemplo, hojas de cálculo ).
- Programación distribuida : admite múltiples computadoras autónomas que se comunican a través de redes informáticas.
- Programación genérica : utiliza algoritmos escritos en términos de tipos que se especificarán posteriormente y que luego se instancian según sea necesario para tipos específicos proporcionados como parámetros.
- Metaprogramación : escribir programas que escriben o manipulan otros programas (o a sí mismos) como sus datos, o que realizan parte del trabajo en tiempo de compilación que de otro modo se haría en tiempo de ejecución.
- Metaprogramación con plantillas : métodos de metaprogramación en los que un compilador utiliza plantillas para generar código fuente temporal, que el compilador fusiona con el resto del código fuente y luego compila.
- Programación reflexiva : métodos de metaprogramación en los que un programa se modifica o se extiende a sí mismo.
- Programación en pipeline : un simple cambio de sintaxis para agregar sintaxis a llamadas a funciones anidadas en un lenguaje diseñado originalmente sin ninguna.
- Programación basada en reglas : una red de reglas prácticas que conforman una base de conocimientos y que pueden utilizarse para sistemas expertos y para la deducción y resolución de problemas.
- Programación visual : manipulación gráfica de los elementos del programa en lugar de especificarlos textualmente (por ejemplo, Simulink ); también denominada programación diagramática.
Descripción general

Los paradigmas de programación surgen de la investigación en informática sobre las prácticas existentes de desarrollo de software . Los hallazgos permiten describir y comparar las prácticas de programación y los lenguajes utilizados para codificar programas. A modo de comparación, otros campos de investigación estudian los procesos de ingeniería de software y describen diversas metodologías para describirlos y compararlos.
Un lenguaje de programación se puede describir en términos de paradigmas. Algunos lenguajes admiten solo un paradigma. Por ejemplo, Smalltalk admite la programación orientada a objetos y Haskell la programación funcional. La mayoría de los lenguajes admiten múltiples paradigmas. Por ejemplo, un programa escrito en C++ , Object Pascal o PHP puede ser puramente procedimental , puramente orientado a objetos o puede contener aspectos de ambos paradigmas, entre otros.
Al usar un lenguaje que admite múltiples paradigmas, el desarrollador elige qué elementos de paradigma utilizar. Sin embargo, esta elección no siempre implica considerar los paradigmas en sí mismos. El desarrollador suele usar las características del lenguaje tal como este las proporciona y en la medida en que las conoce. Categorizar el código resultante por paradigma suele ser una actividad académica que se realiza a posteriori.
Los lenguajes clasificados como de paradigma imperativo tienen dos características principales: establecen el orden en que ocurren las operaciones, con construcciones que controlan explícitamente dicho orden, y permiten efectos secundarios, en los que el estado puede modificarse en un momento dado, dentro de una unidad de código, y luego leerse en otro momento dentro de una unidad de código diferente. La comunicación entre las unidades de código no es explícita.
En cambio, los lenguajes del paradigma declarativo no especifican el orden de ejecución de las operaciones. En su lugar, proporcionan una lista de las operaciones disponibles en el sistema, junto con las condiciones bajo las cuales se permite la ejecución de cada una. [ 7 ] La implementación del modelo de ejecución del lenguaje registra qué operaciones pueden ejecutarse libremente y elige el orden de forma independiente. Más información en Comparación de lenguajes de programación multiparadigma .
En la programación orientada a objetos , el código se organiza en objetos que contienen un estado que pertenece al código del objeto y (generalmente) es controlado por él. La mayoría de los lenguajes orientados a objetos son también lenguajes imperativos.
En la programación orientada a objetos, los programas se tratan como un conjunto de objetos que interactúan entre sí. En la programación funcional , los programas se tratan como una secuencia de evaluaciones de funciones sin estado. Al programar computadoras o sistemas con muchos procesadores, en la programación orientada a procesos , los programas se tratan como conjuntos de procesos concurrentes que actúan sobre estructuras de datos lógicas compartidas .
Muchos paradigmas de programación son tan conocidos por las técnicas que prohíben como por las que permiten . Por ejemplo, la programación funcional pura prohíbe los efectos secundarios , mientras que la programación estructurada prohíbe la instrucción goto . En parte por esta razón, los nuevos paradigmas suelen ser considerados dogmáticos o demasiado rígidos por quienes están acostumbrados a los más antiguos. [ 8 ] Sin embargo, evitar ciertas técnicas puede facilitar la comprensión del comportamiento del programa y la demostración de teoremas sobre su corrección.
Los paradigmas de programación también pueden compararse con los modelos de programación , que permiten invocar un modelo de ejecución utilizando únicamente una API. Los modelos de programación también pueden clasificarse en paradigmas según las características del modelo de ejecución.
En la computación paralela , es común usar un modelo de programación en lugar de un lenguaje. Esto se debe a que los detalles del hardware paralelo se filtran en las abstracciones utilizadas para programarlo. Esto obliga al programador a mapear patrones del algoritmo a patrones del modelo de ejecución (que se han insertado debido a la filtración del hardware en la abstracción). En consecuencia, ningún lenguaje de programación paralela se adapta bien a todos los problemas de computación. Por lo tanto, es más conveniente usar un lenguaje secuencial base e insertar llamadas a la API para los modelos de ejecución paralela mediante un modelo de programación. Estos modelos de programación paralela se pueden clasificar según abstracciones que reflejen el hardware, como memoria compartida , memoria distribuida con paso de mensajes , nociones de lugar visibles en el código, etc. Estos pueden considerarse variantes de paradigmas de programación que se aplican solo a lenguajes y modelos de programación paralelos.
Crítica
Algunos investigadores de lenguajes de programación critican la noción de paradigmas como clasificación de lenguajes de programación, por ejemplo Harper [ 9 ] y Krishnamurthi [ 10 ] . Argumentan que muchos lenguajes de programación no pueden clasificarse estrictamente en un solo paradigma, sino que incluyen características de varios paradigmas. Véase Comparación de lenguajes de programación multiparadigma .
Historia
Con el tiempo, se han desarrollado diferentes enfoques de programación. La clasificación de cada enfoque se describió en el momento de su desarrollo inicial, pero a menudo no se hizo hasta tiempo después, de forma retrospectiva. Un enfoque temprano, identificado conscientemente como tal, es la programación estructurada , defendida desde mediados de la década de 1960. El concepto de paradigma de programación como tal se remonta al menos a 1978, en la conferencia de Robert W. Floyd al recibir el Premio Turing , titulada " Los paradigmas de la programación" , que cita la noción de paradigma utilizada por Thomas Kuhn en su obra "La estructura de las revoluciones científicas " (1962). [ 11 ] Los primeros lenguajes de programación no tenían paradigmas de programación claramente definidos y, en ocasiones, los programas hacían un uso extensivo de las instrucciones goto, cuyo uso liberal generaba código espagueti , difícil de comprender y mantener. Esto condujo al desarrollo de paradigmas de programación estructurada que prohibían el uso de las instrucciones goto, permitiendo únicamente el uso de construcciones de programación más estructuradas. [ 12 ]
Lenguajes y paradigmas
Código máquina
El código máquina es el nivel más bajo de programación informática, ya que son instrucciones que definen el comportamiento al nivel de abstracción más bajo posible para una computadora. Al ser la forma más prescriptiva de programar, se clasifica como imperativo.
A veces se le denomina lenguaje de programación de primera generación .
Asamblea
El lenguaje ensamblador introdujo mnemónicos para las instrucciones de máquina y las direcciones de memoria . El ensamblador se clasifica como imperativo y a veces se le denomina lenguaje de programación de segunda generación .
En la década de 1960, se desarrollaron lenguajes ensamblador para admitir la copia de bibliotecas y capacidades bastante sofisticadas de generación y preprocesamiento de macros condicionales, llamadas a subrutinas , variables externas y secciones comunes (globales), lo que permitió una importante reutilización de código y el aislamiento de las particularidades del hardware mediante el uso de operadores lógicos como READ/WRITE/GET/PUT. El lenguaje ensamblador se utilizaba, y aún se utiliza, en sistemas críticos en tiempo real y, a menudo, en sistemas embebidos, ya que proporciona el mayor control sobre el funcionamiento de la máquina.
Lenguajes de procedimiento
Los lenguajes procedimentales , también llamados lenguajes de programación de tercera generación, son los primeros en ser descritos como lenguajes de alto nivel . Admiten vocabulario relacionado con el problema que se está resolviendo. Por ejemplo,
- Lenguaje común orientado a los negocios ( COBOL ) : utiliza términos como archivo , mover y copiar .
- FORmula TRANslation ( FORTRAN ) : utilizando terminología de lenguaje matemático , fue desarrollado principalmente para problemas científicos y de ingeniería.
- Lenguaje ALGOrítmico ( ALGOL ) : se centra en ser un lenguaje apropiado para definir algoritmos , utilizando terminología matemática y orientado a problemas científicos y de ingeniería, al igual que FORTRAN.
- Programming Language One ( PL/I ) : un lenguaje híbrido comercial-científico de propósito general que admite punteros .
- Código de Instrucción Simbólica de Propósito General para Principiantes ( BASIC ) : fue desarrollado para permitir que más personas escribieran programas.
- C – un lenguaje de programación de propósito general, desarrollado inicialmente por Dennis Ritchie entre 1969 y 1973 en los laboratorios AT&T Bell Labs .
Estos lenguajes se clasifican como de paradigma procedimental. Controlan directamente el proceso paso a paso que sigue un programa informático. Por lo tanto, la eficacia y eficiencia de dicho programa dependen en gran medida de la habilidad del programador.
Programación orientada a objetos
En un intento por mejorar los lenguajes procedimentales, se crearon los lenguajes de programación orientada a objetos (POO), como Simula , Smalltalk , C++ , Eiffel , Python , PHP , Java y C# . En estos lenguajes, los datos y los métodos para manipularlos se encuentran en la misma unidad de código, denominada objeto . Esta encapsulación garantiza que un objeto solo puede acceder a los datos mediante sus propios métodos . De este modo, el funcionamiento interno de un objeto puede modificarse sin afectar al código que lo utiliza.
Existe controversia planteada por Alexander Stepanov , Richard Stallman [ 13 ] y otros programadores, respecto a la eficacia del paradigma OOP frente al paradigma procedimental. La necesidad de que cada objeto tenga métodos asociativos lleva a algunos escépticos a asociar OOP con el exceso de tamaño del software ; un intento de resolver este dilema llegó a través del polimorfismo .
Aunque la mayoría de los lenguajes de programación orientada a objetos (POO) son de tercera generación, es posible crear un lenguaje ensamblador orientado a objetos. El lenguaje ensamblador de alto nivel (HLA) es un ejemplo de ello, ya que admite plenamente tipos de datos avanzados y programación en lenguaje ensamblador orientado a objetos , a pesar de sus orígenes tempranos. Por lo tanto, los diferentes paradigmas de programación pueden considerarse más bien como lemas motivacionales de sus defensores, en lugar de representar necesariamente un progreso de un nivel a otro. Las comparaciones precisas de la eficacia de los paradigmas en competencia suelen ser más difíciles debido a la terminología nueva y diversa que se aplica a entidades y procesos similares, junto con las numerosas diferencias de implementación entre los lenguajes.
Lenguajes declarativos
Un programa de programación declarativa describe cuál es el problema, no cómo resolverlo. El programa se estructura como un conjunto de propiedades que se buscan en el resultado esperado, no como un procedimiento a seguir. A partir de una base de datos o un conjunto de reglas, el ordenador intenta encontrar una solución que cumpla con todas las propiedades deseadas. Un ejemplo paradigmático de lenguaje declarativo es SQL , lenguaje de cuarta generación , así como la familia de lenguajes funcionales y la programación lógica.
La programación funcional es un subconjunto de la programación declarativa. Los programas escritos con este paradigma utilizan funciones , bloques de código diseñados para comportarse como funciones matemáticas . Los lenguajes funcionales desaconsejan los cambios en el valor de las variables mediante asignación , haciendo un uso extensivo de la recursión .
El paradigma de la programación lógica concibe la computación como un razonamiento automatizado sobre un conjunto de conocimientos. Los hechos relacionados con el dominio del problema se expresan como fórmulas lógicas, y los programas se ejecutan aplicando reglas de inferencia sobre ellas hasta que se encuentra una solución al problema o se demuestra que el conjunto de fórmulas es inconsistente.
Otros paradigmas
La programación simbólica es un paradigma que describe programas capaces de manipular fórmulas y componentes de programas como datos. [ 4 ] De este modo, los programas pueden modificarse a sí mismos de forma efectiva y parecen "aprender", lo que los hace idóneos para aplicaciones como la inteligencia artificial , los sistemas expertos , el procesamiento del lenguaje natural y los videojuegos. Entre los lenguajes que admiten este paradigma se encuentran Lisp y Prolog . [ 14 ]
La programación diferenciable estructura los programas de manera que puedan diferenciarse en todo su recorrido, generalmente mediante diferenciación automática . [ 15 ] [ 16 ]
La programación literaria , como forma de programación imperativa , estructura los programas como una web centrada en el ser humano, como en un ensayo hipertextual : la documentación es parte integral del programa, y este se estructura siguiendo la lógica de la exposición en prosa, en lugar de la conveniencia del compilador.
Las técnicas de programación simbólica, como la programación reflexiva (reflexión), que permiten que un programa se referencie a sí mismo, también podrían considerarse un paradigma de programación. Sin embargo, esto es compatible con los paradigmas principales y, por lo tanto, no constituye un paradigma propiamente dicho.
Véase también
Referencias
- ↑ "Lenguaje de programación multiparadigma" . Red de desarrolladores de Mozilla . Fundación Mozilla . 21 de junio de 2013. Archivado del original el 21 de agosto de 2013.
- ^ Normark, Kurt. Descripción general de los cuatro paradigmas principales de programación . Universidad de Aalborg, 9 de mayo de 2011. Consultado el 22 de septiembre de 2012.
- ↑ Frans Coenen (1999-10-11). "Características de los lenguajes de programación declarativos" . cgi.csc.liv.ac.uk. Archivado del original el 27 de febrero de 2014. Consultado el 20 de febrero de 2014 .
- 1 2 Michael A. Covington (23 de agosto de 2010). "CSCI/ARTI 4540/6540: Primera conferencia sobre programación simbólica y LISP" (PDF) . Universidad de Georgia. Archivado del original (PDF) el 7 de marzo de 2012. Recuperado el 20 de noviembre de 2013 .
- ↑ Peter Van Roy (12 de mayo de 2009). "Paradigmas de programación: lo que todo programador debería saber" (PDF) . info.ucl.ac.be. Consultado el 27 de enero de 2014 .
- ↑ Peter Van-Roy; Seif Haridi (2004). Conceptos, técnicas y modelos de programación informática . MIT Press. ISBN 978-0-262-22069-9.
- ↑ "Paradigmas de programación: ¿Cuáles son los principios de la programación?" . IONOS Digitalguide . 20 de abril de 2020. Archivado del original el 29 de junio de 2022 . Consultado el 3 de mayo de 2022 .
- ↑ Frank Rubin (marzo de 1987) .«GOTO se considera perjudicial» (PDF) . Communications of the ACM . 30 (3): 195–196 . doi : 10.1145/214748.315722 . S2CID 6853038. Archivado del original (PDF) el 20 de marzo de 2009.
- ↑ Harper, Robert (1 de mayo de 2017). "¿Qué es, si acaso, un paradigma de programación?" . FifteenEightyFour . Cambridge University Press.
- ↑ Krishnamurthi, Shriram (noviembre de 2008). "Enseñanza de lenguajes de programación en la era post-linneana" . ACM SIGPLAN Notices . 43 (11). ACM: 81–83 . doi : 10.1145/1480828.1480846 . S2CID 35714982 . .
- ↑ Floyd, RW (1979). "Los paradigmas de la programación" . Communications of the ACM . 22 (8): 455– 460. doi : 10.1145/359138.359140 .
- ↑ Soroka, Barry I. (2006). Java 5: Objects First . Jones & Bartlett Learning. ISBN 9780763737207.
- ↑ "Herencia de modos, clonación, hooks y POO (Discusión en Google Groups)" .
- ↑ "Glosario empresarial: Definición de programación simbólica" . allbusiness.com . Consultado el 30 de julio de 2014 .
- ↑ Wang, Fei; Decker, James; Wu, Xilun; Essertel, Gregory; Rompf, Tiark (2018), Bengio, S.; Wallach, H.; Larochelle, H.; Grauman, K. (eds.), "Retropropagación con funciones de devolución de llamada: Fundamentos para una programación diferenciable eficiente y expresiva" (PDF) , Advances in Neural Information Processing Systems 31 , Curran Associates, Inc., pp. 10201–10212 , consultado el 13 de febrero de 2019.
- ↑ Innes, Mike (2018). "Sobre aprendizaje automático y lenguajes de programación" (PDF) . Conferencia SysML 2018. Archivado del original (PDF) el 20 de septiembre de 2018. Recuperado el 13 de febrero de 2019 .
Enlaces externos
- Clasificación de los principales paradigmas de programación
- ¿Cómo evolucionan y se adoptan los paradigmas de programación?
- paradigmas de programación
- Clasificación de lenguajes de programación
- Temas de lenguajes de programación