La programación estructurada es un paradigma de programación caracterizado por un código fuente que utiliza una estructura de código fuente basada en bloques para codificar el flujo de control, como la secuencia, la selección (es decir , if-then-else y switch ) y la iteración (es decir, for y while ).
Originalmente, el objetivo principal del movimiento de programación estructurada era eliminar la necesidad y el uso de la instrucción goto . Dado que goto proporciona un control de flujo potente y flexible, puede utilizarse para escribir cualquier algoritmo, por complejo que sea, pero el código resultante suele presentar problemas de calidad importantes , comúnmente descritos como código espagueti . La programación estructurada reemplaza goto con construcciones que tienden a generar un código de mejor calidad. Este paradigma se popularizó y, en gran medida, logró su objetivo de suplantar goto. De hecho, su ubicuidad es tal que, en gran parte del desarrollo de software , es simplemente la forma en que se escribe el código, y ya no es un tema de debate como lo fue en el pasado.
La programación estructurada a veces se asocia con la programación modular, aunque son diferentes. En un sentido general, estructurado implica modularidad y estar escrito para ser eficiente, fácil de entender y modificar, pero este no es el significado estricto de la programación estructurada. [ 1 ]
Tras la popularización de la programación estructurada, el estilo de programación que la precedió pasó a denominarse retroactivamente programación no estructurada . Si bien técnicamente constituye un paradigma de programación, se diferencia de otros en que no fue diseñado intencionadamente. Simplemente representaba el estado del arte antes de que se concibiera la programación estructurada.
Historia
El paradigma surgió a finales de la década de 1950 con la aparición de los lenguajes de programación ALGOL 58 y ALGOL 60 , [ 2 ] incluyendo este último soporte para estructuras de bloques.
Entre los factores que contribuyeron a su popularidad y amplia aceptación, primero en el ámbito académico y luego entre los profesionales, se incluyen la publicación de lo que ahora se conoce como el teorema del programa estructurado en 1966, [ 3 ] y la publicación de la influyente carta abierta " Go To Statement Considered Harmful " en 1968 por el científico informático neerlandés Edsger W. Dijkstra , quien acuñó el término programación estructurada . [ 4 ]
Fundamentos teóricos
El teorema del programa estructurado proporciona la base teórica de la programación estructurada. Afirma que tres formas de combinar programas —secuenciación , selección e iteración— son suficientes para expresar cualquier función computable . Esta observación no se originó con el movimiento de programación estructurada; estas estructuras son suficientes para describir el ciclo de instrucciones de una unidad central de procesamiento , así como el funcionamiento de una máquina de Turing . Por lo tanto, un procesador siempre está ejecutando un "programa estructurado" en este sentido, incluso si las instrucciones que lee de la memoria no forman parte de un programa estructurado. Sin embargo, los autores suelen atribuir el resultado a un artículo de 1966 de Böhm y Jacopini, posiblemente porque Dijkstra citó este artículo él mismo. [ 5 ] El teorema del programa estructurado no aborda cómo escribir y analizar un programa estructurado útil. Estos temas se abordaron durante finales de la década de 1960 y principios de la de 1970, con importantes contribuciones de Dijkstra , Robert W. Floyd , Tony Hoare , Ole-Johan Dahl y David Gries .
Debate
PJ Plauger , uno de los primeros en adoptar la programación estructurada, describió su reacción ante el teorema de la programación estructurada:
Nosotros, los conversos, les mostramos esta interesante noticia a los programadores de lenguaje ensamblador recalcitrantes que seguían presentando intrincados fragmentos de lógica y diciendo: «Apuesto a que no pueden estructurar esto». Ni la demostración de Böhm y Jacopini ni nuestros repetidos éxitos al escribir código estructurado los convencieron antes de lo que estaban preparados para hacerlo. [ 6 ]
Donald Knuth aceptó el principio de que los programas deben escribirse teniendo en cuenta la demostrabilidad, pero no estuvo de acuerdo con la abolición de la instrucción GOTO, y a partir de 2018ha continuado usándolo en sus programas. [ 7 ] En su artículo de 1974, "Programación estructurada con instrucciones Goto", [ 8 ] dio ejemplos donde creía que un salto directo conduce a un código más claro y eficiente sin sacrificar la demostrabilidad. Knuth propuso una restricción estructural más flexible: debería ser posible dibujar el diagrama de flujo de un programa con todas las ramas hacia adelante a la izquierda, todas las ramas hacia atrás a la derecha y ninguna rama que se cruce entre sí. Algunos de los que conocen los compiladores y la teoría de grafos han defendido permitir solo grafos de flujo reducibles .
Los teóricos de la programación estructurada obtuvieron un importante aliado en la década de 1970 cuando el investigador de IBM, Harlan Mills, aplicó su interpretación de la teoría de la programación estructurada al desarrollo de un sistema de indexación para el archivo de investigación de The New York Times . El proyecto fue un gran éxito de ingeniería, y los directivos de otras empresas lo citaron para justificar la adopción de la programación estructurada, aunque Dijkstra criticó las diferencias entre la interpretación de Mills y el trabajo publicado. [ 9 ]
Todavía en 1987 era posible plantear la cuestión de la programación estructurada en una revista de informática. Frank Rubin lo hizo ese año con una carta abierta titulada "'GOTO' considerado perjudicial". [ 10 ] Le siguieron varias objeciones, incluida una respuesta de Dijkstra que criticó duramente tanto a Rubin como las concesiones que otros autores hicieron al responderle.
Resultado
A finales del siglo XX, casi todos los informáticos estaban convencidos de la utilidad de aprender y aplicar los conceptos de programación estructurada. Lenguajes de programación de alto nivel que originalmente carecían de estructuras de programación, como FORTRAN , COBOL y BASIC , ahora las tienen.
Estructuras de control
Según el teorema del programa estructurado , un programa se compone de tres estructuras de control:
- Secuencia
- Las instrucciones ordenadas se ejecutan en secuencia.
- Aunque no forma parte del teorema del programa estructurado, los lenguajes generalmente incluyen un concepto de bloque que agrupa una secuencia de código de manera que se comporta como una sola instrucción. Un lenguaje incluye una forma de marcar una secuencia de instrucciones como un bloque que, a menos que contenga control de flujo, se ejecutará secuencialmente, de arriba a abajo. Por ejemplo, un bloque se encierra entre llaves
{...}en C y otros lenguajes que usan llaves , se encierra enBEGIN...ENDPL /I y Pascal , y se indica mediante sangría en Python . Algunos bloques usan una sintaxis diferente para cada estructura. Por ejemplo, una instrucción if se encierra enif...fiALGOL 68 .
- Selección
- Un bloque (que puede ser una sola instrucción) se ejecuta según el estado del programa. Esta estructura se suele expresar con palabras clave como
if,then, yelse. La instrucción condicional debe tener al menos una ruta de condición verdadera, y cada ruta de condición debe tener un único punto de salida.
- Iteración
- (también conocida como repetición) Un bloque (que puede ser una sola instrucción) se ejecuta repetidamente hasta que el programa alcanza un estado determinado. Esta estructura se suele expresar con palabras clave como
while,repeat,for, odo-until. Aunque la programación estructurada limita el flujo a un único punto de entrada y un único punto de salida, la mayoría de los lenguajes permiten múltiples salidas anticipadas.

