¿Cuál es la diferencia entre la programación imperativa, procesal y estructurada?

85

Al investigar (libros, Wikipedia, preguntas similares sobre SE, etc.) llegué a comprender que la programación imperativa es uno de los principales paradigmas de programación, donde se describe una serie de comandos (o declaraciones) para que la computadora los ejecute (así que mucho ordene que tome acciones específicas, de ahí el nombre "imperativo"). Hasta aquí todo bien.

La programación de procedimientos, por otro lado, es un tipo específico (o subconjunto) de programación imperativa, donde se utilizan procedimientos (es decir, funciones) para describir los comandos que debe realizar la computadora.

Primera pregunta : ¿Existe un lenguaje de programación imperativo que no sea de procedimiento? En otras palabras, ¿puedes tener una programación imperativa sin procedimientos?

Actualización : esta primera pregunta parece ser respondida. Un lenguaje PUEDE ser imperativo sin ser procesal o estructurado. Un ejemplo es el lenguaje ensamblador puro.

Luego también tiene la programación estructurada, que parece ser otro tipo (o subconjunto) de programación imperativa, que surgió para eliminar la dependencia de la declaración GOTO.

Segunda pregunta : ¿Cuál es la diferencia entre la programación procesal y la estructurada? ¿Puedes tener uno sin el otro y viceversa? ¿Podemos decir que la programación procesal es un subconjunto de la programación estructurada, como en la imagen?

ingrese la descripción de la imagen aquí

Daniel Scocco
fuente

Respuestas:

52

Muchos de los términos pueden ser reutilizados (a menudo mal utilizados) sobre lenguajes de programación, especialmente aquellos que no sean orientados a objetos.

Aquí hay algunas pequeñas descripciones de los términos.

  1. Programación imperativa: en los viejos tiempos, cuando la programación estaba ampliamente ensamblada, el código tenía toneladas de GOTO. Incluso los lenguajes de nivel superior como FORTRAN y BASIC comenzaron a usar las mismas primitivas. En este paradigma de programación, todo el programa es un algoritmo único o una funcionalidad completa escrita linealmente, paso a paso. Este es un estilo imperativo . Comprenda que uno realmente puede escribir un trabajo imperativo totalmente malo incluso en el lenguaje C moderno, pero es bastante fácil organizar el código en lenguajes de nivel superior.

  2. Programación estructurada y modular: la mayoría de las veces deberíamos poder usar el término indistintamente pero con diferencias sutiles. Cuando los lenguajes de nivel superior comenzaron a enriquecerse, uno se dio cuenta de que todas las unidades de trabajo deberían dividirse en partes manejables más pequeñas, es decir, cuando surgieron las funciones y la programación se convirtió en una jerarquía de funciones y muchas de nivel inferior podrían reutilizarse.

    • La programación estructurada es cualquier programación cuando la funcionalidad se divide en unidades como la for loop, while loop, if... thenestructura de bloques, etc.
    • Además, aquí se puede reutilizar un fragmento de código (función).
    • En la programación modular , se puede crear una forma física de paquete, es decir, un fragmento de código que se puede enviar; que son de uso bastante general y reutilizables. Esto se llama módulos de elementos compilados juntos.
    • Por lo tanto, uno apenas puede ver programas modulares que no están estructurados y viceversa; La definición técnica es sutilmente diferente, pero en su mayoría el código estructurado puede hacerse modular y de otra manera.
  3. Luego vino la "programación orientada a objetos" que está bien definida en la literatura. Comprenda que la programación orientada a objetos es una forma de programación estructurada por definición. El nuevo nombre para todos esos códigos basados ​​en funciones, que es código estructurado pero NO orientado a objetos, a menudo se llama programación procesal.

    • Entonces, el código básicamente estructurado donde las funciones (o procedimientos) dominan sobre los datos se llama procesal, mientras que la representación basada en clases y objetos se llama orientada a objetos. Ambos, por definición, también son modulares.

Mucha gente piensa: toda la programación estructurada (tal vez omitiendo la basada en objetos) como una programación imperativa; Supongo que esto solo se debe a la falta de una definición clara de la programación imperativa, pero está mal. ¡Estás haciendo programación estructurada cuando no estás haciendo muchos imperativos! Pero aún puedo escribir muchas funciones, así como muchas declaraciones de goto dentro del programa C o FORTRAN para mezclar.

Para ser específico a sus preguntas:

