stringtranslate.com

Paradigma de programación

Un paradigma de programación es una forma de nivel relativamente alto de estructurar y conceptualizar la implementación de un programa de computadora . Un lenguaje de programación se puede clasificar como compatible con uno o más paradigmas. [1]

Los paradigmas están separados y descritos por diferentes dimensiones de la programación. Algunos paradigmas tratan sobre las implicaciones del modelo de ejecución , como permitir efectos secundarios o si la secuencia de operaciones está definida por el modelo de ejecución. Otros paradigmas tratan sobre la forma en que se organiza el código, como agruparlo en unidades que incluyen tanto el estado como el comportamiento. Otros más tratan sobre sintaxis y gramática .

Algunos paradigmas de programación comunes incluyen (mostrados en relación jerárquica): [2] [3] [4]

Descripción general

Descripción general de los distintos paradigmas de programación según Peter Van Roy [5] : 5  [6]

Los paradigmas de programación provienen de la investigación 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. En perspectiva, otras investigaciones estudian los procesos de ingeniería de software y describen varias metodologías para describirlos y compararlos.

Un lenguaje de programación se puede describir en términos de paradigmas. Algunos lenguajes soportan sólo un paradigma. Por ejemplo, Smalltalk admite la orientación a objetos y Haskell la 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 – u otros paradigmas.

Cuando se utiliza un lenguaje que admite múltiples paradigmas, el desarrollador elige qué elementos del paradigma utilizar. Pero esta elección puede no implicar considerar paradigmas per se. El desarrollador a menudo utiliza las características de un lenguaje tal como el lenguaje las proporciona y en la medida en que las conoce. Categorizar el código resultante por paradigma es a menudo una actividad académica que se realiza en retrospectiva.

Los lenguajes categorizados como paradigma imperativo tienen dos características principales: establecen el orden en que ocurren las operaciones, con construcciones que controlan explícitamente ese orden, y permiten efectos secundarios, en cuyo estado se puede modificar en un momento determinado, dentro de una unidad de código. y luego leer en un momento diferente dentro de una unidad de código diferente. La comunicación entre las unidades de código no es explícita.

Por el contrario, los lenguajes del paradigma declarativo no establecen el orden en el que ejecutar las operaciones. En cambio, proporcionan una serie de operaciones disponibles en el sistema, junto con las condiciones bajo las cuales cada una puede ejecutarse. [7] La ​​implementación del modelo de ejecución del lenguaje rastrea qué operaciones se pueden ejecutar 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 es propiedad del código del objeto y (normalmente) está controlado por él. La mayoría de los lenguajes orientados a objetos también son lenguajes imperativos.

En la programación orientada a objetos, los programas se tratan como un conjunto de objetos que interactúan. En 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 lógicas de datos compartidos .

Muchos paradigmas de programación son tan conocidos por las técnicas que prohíben como por las que apoyan . Por ejemplo, la programación funcional pura no permite los efectos secundarios , mientras que la programación estructurada no permite la construcción goto . En parte por esta razón, quienes están acostumbrados a los más antiguos suelen considerar los nuevos paradigmas como doctrinarios o demasiado rígidos. [8] Sin embargo, evitar ciertas técnicas puede hacer que sea más fácil comprender el comportamiento del programa y demostrar teoremas sobre la corrección del programa.

Los paradigmas de programación también se pueden comparar con los modelos de programación , lo que permite invocar un modelo de ejecución utilizando únicamente una API. Los modelos de programación también se pueden clasificar en paradigmas según las características del modelo de ejecución.

Para la computación paralela , es común utilizar un modelo de programación en lugar de un lenguaje. La razón es que los detalles del hardware paralelo se filtran en las abstracciones utilizadas para programar el hardware. Esto hace que el programador tenga que asignar patrones en el algoritmo a patrones en el modelo de ejecución (que se han insertado debido a una fuga de hardware en la abstracción). Como consecuencia, ningún lenguaje de programación paralelo se adapta bien a todos los problemas de cálculo. Por lo tanto, es más conveniente utilizar un lenguaje secuencial base e insertar llamadas API a modelos de ejecución en paralelo a través de un modelo de programación. Estos modelos de programación paralela se pueden clasificar según abstracciones que reflejan el hardware, como memoria compartida , memoria distribuida con paso de mensajes , nociones de lugar visibles en el código, etc. Estos pueden considerarse tipos de paradigma de programación que se aplican únicamente 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 los lenguajes de programación, por ejemplo Harper, [9] y Krishnamurthi. [10] Argumentan que muchos lenguajes de programación no pueden clasificarse estrictamente en un paradigma, sino que incluyen características de varios paradigmas. Ver Comparación de lenguajes de programación multiparadigma .

Historia