Soporte de idiomas
Generalmente, un lenguaje está diseñado para soportar uno o más paradigmas de programación. Sin embargo, aunque un lenguaje no esté diseñado para soportar un paradigma en particular, a menudo puede utilizarse con ese fin. En teoría, cualquier lenguaje puede utilizarse para la programación estructurada. Algunos de los lenguajes utilizados inicialmente para la programación estructurada incluyen ALGOL , Pascal , PL/I , Ada y RPL , pero la mayoría de los nuevos lenguajes de programación procedimental desde entonces han incorporado características para fomentar la programación estructurada, y en ocasiones han omitido deliberadamente algunas características —en particular, GOTO— para evitar sus inconvenientes.
Desviaciones comunes
Aunque el uso de goto ha sido reemplazado en gran medida por construcciones estructuradas, la mayoría de los lenguajes ofrecen características que no son estrictamente consistentes con el teorema de la programación estructurada.
Regreso anticipado
La mayoría de los lenguajes de programación ofrecen una instrucción `return` que permite múltiples puntos de salida anticipada de una función . Dado que una función es un bloque, esta característica contradice el único punto de salida descrito en el teorema.
Salida anticipada
Muchos lenguajes permiten salir de un bloque de forma anticipada (sin usar `return`). Por ejemplo, un bucle puede admitir una instrucción `break` que finaliza el bucle antes de su conclusión. Como describe el teorema, esta lógica de salida anticipada puede eliminarse añadiendo bifurcaciones o comprobaciones, pero esto puede aumentar considerablemente la complejidad. C es un ejemplo temprano y destacado de estas construcciones. Algunos lenguajes más recientes también cuentan con "breaks etiquetados", que permiten salir de más bucles además del más interno.
La necesidad de múltiples salidas puede surgir por diversas razones, la mayoría de las veces porque la función ya no tiene trabajo que hacer (si devuelve un valor, significa que ha completado el cálculo) o porque ha encontrado circunstancias "excepcionales" que le impiden continuar, por lo que se necesita un manejo de excepciones.
Un problema con la salida anticipada es que las instrucciones de limpieza podrían no ejecutarse. Por ejemplo, la memoria asignada no se libera o los archivos abiertos no se cierran, lo que provoca fugas de memoria y de recursos . La limpieza debe realizarse en cada punto de retorno, lo que resulta engorroso y puede generar errores fácilmente. Por ejemplo, en una fase posterior del desarrollo, un desarrollador podría pasar por alto una instrucción de retorno, y una acción que debería realizarse al final de una función (por ejemplo, una instrucción de rastreo ) podría no ejecutarse en todos los casos. Los lenguajes sin instrucción de retorno, como Pascal , Lisp y OCaml , no presentan este problema.
La mayoría de los lenguajes modernos proporcionan soporte a nivel de lenguaje para prevenir tales fugas [ 11 ] (ver administración de recursos ). Como alternativa estructurada al uso de goto y un bloque de limpieza, la protección de desenrollado asegura que cierto código se ejecute cuando la ejecución sale de un bloque; a menudo se implementa en conexión con el manejo de excepciones como un try-finally. Un enfoque alternativo, en C++, es la adquisición de recursos en la inicialización , que utiliza el desenrollado normal de la pila (desasignación de variables) al salir de la función para llamar a los destructores en variables locales para desasignar recursos.
Kent Beck , Martin Fowler y sus coautores han argumentado en sus libros sobre refactorización que las condicionales anidadas pueden ser más difíciles de entender que cierto tipo de estructura más plana que utiliza múltiples salidas predicadas por cláusulas de guarda . Su libro de 2009 afirma rotundamente que "un único punto de salida no es una regla realmente útil. La claridad es el principio clave: si el método es más claro con un único punto de salida, utilice un único punto de salida; de lo contrario, no lo haga". Ofrecen una solución de libro de recetas para transformar una función que consta únicamente de condicionales anidadas en una secuencia de sentencias de retorno (o lanzamiento) protegidas, seguidas de un único bloque no protegido, que está destinado a contener el código para el caso común, mientras que las sentencias protegidas se supone que manejan los casos menos comunes (o con errores). [ 12 ] Herb Sutter y Andrei Alexandrescu también argumentan en su libro de consejos de C++ de 2004 que el único punto de salida es un requisito obsoleto. [ 13 ]
En su libro de texto de 2004, David Watt escribe que "los flujos de control de entrada única y salida múltiple suelen ser deseables". Utilizando el concepto de secuenciador del marco de Tennent , Watt describe uniformemente las estructuras de flujo de control presentes en los lenguajes de programación contemporáneos e intenta explicar por qué ciertos tipos de secuenciadores son preferibles a otros en el contexto de los flujos de control de salida múltiple. Watt escribe que los gotos sin restricciones (secuenciadores de salto) son malos porque el destino del salto no es autoexplicativo para el lector de un programa hasta que este encuentra y examina la etiqueta o dirección real que es el destino del salto. Por el contrario, Watt argumenta que la intención conceptual de un secuenciador de retorno es clara a partir de su propio contexto, sin necesidad de examinar su destino. Watt escribe que una clase de secuenciadores conocidos como secuenciadores de escape , definidos como un "secuenciador que termina la ejecución de un comando o procedimiento que lo contiene textualmente", abarca tanto las interrupciones de bucles (incluidas las interrupciones de varios niveles) como las sentencias de retorno. Watt también señala que, si bien los secuenciadores de salto (gotos) han estado algo restringidos en lenguajes como C, donde el destino debe estar dentro del bloque local o de un bloque externo que lo abarque, esa restricción por sí sola no es suficiente para que la intención de los gotos en C sea autodescriptiva y, por lo tanto, aún pueden producir " código espagueti ". Watt también examina cómo los secuenciadores de excepciones difieren de los secuenciadores de escape y de salto; esto se explica en la siguiente sección de este artículo. [ 14 ]
En contraste con lo anterior, Bertrand Meyer escribió en su libro de texto de 2009 que instrucciones como break y continue "son simplemente el viejo goto disfrazado de oveja" y desaconsejó encarecidamente su uso. [ 15 ]
Manejo de excepciones
Peter Ritchie señala que, en principio, incluso un único lanzamiento justo antes del retorno constituye una violación del principio de salida única, pero argumenta que las reglas de Dijkstra se escribieron en una época anterior a que el manejo de excepciones se convirtiera en un paradigma en los lenguajes de programación, por lo que propone permitir cualquier número de puntos de lanzamiento además de un único punto de retorno. Señala que las soluciones que encapsulan excepciones para crear una única salida tienen una mayor profundidad de anidamiento y, por lo tanto, son más difíciles de comprender, e incluso acusa a quienes proponen aplicar tales soluciones a lenguajes de programación que admiten excepciones de incurrir en un pensamiento de culto al cargo . [ 16 ]
David Watt también analiza el manejo de excepciones en el marco de los secuenciadores (introducidos en este artículo en la sección anterior sobre salidas anticipadas ). Watt señala que una situación anormal (generalmente ejemplificada con desbordamientos aritméticos o fallos de entrada/salida como archivo no encontrado) es un tipo de error que "se detecta en alguna unidad de programa de bajo nivel, pero [para la cual] un manejador se ubica de forma más natural en una unidad de programa de alto nivel". Por ejemplo, un programa podría contener varias llamadas para leer archivos, pero la acción a realizar cuando no se encuentra un archivo depende del significado (propósito) del archivo en cuestión para el programa y, por lo tanto, una rutina de manejo para esta situación anormal no puede ubicarse en el código del sistema de bajo nivel. Watts señala además que introducir pruebas de indicadores de estado en la función que realiza la llamada, como implicaría la programación estructurada de salida única o incluso los secuenciadores de retorno (de múltiples salidas), da como resultado una situación en la que "el código de la aplicación tiende a llenarse de pruebas de indicadores de estado" y que "el programador podría olvidar o descuidar la prueba de un indicador de estado. De hecho, las situaciones anormales representadas por indicadores de estado se ignoran por defecto". Señala que, a diferencia de las pruebas de indicadores de estado, las excepciones tienen el comportamiento por defecto opuesto , lo que provoca que el programa termine a menos que el programador gestione explícitamente la excepción de alguna manera, posiblemente añadiendo código para ignorarla deliberadamente. Basándose en estos argumentos, Watt concluye que los secuenciadores de salto o los secuenciadores de escape (discutidos en la sección anterior) no son tan adecuados como un secuenciador de excepciones dedicado con la semántica descrita anteriormente. [ 17 ]
El libro de texto de Louden y Lambert enfatiza que el manejo de excepciones difiere de las construcciones de programación estructurada como los bucles while porque la transferencia de control "se establece en un punto diferente del programa que aquel donde tiene lugar la transferencia real. En el punto donde realmente ocurre la transferencia, puede que no haya ninguna indicación sintáctica de que el control se transferirá de hecho". [ 18 ] El profesor de informática Arvind Kumar Bansal también señala que en los lenguajes que implementan el manejo de excepciones, incluso las estructuras de control como for, que tienen la propiedad de salida única en ausencia de excepciones, ya no la tienen en presencia de excepciones, porque una excepción puede causar prematuramente una salida temprana en cualquier parte de la estructura de control; por ejemplo, si init()lanza una excepción en for (init(); check(); increm()), entonces no se alcanza el punto de salida habitual después de check(). [ 19 ] Citando múltiples estudios previos de otros (1999-2004) y sus propios resultados, Westley Weimer y George Necula escribieron que un problema significativo con las excepciones es que "crean rutas de flujo de control ocultas que son difíciles de razonar para los programadores". [ 20 ]
La necesidad de limitar el código a puntos de salida únicos aparece en algunos entornos de programación contemporáneos centrados en la computación paralela , como OpenMP . Las diversas construcciones paralelas de OpenMP, como parallel do, no permiten la salida anticipada desde dentro hacia fuera de la construcción paralela; esta restricción incluye todo tipo de salidas, incluidas break y excepciones, pero todas estas están permitidas dentro de la construcción paralela si el destino del salto también está dentro. [ 21 ]
Entrada múltiple
Con relativa poca frecuencia, las funciones permiten múltiples entradas. Lo más común es que esto se reinicie en una corrutina (o generador /semirrutina), donde una función cede el control (y posiblemente un valor), pero puede reanudarse donde se interrumpió. Existen varios usos comunes de este tipo de programación, especialmente para flujos (en particular, de entrada/salida), máquinas de estados y concurrencia. Desde el punto de vista de la ejecución del código, ceder el control desde una corrutina se asemeja más a la programación estructurada que regresar de una función, ya que la función no ha terminado realmente y continuará cuando se la vuelva a llamar; no se trata de una salida anticipada. Sin embargo, las corrutinas implican que múltiples funciones tengan un estado de ejecución, en lugar de una única pila de llamadas de funciones, lo que introduce una complejidad diferente.
Es raro que las funciones permitan el acceso a una posición arbitraria dentro de la función, ya que en este caso el estado del programa (como los valores de las variables) no está inicializado o es ambiguo, y esto es similar a un goto.
Máquinas de estados
Algunos programas, en particular los analizadores sintácticos y los protocolos de comunicación , tienen varios estados que se suceden de una manera que no se reduce fácilmente a las estructuras básicas, y algunos programadores implementan los cambios de estado con un salto al nuevo estado. Este tipo de cambio de estado se usa frecuentemente en el núcleo de Linux. [ 22 ]
Sin embargo, es posible estructurar estos sistemas convirtiendo cada cambio de estado en una función independiente y utilizando una variable para indicar el estado activo (véase trampolín ). Alternativamente, pueden implementarse mediante corrutinas, que prescinden del trampolín.
Véase también
Referencias
Citas
- ↑ "¿Qué es la programación estructurada?" . Calidad del software . Consultado el 09/04/2024 .
- ↑ Clark, Leslie B. Wilson, Robert G.; Robert, Clark (2000). Lenguajes de programación comparativos (3.ª ed.). Harlow, Inglaterra: Addison-Wesley. pág. 20. ISBN 9780201710120Archivado del original el 26 de noviembre de 2015. Consultado el 25 de noviembre de 2015 .
{{cite book}}: CS1 maint: varios nombres: lista de autores ( enlace ) - ↑ Böhm y Jacopini 1966 .
- ↑ Dijkstra 1968 , p. 147, "El uso indiscriminado de la instrucción `go to` tiene como consecuencia inmediata que resulta sumamente difícil encontrar un conjunto de coordenadas significativo para describir el progreso del proceso. ... La instrucción `go to`, tal como está, es demasiado primitiva; es una invitación a que el programa se convierta en un desastre."
- ↑ Dijkstra 1968 .
- ↑ Plauger, PJ (12 de febrero de 1993). Programming on Purpose, Essays on Software Design (1.ª ed.). Prentice-Hall. pág . 25. ISBN 978-0-13-721374-0.
- ↑ DLS • Donald Knuth • Todas las preguntas respondidas . YouTube . Universidad de Waterloo. 15 de noviembre de 2018. 48 minutos . Consultado el 24 de julio de 2022 .
- ↑ Donald E. Knuth (diciembre de 1974). "Programación estructurada con instrucciones go to" (PDF) . Computing Surveys . 6 (4): 261–301 . doi : 10.1145/356635.356640 . S2CID 207630080. Archivado del original (PDF) el 23 de octubre de 2013.
- ↑ En EWD1308, "Lo que llevó a "Notas sobre programación estructurada"" .En un artículo fechado el 10 de junio de 2001, Dijkstra escribe: "Al parecer, a IBM no le gustó la popularidad de mi texto; robó el término "Programación Estructurada" y, bajo su amparo, Harlan D. Mills trivializó el concepto original hasta la abolición de la instrucción goto".
- ↑ Frank Rubin (marzo de 1987) ."GOTO Considered Harmful" Considered Harmful" (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.
- ↑ Elder, Matt; Jackson, Steve; Liblit, Ben (octubre de 2008). Code Sandwiches (PDF) (Informe técnico). Universidad de Wisconsin-Madison . 1647.
- ↑ Jay Fields; Shane Harvie; Martin Fowler; Kent Beck (2009). Refactoring: Ruby Edition . Pearson Education. pp. 274–279 . ISBN 978-0-321-60350-0.
- ↑ Herb Sutter; Andrei Alexandrescu (2004). Estándares de codificación de C++: 101 reglas, directrices y mejores prácticas . Pearson Education. ISBN 978-0-13-265442-5
Ejemplo 4: Entrada única, salida única ("SESE"). Históricamente, algunos estándares de codificación exigían que cada función tuviera exactamente una salida, es decir, una instrucción de retorno. Este requisito es obsoleto en lenguajes que admiten excepciones y destructores, donde las funciones suelen tener numerosas salidas implícitas
. - ↑ Watt y Findlay 2004 , págs. 215–221.
- ↑ Bertrand Meyer (2009). Un toque de distinción: Aprender a programar bien con objetos y contratos . Springer Science & Business Media. pág. 189. ISBN 978-3-540-92144-8.
- ↑ "¿Entrada única, salida única, debería seguir siendo aplicable en lenguajes orientados a objetos?" . Blog MVP de Peter Ritchie . 7 de marzo de 2008. Archivado del original el 14 de noviembre de 2012. Consultado el 15 de julio de 2014 .
- ↑ Watt y Findlay 2004 , págs. 221–222.
- ↑ Kenneth C. Louden; Kenneth A. Lambert (2011). Lenguajes de programación: Principios y prácticas (3.ª ed.). Cengage Learning. pág. 423. ISBN 978-1-111-52941-3.
- ↑ Arvind Kumar Bansal (2013). Introducción a los lenguajes de programación . CRC Press. pág. 135. ISBN 978-1-4665-6514-2.
- ↑ Weimer, W. y Necula, GC (2008). «Situaciones excepcionales y fiabilidad de los programas» (PDF) . ACM Transactions on Programming Languages and Systems . 30 (2). 8:27. doi : 10.1145/1330017.1330019 . S2CID 3136431. Archivado del original (PDF) el 23 de septiembre de 2015.
- ↑ Rohit Chandra (2001). Programación paralela en OpenMP . Morgan Kaufmann. pág. 45. ISBN 978-1-55860-671-5.
- ↑ Sidney Amani; P. Chubb; Alastair F. Donaldson; Alexander Legg; L. Ryzhyk; Yanjin Zhu (2012). "Verificación automática de controladores de dispositivos basados en mensajes". Taller internacional sobre verificación de software de sistemas . págs. 4–17 . arXiv : 1211.6185 . doi : 10.4204/EPTCS.102.3 .
Fuentes
- Edsger Dijkstra , Notas sobre programación estructurada , pág. 6.
- Böhm, Corrado ; Jacopini, Giuseppe (mayo de 1966). " Diagramas de flujo, máquinas de Turing y lenguajes con solo dos reglas de formación" ( PDF) . Communications of the ACM . 9 (5): 366–371 . CiteSeerX 10.1.1.119.9119 . doi : 10.1145/355592.365646 . S2CID 10236439. Archivado (PDF) del original el 23 de septiembre de 2015.
- Dijkstra, Edsger W. (marzo de 1968). "Cartas al editor: Ir a la declaración considerada dañina" (PDF) . Communications of the ACM . 11 (3): 147– 148. doi : 10.1145/362929.362947 . ISSN 0001-0782 . S2CID 17469809 .
- Michael A. Jackson , Principios del diseño de programas , Academic Press, Londres, 1975.
- O.-J. Dahl , E.W. Dijkstra , C.A. Hoare , Programación Estructurada , Academic Press, Londres, 1972. ISBN 0-12-200550-3.
- Este volumen incluye una versión ampliada de las Notas sobre Programación Estructurada , mencionadas anteriormente, que incluye un ejemplo extendido del uso del enfoque estructurado para desarrollar un algoritmo de retroceso para resolver el problema de las 8 reinas .
- Una versión en PDF está disponible en la serie de libros clásicos de ACM.
- Cabe destacar que el tercer capítulo de este libro, escrito por Dahl, describe un enfoque fácilmente reconocible como Programación Orientada a Objetos. Puede considerarse otra forma de estructurar un programa de manera útil para demostrar su corrección.
- Watt, David Anthony; Findlay, William (2004). Conceptos de diseño de lenguajes de programación . John Wiley & Sons. ISBN 978-0-470-85320-7.
Enlaces externos
- BPStruct : una herramienta para estructurar sistemas concurrentes (programas, modelos de procesos).
- J. Darlinton; M. Ghanem; HW To (1993), "Programación paralela estructurada", En Modelos de programación para computadoras masivamente paralelas. IEEE Computer Society Press. 1993 : 160–169 , CiteSeerX 10.1.1.37.4610
- paradigmas de programación
- Holismo