Paradigmas de la programación
Los paradigmas de programación son una forma de clasificar los lenguajes de programación en función de sus características. Los lenguajes se pueden clasificar en múltiples paradigmas.
Algunos paradigmas se ocupan principalmente de las implicaciones para el modelo de ejecución del lenguaje, como permitir efectos secundarios o si la secuencia de operaciones está definida por el modelo de ejecución. Otros paradigmas se ocupan principalmente de la forma en que se organiza el código, como agrupar un código en unidades junto con el estado que modifica el código. Sin embargo, otros se preocupan principalmente por el estilo de la sintaxis y la gramática.
Los paradigmas de programación comunes incluyen:
- imperativo en el que el programador instruye a la máquina cómo cambiar su estado,
- procedimental que agrupa las instrucciones en procedimientos,
- orientado a objetos que agrupa las instrucciones con la parte del estado en el que operan,
- declarativo en el que el programador simplemente declara las propiedades del resultado deseado, pero no cómo calcularlo
- funcional en el que el resultado deseado se declara como el valor de una serie de aplicaciones de función,
- lógica en la que el resultado deseado se declara como la respuesta a una pregunta sobre un sistema de hechos y reglas,
- matemático en el que el resultado deseado se declara como la solución de un problema de optimización
- reactivo en el que se declara el resultado deseado con flujos de datos y la propagación del cambio
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 lo tanto, no es un paradigma real por derecho propio.
Por ejemplo, los lenguajes que caen en el 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 los que el estado puede modificarse en un momento determinado. dentro de una unidad de código, y luego se lee 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. Mientras tanto, en la programación orientada a objetos, el código se organiza en objetos que contienen un estado que solo es modificado por el código que forma parte del objeto. La mayoría de los lenguajes orientados a objetos también son lenguajes imperativos. Por el contrario, los lenguajes que se ajustan al paradigma declarativono indique el orden en que ejecutar las operaciones. En su lugar, proporcionan una serie de operaciones disponibles en el sistema, junto con las condiciones bajo las cuales cada una puede ejecutarse. 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 en Comparación de lenguajes de programación multiparadigmáticos.
Visión de conjunto
Así como la ingeniería de software (como proceso) está definida por diferentes metodologías, los lenguajes de programación (como modelos de computación) están definidos por diferentes paradigmas. Algunos lenguajes están diseñados para admitir un paradigma (Smalltalk admite la programación orientada a objetos, Haskell admite la programación funcional), mientras que otros lenguajes de programación admiten múltiples paradigmas (como Object Pascal, C++, Java, JavaScript, C#, Scala, Visual Basic, Common Lisp, Scheme, Perl, PHP, Python, Ruby, Oz y F#). Por ejemplo, los programas escritos en C++, Object Pascal o PHP pueden ser puramente procedimentales, puramente orientados a objetos o pueden contener elementos de ambos u otros paradigmas. Los diseñadores y programadores de software deciden cómo usar esos elementos de paradigma.
En la programación orientada a objetos, los programas se tratan como un conjunto de objetos que interactúan. 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 compartidas lógicas.
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 no permite el uso de efectos secundarios, mientras que la programación estructurada no permite el uso de la instrucción goto. En parte por esta razón, los nuevos paradigmas suelen ser considerados doctrinarios o demasiado rígidos por quienes están acostumbrados a los estilos anteriores. Sin embargo, evitar ciertas técnicas puede facilitar la comprensión del comportamiento del programa y la demostración de 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 solo 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 usar 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 mapea bien todos los problemas de computación. Por lo tanto, es más conveniente usar un lenguaje secuencial base e insertar llamadas API a modelos de ejecución en paralelo a través de un modelo de programación. Dichos modelos de programación paralela se pueden clasificar de acuerdo con las abstracciones que reflejan el hardware, como memoria compartida, memoria distribuida con paso de mensajes, nociones de lugarvisible en el código, y así sucesivamente. Estos pueden considerarse sabores del paradigma de programación que se aplican solo a lenguajes paralelos y modelos de programación.
Crítica
Algunos investigadores de lenguajes de programación critican la noción de paradigmas como una clasificación de los lenguajes de programación, por ejemplo, Harper y Krishnamurthi. Argumentan que muchos lenguajes de programación no pueden clasificarse estrictamente en un paradigma, sino que incluyen características de varios paradigmas. Consulte Comparación de lenguajes de programación multiparadigmáticos.
Historia
Se han desarrollado diferentes enfoques de programación a lo largo del tiempo, identificados como tales en ese momento o retrospectivamente. Un enfoque temprano identificado conscientemente como tal es la programación estructurada, defendida desde mediados de la década de 1960. El concepto de un "paradigma de programación" como tal data al menos de 1978, en la conferencia del Premio Turing de Robert W. Floyd, titulada Los paradigmas de la programación, que cita la noción de paradigma tal como la utiliza Thomas Kuhn en su The Structure of Scientific Revoluciones (1962).
Codigo de maquina
Los paradigmas de programación de nivel más bajo son el código de máquina, que representa directamente las instrucciones (el contenido de la memoria del programa) como una secuencia de números, y el lenguaje ensamblador donde las instrucciones de la máquina están representadas por mnemónicos y las direcciones de memoria pueden recibir etiquetas simbólicas. Estos a veces se denominan lenguajes de primera y segunda generación.
En la década de 1960, los lenguajes ensambladores se desarrollaron para admitir COPY de la biblioteca y capacidades de preprocesamiento y generación de macros condicionales bastante sofisticadas, CALL to (subrutinas), variables externas y secciones comunes (globales), lo que permite una reutilización significativa del código y el aislamiento de las especificaciones del hardware a través de la uso de operadores lógicos como READ/WRITE/GET/PUT. El ensamblaje se usaba, y todavía se usa, para sistemas de tiempo crítico y, a menudo, en sistemas integrados, ya que brinda el control más directo de lo que hace la máquina.
Lenguajes de procedimiento
El siguiente avance fue el desarrollo de los lenguajes procedimentales. Estos lenguajes de tercera generación (los primeros descritos como lenguajes de alto nivel) utilizan 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.
- TRADUCCIÓN DE FÓRMULAS (FORTRAN): utilizando terminología del lenguaje matemático, fue desarrollado principalmente para problemas científicos y de ingeniería.
- Lenguaje ALGOrithmic (ALGOL) – enfocado en ser un lenguaje apropiado para definir algoritmos, mientras usa terminología de lenguaje matemático, apuntando a problemas científicos y de ingeniería, al igual que FORTRAN.
- Programación Lenguaje Uno (PL/I) – un lenguaje de propósito general comercial-científico híbrido que soporta punteros.
- Principiantes Código de instrucciones simbólicas multipropósito (BASIC): fue desarrollado para permitir que más personas escriban programas.
- C: un lenguaje de programación de propósito general, inicialmente desarrollado por Dennis Ritchie entre 1969 y 1973 en AT&T Bell Labs.
Todos estos lenguajes siguen el paradigma procedimental. Es decir, describen, paso a paso, exactamente el procedimiento que debe seguirse, al menos según el programador en particular, para resolver un problema específico. Por lo tanto, la eficacia y la eficiencia de cualquier solución de este tipo son totalmente subjetivas y dependen en gran medida de la experiencia, la inventiva y la capacidad del programador.
Programación orientada a objetos
Tras el uso generalizado de lenguajes de procedimiento, 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 se mantienen como una unidad llamada objeto. Con una encapsulación perfecta, una de las características distintivas de OOP, la única forma en que otro objeto o usuario podría acceder a los datos es a través de los métodos del objeto.. Por lo tanto, el funcionamiento interno de un objeto se puede cambiar sin afectar ningún código que use el objeto. Todavía existe cierta controversia planteada por Alexander Stepanov, Richard Stallman y otros programadores, con 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 la programación orientada a objetos con el exceso de software; un intento de resolver este dilema vino a través del polimorfismo.
Debido a que la programación orientada a objetos se considera un paradigma, no un lenguaje, es posible crear incluso un lenguaje ensamblador orientado a objetos. High Level Assembly (HLA) es un ejemplo de esto que admite completamente 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 como memes motivacionales de sus defensores, en lugar de representar necesariamente el progreso de un nivel al siguiente. Las comparaciones precisas de la eficacia de los paradigmas en competencia con frecuencia se hacen más difíciles debido a la terminología nueva y diferente que se aplica a entidades y procesos similares, junto con numerosas distinciones de implementación entre idiomas.
Otros paradigmas
La programación literaria, 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.
Independientemente de la rama imperativa, se desarrollaron paradigmas de programación declarativa. En estos lenguajes, a la computadora se le dice cuál es el problema, no cómo resolverlo; el programa está estructurado como un conjunto de propiedades para encontrar el resultado esperado, no como un procedimiento a seguir. Dada una base de datos o un conjunto de reglas, la computadora trata de encontrar una solución que coincida con todas las propiedades deseadas. Un arquetipo de un lenguaje declarativo es el lenguaje de cuarta generación SQL y la familia de lenguajes funcionales y programación lógica.
La programación funcional es un subconjunto de la programación declarativa. Los programas escritos usando este paradigma usan funciones, bloques de código destinados a comportarse como funciones matemáticas. Los lenguajes funcionales desalientan los cambios en el valor de las variables a través de la asignación, haciendo un gran uso de la recursividad en su lugar.
El paradigma de la programación lógica ve la computación como un razonamiento automatizado sobre un cuerpo de conocimiento. 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.
La programación simbólica es un paradigma que describe programas capaces de manipular fórmulas y componentes de programas como datos. Por lo tanto, los programas pueden modificarse a sí mismos de manera efectiva y parecer "aprender", lo que los hace adecuados para aplicaciones como la inteligencia artificial, los sistemas expertos, el procesamiento del lenguaje natural y los juegos de computadora. Los lenguajes que soportan este paradigma incluyen Lisp y Prolog.
La programación diferenciable estructura los programas para que puedan ser diferenciados en su totalidad, generalmente a través de la diferenciación automática.
Soporte para múltiples paradigmas
La mayoría de los lenguajes de programación admiten más de un paradigma de programación para permitir que los programadores utilicen el estilo de programación más adecuado y las construcciones de lenguaje asociadas para un trabajo determinado.
Contenido relacionado
Tabla de asignación de archivos
QNX
Set de instrucciones arquitectura