Con el tiempo se han desarrollado diferentes enfoques de la programación. La clasificación de cada enfoque se describió en el momento en que se desarrolló por primera vez, pero a menudo no hasta algún tiempo después, de forma retrospectiva. Un enfoque temprano identificado conscientemente como tal es la programación estructurada , defendida desde mediados de los años 1960. El concepto de paradigma de programación como tal data al menos de 1978, en la conferencia del Premio Turing de Robert W. Floyd , titulada The Paradigms of Programming , que cita la noción de paradigma tal como la utiliza Thomas Kuhn en su The Structure of Scientific Revolutions ( 1962). [11] Los primeros lenguajes de programación no tenían paradigmas de programación claramente definidos y, a veces, los programas hacían un uso extensivo de declaraciones goto. Su uso liberal conduce a un código espagueti que es difícil de entender y mantener. Esto llevó al desarrollo de paradigmas de programación estructurada que no permitían el uso de declaraciones goto; solo permite el uso de construcciones de programación más estructuradas. [12]

Lenguajes y paradigmas

Codigo de maquina

El código de máquina es el nivel más bajo de programación informática, ya que son las instrucciones de la máquina las que definen el comportamiento en el nivel más bajo de abstracción posible para una computadora. Como es la forma más prescriptiva de codificar, se clasifica como imperativa.

A veces se le llama lenguaje de programación de primera generación .

Asamblea

El lenguaje ensamblador introdujo mnemónicos para instrucciones de máquina y direcciones de memoria . El ensamblador se clasifica como imperativo y a veces se le llama lenguaje de programación de segunda generación .

En la década de 1960, se desarrollaron lenguajes ensambladores para admitir la copia de biblioteca y capacidades bastante sofisticadas de preprocesamiento y generación de macros condicionales, LLAMADA a subrutinas , variables externas y secciones comunes (globales), lo que permitió una importante reutilización del código y aislamiento de detalles específicos del hardware mediante el uso de Operadores lógicos como LEER/ESCRIBIR/OBTENER/PUT. El ensamblaje se usaba, y todavía se usa, para sistemas en los que el tiempo es crítico y, a menudo, en sistemas integrados, ya que brinda el mayor control de lo que hace la máquina.

Lenguajes procesales

Los lenguajes procedimentales , también llamados lenguajes de programación de tercera generación , son los primeros descritos como lenguajes de alto nivel . Apoyan el vocabulario relacionado con el problema que se está resolviendo. Por ejemplo,

Estos lenguajes se clasifican como paradigma procesal. Controlan directamente el proceso paso a paso que sigue un programa informático. Por lo tanto, la eficacia y eficiencia de un programa de este tipo depende en gran medida de la habilidad del programador.

Programación orientada a objetos

En un intento por mejorar los lenguajes procedimentales, se crearon 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 están en la misma unidad de código llamada objeto . Esta encapsulación garantiza que la única forma en que un objeto pueda acceder a los datos es a través de los métodos del objeto que contiene los datos. Por lo tanto, el funcionamiento interno de un objeto se puede cambiar sin afectar el código que utiliza el objeto.

Existe una controversia planteada por Alexander Stepanov , Richard Stallman [13] y otros programadores sobre la eficacia del paradigma OOP versus el paradigma procedimental. La necesidad de que cada objeto tenga métodos asociativos lleva a algunos escépticos a asociar la programación orientada a objetos con el exceso de software ; un intento de resolver este dilema llegó a través del polimorfismo .

Aunque la mayoría de los lenguajes POO son de tercera generación, es posible crear un lenguaje ensamblador orientado a objetos. High Level Assembly (HLA) es un ejemplo de esto que admite totalmente tipos de datos avanzados y programación en lenguaje ensamblador orientada a objetos, a pesar de sus orígenes tempranos. Por lo tanto, los diferentes paradigmas de programación pueden verse más bien como memes motivacionales de sus defensores, en lugar de representar necesariamente el progreso de un nivel al siguiente. [ cita necesaria ] Las comparaciones precisas de la eficacia de los paradigmas en competencia con frecuencia se vuelven más difíciles debido a la terminología nueva y diferente aplicada a entidades y procesos similares junto con numerosas distinciones de implementación en todos los idiomas.

Lenguajes declarativos

Un programa de programación declarativa describe cuál es el problema, no cómo resolverlo. El programa está estructurado como un conjunto de propiedades a encontrar en el resultado esperado, no como un procedimiento a seguir. Dada una base de datos o un conjunto de reglas, la computadora intenta encontrar una solución que coincida con todas las propiedades deseadas. Un arquetipo de lenguaje declarativo es el lenguaje SQL de cuarta generación y la familia de lenguajes funcionales y de programación lógica.

La programación funcional es un subconjunto de la programación declarativa. Los programas escritos utilizando este paradigma utilizan funciones , bloques de código destinados a comportarse como funciones matemáticas . Los lenguajes funcionales desalientan los cambios en el valor de las variables mediante la asignación , haciendo un gran uso de la recursividad .