Primera pregunta : El lenguaje ensamblador puro es un lenguaje imperativo que NO es estructurado ni procesal. (Tener un flujo de control interpretativo paso a paso no significa procedimiento, pero la división de la funcionalidad en funciones es lo que hace que un lenguaje sea procesal).

  • corrección * La mayoría de las formas modernas de ensamblaje admiten el uso de funciones. De hecho, todo lo que es posible en el código de alto nivel TIENE que existir bajo nivel para funcionar. Aunque es una práctica mucho mejor crear código de procedimiento, es posible escribir tanto código de procedimiento como imperativo. A diferencia de este último, es más fácil de mantener y más fácil de entender (evitando el horrible código de espagueti). Creo que hay scripts de shell / bash que se ajustan mejor al galardón de ser puramente imperativo, pero incluso entonces, la mayoría tiene funciones, los desarrolladores definitivamente entienden cuánto valor tienen.

Segunda pregunta : La programación procesal es una FORMA de programación estructurada.


PRIMA

  • Según alguna taxonomía, la clasificación primaria es declarativa (o lenguaje funcional) versus imperativo. Los lenguajes declarativos permiten el cálculo sin describir su flujo de control, mientras que imperativo es donde se define el flujo de control explícito (paso a paso). Según esta clasificación, la programación imperativa, para algunos, puede ser un superconjunto de programación estructurada, modular y OO. Vea esto: Programación funcional vs. OOP

  • Después de orientado a objetos, se han inventado otros paradigmas de programación: consulte aquí para obtener más detalles: ¿Cuáles son las diferencias entre programación orientada a aspectos, orientada a temas y orientada a roles?

Dipan Mehta
fuente
1
Entonces, ¿diría que la programación procesal también es necesariamente una programación estructurada, mientras que lo contrario no es cierto (aunque a menudo es el caso)?
Daniel Scocco
2
Sí, yo diría que sí.
Dipan Mehta
1
En mi respuesta, he definido imperativo versus estructurado, donde la programación imperativa se escribe con una ejecución paso a paso y no está estructurada. Sin embargo, según alguna definición hay otra clasificación; Esta es una clasificación entre declarativo (o lenguaje funcional) frente a imperativo. Los lenguajes declarativos permiten el cálculo sin describir su flujo de control donde, como imperativo, es donde se define el flujo de control explícito (paso a paso). Basado en esta clasificación, la programación imperativa, para algunos puede ser un superconjunto de estructurado. Algunos no siguen esa definición.
Dipan Mehta
Tengo una opinión diferente con respecto a la definición de programación estructurada. La programación estructurada y la programación modular no son lo mismo. Consulte la definición al final de esta nota. ¡El mismo enlace sugiere que Assembler ** es un lenguaje de programación estructurado **! Referencia para la definición de STP: en.wikipedia.org/wiki/Structured_programming - Emmad Kareem
NoChance
¿Es una "forma física de paquete" ... un archivo o un directorio / archivo de archivos? (O no lo es, y es otra cosa).
n611x007
4

Primera pregunta: Sí, muchos lenguajes puros orientados a objetos califican. Si bien tienen métodos, que están muy cerca de las funciones, ven estos métodos en términos de mensajes y no les dan suficiente peso para llamar al lenguaje procesal.

Segunda pregunta: la diferencia a menudo tiene un alcance diferente. Puede tener una función con declaraciones goto por todas partes, que tendrá un estilo de procedimiento, pero no una programación estructurada. Por otro lado, la mayoría de los lenguajes OO admiten y fomentan la programación estructurada, pero no la programación de procedimientos.

La programación de procedimientos describe el orden global del programa. Los programas de procedimiento son aquellos que se entienden de manera más efectiva al mirar sus gráficos de llamadas. La programación estructural es una propiedad local, se aplica al uso de if y while a diferencia de goto.

Como tal, estas dos propiedades son disjuntas, puede tener una sin la otra.