El paradigma de la programación lógica considera la computación como un razonamiento automatizado sobre un conjunto de conocimientos. Los hechos sobre el dominio del problema se expresan como fórmulas lógicas y los programas se ejecutan aplicando reglas de inferencia sobre ellos hasta que se encuentra una respuesta 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 manera efectiva y parecer "aprender", lo que los hace adecuados para aplicaciones como inteligencia artificial , sistemas expertos , procesamiento de lenguaje natural y juegos de computadora. Los lenguajes que soportan este paradigma incluyen Lisp y Prolog . [14]

La programación diferenciable estructura los programas para que puedan diferenciarse en su totalidad, generalmente mediante diferenciación automática . [15] [16]

La programación alfabetizada , como una forma de programación imperativa , estructura los programas como una red centrada en el ser humano, como en un ensayo de hipertexto : la documentación es parte integral del programa y el programa está estructurado siguiendo la lógica de la exposición en prosa, en lugar de la conveniencia del compilador.

Las técnicas simbólicas como la reflexión , que permiten que el programa se refiera a sí mismo, también podrían considerarse como un paradigma de programación. Sin embargo, esto es compatible con los principales paradigmas y, por tanto, no es un paradigma real en sí mismo.

Ver también

Referencias

  1. ^ "Lenguaje de programación multiparadigma". Red de desarrolladores de Mozilla . Fundación Mozilla . 21 de junio de 2013. Archivado desde el original el 21 de agosto de 2013.
  2. ^ 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.
  3. ^ Frans Coenen (11 de octubre de 1999). "Características de los lenguajes de programación declarativos". cgi.csc.liv.ac.uk. _ Archivado desde el original el 27 de febrero de 2014 . Consultado el 20 de febrero de 2014 .
  4. ^ ab 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 desde el original (PDF) el 7 de marzo de 2012 . Consultado el 20 de noviembre de 2013 .
  5. ^ Peter Van Roy (12 de mayo de 2009). "Paradigmas de programación: lo que todo programador debe saber" (PDF) . info.ucl.ac.be. _ Consultado el 27 de enero de 2014 .
  6. ^ Peter Van Roy; Seif Haridi (2004). Conceptos, técnicas y modelos de programación informática. Prensa del MIT. ISBN 978-0-262-22069-9.
  7. ^ "Paradigmas de programación: ¿Cuáles son los principios de la programación?". Guía digital de IONOS . 20 de abril de 2020. Archivado desde el original el 29 de junio de 2022 . Consultado el 3 de mayo de 2022 .
  8. ^ Frank Rubin (marzo de 1987). "'GOTO considerado nocivo' considerado nocivo" (PDF) . Comunicaciones de la ACM . 30 (3): 195-196. doi :10.1145/214748.315722. S2CID  6853038. Archivado desde el original (PDF) el 20 de marzo de 2009.
  9. ^ Harper, Robert (1 de mayo de 2017). "¿Qué es, en todo caso, un paradigma de programación?". Quince Ochenta Cuatro . Prensa de la Universidad de Cambridge.
  10. ^ Krishnamurthi, Shriram (noviembre de 2008). "Enseñanza de lenguajes de programación en una era post-linnea". Avisos ACM SIGPLAN . ACM. 43 (11): 81–83. doi :10.1145/1480828.1480846. S2CID  35714982..
  11. ^ Floyd, RW (1979). "Los paradigmas de la programación". Comunicaciones de la ACM . 22 (8): 455–460. doi : 10.1145/359138.359140 .
  12. ^ Soroka, Barry I. (2006). Java 5: objetos primero. Aprendizaje de Jones y Bartlett. ISBN 9780763737207.
  13. ^ "Herencia de modos, clonación, ganchos y programación orientada a objetos (discusión de grupos de Google)".
  14. ^ "Glosario empresarial: definición de programación simbólica". allbusiness.com . Consultado el 30 de julio de 2014 .
  15. ^ Wang, Fei; Decker, James; Wu, Xilun; Essertel, Gregorio; Rompf, Tiark (2018), Bengio, S.; Wallach, H.; Larochelle, H.; Grauman, K. (eds.), "Retropropagación con devoluciones de llamada: fundamentos para una programación diferenciable eficiente y expresiva" (PDF) , Avances en los sistemas de procesamiento de información neuronal 31 , Curran Associates, Inc., págs. 10201–10212 , consultado el 2019-02 -13
  16. ^ Innes, Mike (2018). "Sobre lenguajes de programación y aprendizaje automático" (PDF) . Conferencia SysML 2018 . Archivado desde el original (PDF) el 2018-09-20 . Consultado el 13 de febrero de 2019 .

enlaces externos