thiton
fuente
1
La única prueba de fuego para ser de procedimiento es que el lenguaje contenga procedimientos (función o métodos ) y sea imperativo, es decir. no declarativo. Esto significa que la mayoría de los lenguajes OO que no son puramente funcionales serían de procedimiento.
dietbuddha
1
@dietbuddha: Según esta definición, Haskell calificaría como lenguaje de procedimiento a través del uso de mónadas. Requeriría una cierta dependencia de los procedimientos para hacer un lenguaje procesal.
thiton
No conozco a Haskell tan bien, pero pensé que Haskell es un lenguaje funcional puro porque envuelve los efectos secundarios en las mónadas.
dietbuddha
2
Bueno, algunas personas afirman Haskell no es puramente funcional, ya que permite que cualquier interacción con el mundo exterior (o porque un GHC extensión , unsafePerformIOpermite causando Havok). Otros bromean que Haskell es su lenguaje de programación imperativo favorito. Pero el hecho es que una gran cantidad de código Haskell vive separado de forma limpia IO, no utiliza lagunas no estándar para filtrar los efectos secundarios y es puramente funcional.
1
@thiton no estoy de acuerdo. Las mónadas son construcciones funcionales también; solo se ven imprescindibles debido al azúcar de sintaxis de Haskell (la "notación do"). Cuando desugar mónadas, su naturaleza funcional se hace evidente. Por el contrario, los lenguajes OO son realmente imperativos: en esencia, se basan en la ejecución secuencial de declaraciones.
Andres F.
2

La mayoría de los lenguajes populares de los últimos 50 años han sido diseñados en torno a la arquitectura informática prevalente, llamada arquitectura Von Neumann , en honor a uno de sus creadores, John von Neumann.

Estos idiomas se llaman idiomas imperativos.

En una computadora von Neumaan, tanto los datos como los programas se almacenan en la misma memoria. La CPU que ejecuta las instrucciones está separada de la memoria. Por lo tanto, las instrucciones y los datos deben transmitirse de la memoria a la CPU. Los resultados de las operaciones en la CPU deben volver a la memoria. Casi todas las computadoras digitales construidas desde la década de 1940 se basan en la arquitectura von Neumaan.

anandmon
fuente
1
+1 no estoy seguro de qué tiene que ver esto con la pregunta, pero es una respuesta interesante.
Chuck Conway el
2
¿Qué? ¿Dónde está la parte sobre Imperativo vs Procedimiento, etc.?
bbqchickenrobot
Creo que el punto aquí es que las dudas sobre la estructura del programa (Imperativo, Declarativo, Procesal, Orientado a Objetos, Funcional, etc.) son construcciones de lenguaje, y todos los programas finalmente se procesan en máquinas de arquitectura Von Neumann. Esto es similar a decir que todos los idiomas completos de Turing son equivalentes.
ChuckCottrill
2

Me temo que ninguna de las respuestas dadas hasta ahora captura el núcleo de los conceptos muy bien.

Imperativo, procesal y estructurado no son propiedades mutuamente excluyentes, solo se centran en un solo aspecto de la lógica de modelado.

Imperativo es la contraparte de Imperativo declarativo, básicamente significa que usted le dice a la computadora qué hacer al hacer que ejecute una serie de instrucciones que proporciona. Un programa declarativo, por otro lado, dice qué lograr . En otras palabras, definir pasos versus definir un resultado.

La programación procesal se refiere a la capacidad del procesador (ya sea hardware o un intérprete) para envolver las instrucciones en compuestos, saltar a dicho compuesto y volver al punto después del salto una vez que el compuesto ha sido ejecutado. Esto puede sonar trivial y, según los estándares actuales, lo es, pero necesita un poco de soporte básico en la máquina antes de poder hacer esto: la capacidad de saltar, algún tipo de pila para empujar una dirección que puede aparecer y saltar más tarde y un puntero de pila. Los microprocesadores pronto ofrecieron esta característica, pero se puede imaginar un procesador primitivo que solo es capaz de ejecutar instrucciones que se le suministran secuencialmente, como una cinta perforada o un procesador de tarjeta perforada.

La programación estructurada es el siguiente paso desde la capacidad de saltar a otra instrucción. En última instancia, todo se reduce a saltos, pero si puede tener saltos condicionales, puede crear declaraciones de flujo de control básicas como if-then, for, while, repeat-until y switch. La aplicación de estos se llama programación estructurada.

En cualquier entorno de programación moderno, tendrá todo lo anterior a su disposición y los dará por sentado para que ya no hablemos de ellos como tales. Las propiedades diferenciadoras entre lenguajes se han desplazado durante mucho tiempo a paradigmas de nivel superior, como la programación funcional y orientada a objetos.

Sin embargo, la programación declarativa todavía no es común, principalmente porque siempre será específica del dominio, al menos en cierta medida. No puede tener un lenguaje declarativo de propósito general. Es por eso que todavía estamos atrapados con los llamados lenguajes de tercera generación, donde la programación declarativa o "modelado" se consideraría de cuarta generación.

Martin Maat
fuente