¿Quién creó la (s) idea (s) de las primeras construcciones de bucle?


53
while (1) {
      if (1+1==2) {
             print "Yes, you paid attention in Preschool!";
      } else {
             print "Wait... I thought 1+1=2";
      }
 }

Como desarrollador, todos tenemos que usar bucles con mucha frecuencia. Lo sabemos. Lo que me preguntaba era, ¿quién pensó en la idea de tener bucles? ¿Qué idioma introdujo los bucles? ¿Cuál fue la primera construcción de bucle? ¿Fue un whilebucle? Un forbucle? etc?


22
Charles Babbage y Ada Lovelace, muy probablemente.
mcfinnigan

28
Fue inventado en las instrucciones de champú, enjuague, espuma, repita. :-)
Guy Sirton

13
@GuySirton, no seas tonto, eso es recurrencia.
mowwwalker

18
@ user838584: si se tratara de una recursión, cada uno repeatinvocaría a otro repeat; nunca terminaría. Creo que tal vez las mujeres leen las instrucciones del champú de esa manera, pero los hombres lo leen como una iteración, y solo necesitan unos minutos para lavarse el cabello.
Steve314

3
Una computadora sin bucles es una calculadora.
starblue

Respuestas:


102

Como señalaron Mouviciel y Emilio Garavaglia , el concepto es anterior a la informática. Sin embargo, la primera instancia de un bucle de software fue el bucle que Ada Lovelace utilizó para calcular los números de Bernoulli , como se describe en la Nota G de su traducción del Boceto del motor analítico inventado por Charles Babbage , de LF Menabrea . Menabrea observó la capacidad del bucle analítico de bucle desde el principio:

Entendiendo esto, permítannos, al comienzo de la serie de operaciones que deseamos ejecutar, colocar la aguja C en la división 2, la aguja B en la división 5 y la aguja A en la división 9. Permitamos martillo de la esfera C para golpear; Golpeará dos veces y, al mismo tiempo, la aguja B pasará sobre dos divisiones. Este último indicará el número 7, que sucede al número 5 en la columna de primeras diferencias. Si ahora permitimos que el martillo del dial B golpee a su vez, golpeará siete veces, durante las cuales la aguja A avanzará siete divisiones; estos agregados a los nueve ya marcados por él darán el número 16, que es el número cuadrado consecutivo a 9. Si ahora reiniciamos estas operaciones, comenzando con la aguja C, que siempre se debe dejar en la división 2,

El mecanismo de bucle del motor analítico se hereda directamente del telar mecánico de Joseph Marie Jacquard (1801), como se señala en las memorias de Menabrea:

Ahora se preguntará cómo la máquina puede por sí misma y, sin recurrir a la mano del hombre, asumir las disposiciones sucesivas adecuadas para las operaciones. La solución de este problema se ha tomado del aparato de Jacquard, utilizado para la fabricación de productos brocados, de la siguiente manera:

Dos especies de hilos generalmente se distinguen en materiales tejidos; uno es el hilo de urdimbre o longitudinal, el otro el hilo de urdimbre o transversal, que es transportado por el instrumento llamado lanzadera, y que cruza el hilo o urdimbre longitudinal. Cuando se requiere un material brocado, es necesario a su vez evitar que ciertos hilos crucen el tejido, y esto de acuerdo con una sucesión que está determinada por la naturaleza del diseño que se va a reproducir. Anteriormente, este proceso era largo y difícil, y era necesario que el trabajador, al ocuparse del diseño que debía copiar, regulara él mismo los movimientos que debían tomar los hilos. De allí surgió el alto precio de esta descripción de productos, especialmente si los hilos de varios colores entraron en la tela. Para simplificar esta fabricación, Jacquard ideó el plan de conectar cada grupo de hilos que debían actuar juntos, con una palanca distinta perteneciente exclusivamente a ese grupo. Todas estas palancas terminan en varillas, que están unidas en un solo paquete, que generalmente tiene la forma de un paralelepípedo con una base rectangular. Las varillas son cilíndricas y están separadas entre sí por pequeños intervalos. El proceso de elevar los hilos se resuelve así en el movimiento de estos diversos brazos de palanca en el orden requerido. Para lograr esto, se toma una hoja rectangular de cartón, algo más grande que una sección del paquete de brazos de palanca. Si esta hoja se aplica a la base del paquete y luego se comunica un movimiento de avance al cartón, este último moverá con él todas las barras del paquete, y, en consecuencia, los hilos que están conectados con cada uno de ellos. Pero si el cartón, en lugar de ser liso, se perforara con agujeros correspondientes a las extremidades de las palancas que lo unen, entonces, dado que cada una de las palancas pasaría a través del cartón durante el movimiento de este último, todos permanecerían en su lugares. Por lo tanto, vemos que es fácil determinar la posición de los agujeros en el cartón, que, en cualquier momento, habrá un cierto número de palancas, y en consecuencia de paquetes de hilos, levantados, mientras que el resto permanece donde fueron. Suponiendo que este proceso se repita sucesivamente de acuerdo con una ley indicada por el patrón a ejecutar, percibimos que este patrón puede reproducirse en el material. Para este propósito solo necesitamos componer una serie de tarjetas de acuerdo con la ley requerida, y organizarlos en el orden adecuado uno tras otro; luego, al hacer que pasen sobre una viga poligonal que está tan conectada como para girar una nueva cara por cada golpe del transbordador, dicha cara se impulsará paralelamente contra el haz de brazos de palanca, la operación de elevar el los hilos se realizarán regularmente. Así, vemos que los tejidos brocados pueden fabricarse con una precisión y rapidez anteriormente difíciles de obtener.

El telar de Jacquard es una aplicación muy temprana de un bucle en el contexto de ordenar una máquina para producir una salida repetida :

La idea detrás del telar Jacquard era un sistema de tarjetas perforadas y ganchos. Las tarjetas se hicieron muy gruesas y tenían agujeros rectangulares perforados en ellas. Los ganchos y agujas utilizados en el tejido fueron guiados por estos agujeros en el cartón. Cuando los ganchos entraron en contacto con la tarjeta, se mantuvieron estacionarios a menos que se encontrara con uno de los agujeros perforados. Luego, el gancho pudo pasar a través del orificio con una aguja insertando otro hilo, formando así el patrón deseado. Se lograron patrones intrincados al tener muchas tarjetas organizadas una tras otra y / o utilizadas repetidamente.

El telar de Jacquard también se reconoce como una forma muy temprana de un programa almacenado :

Si el impulso detrás de gran parte del desarrollo de las máquinas de cálculo discutido hasta ahora había surgido de la computación numérica, la motivación que condujo a la primera forma de `` programa almacenado '' fue provenir de una fuente muy diferente: la industria textil. Hemos visto anteriormente que uno de los aspectos fundamentales de los sistemas computacionales es el concepto de representar información y, aunque no lo hemos hecho explícitamente, la aplicación de esta idea se puede discernir en todos los artefactos que hemos examinado hasta ahora: en el desarrollo de representaciones escritas para valores numéricos y los paralelos mecánicos que surgieron de estos. Por lo tanto, la alineación de los guijarros en un marco de ábaco, la yuxtaposición de escalas móviles en una regla de cálculo y la configuración de engranajes dentados en los dispositivos de Schickard, Pascal y Leibniz, Todos son ejemplos de técnicas de representación que buscan simplificar los procesos complejos que subyacen a las tareas aritméticas. Sin embargo, existen categorías de información y representaciones de la misma, distintas del número sobre el cual se pueden realizar procesos computacionales. La tecnología de tejido desarrollada por Joseph-Marie Jacquard en 1801 ilustra un ejemplo de dicha categoría.

Charles Babbage también adaptó el procedimiento de almacenamiento de Jacquard en el motor analítico , la presencia o ausencia de un agujero comunicaba un simple comando de encendido y apagado a la máquina:

El motor analítico tiene muchas características esenciales que se encuentran en la computadora digital moderna. Era programable usando tarjetas perforadas, una idea tomada del telar Jacquard utilizado para tejer patrones complejos en textiles. El motor tenía una 'Tienda' donde se podían mantener números y resultados intermedios, y un 'Molino' separado donde se realizaba el procesamiento aritmético. Tenía un repertorio interno de las cuatro funciones aritméticas y podía realizar multiplicación y división directa. También era capaz de funciones para las que tenemos nombres modernos: ramificación condicional, bucle (iteración), microprogramación, procesamiento paralelo, iteración, enclavamiento, sondeo y modelado de pulsos, entre otros, aunque Babbage en ninguna parte usó estos términos. Tenía una variedad de resultados que incluían impresión impresa, tarjetas perforadas,

Las ramas condicionales del motor analítico combinadas con los bucles mecánicos inspirados en Jacquard y el procedimiento de almacenamiento son abrumadoramente similares (conceptualmente) a su ejemplo, especialmente si agregamos la impresora Babbage a la mezcla, para las print "...";partes.

Obviamente, los bucles mecánicos son anteriores al telar de Jacquard, el primer dispositivo conocido que funciona de manera circular es el mecanismo Antikythera (100 aC), y si miramos aún más en la historia (y nos aventuramos terriblemente fuera del tema), los relojes de sol son probablemente los mecanismos más antiguos creados por el hombre. donde es evidente la comprensión de los bucles, siguiendo, por supuesto, el patrón repetitivo de las órbitas del sol y de otros cuerpos estelares.

Sin embargo, creo que en el contexto de la informática (y no el cálculo ni nada más), el algoritmo de cálculo de números de Analytical Engine y Bernoulli de Ada puede acreditarse para introducir bucles, compartiendo al menos parte del crédito con el telar de Jacquard, habiendo adaptado directamente el concepto de eso.


3
Antes del telar de Jacquard, puede encontrar bucles mecánicos en carillones, como el de Brujas, donde las campanas se controlan mediante la rotación de un cilindro .
mouviciel

66
@ Mouviciel Veo tu monstruosidad de campana y te levanto un mecanismo Antikythera. ; P
yannis

2
¡+1 por su respuesta enciclopédica, incluida una computadora de 2000 años!
mouviciel

2
Esta hermosa respuesta me hizo la pregunta favorita. No solo responde la pregunta, sino que se presenta como un ejemplo de "cómo responder una pregunta". Buen trabajo, querido señor.
Chani

¡Acepté esta respuesta porque era concluyente, enciclopédica y simplemente increíble!
Dinámico

50

Los bucles son anteriores a la informática. Puedes encontrarlos en notación musical ya desde el canto gregoriano:

repetir signo


2
Esta puede ser una gran respuesta si se le agrega un poco más de detalle. Aún así, buen trabajo.
Dinámico

Proporcione más referencias (fecha más temprana, notación musical más temprana para presentar construcciones de bucle / repetición)
Skippy Fastol

@SkippyFastol Está en ese artículo: en.wikipedia.org/wiki/Repeat_sign#Other_notation
cwallenpoole

32

El concepto de "hacerlo de nuevo" es de alguna manera "primitivo" para la percepción humana. Puede decirle esto a un niño que acaba de elaborar una comprensión mínima del lenguaje natural.

En sistemas discretos, los bucles se encuentran en todas las máquinas de estados finitos cuando admite que puede alcanzar un estado que ya ha estado antes .

El ciclo más simple es el ciclo entre dos estados (un reloj). Dado que cualquier número mayor de estados puede resultar de un recuento, cada máquina más compleja se construye sobre un "contador" incrementado por un reloj que puede hacer "saltar" sobre ciertas banderas que representan ciertas operaciones combinadas. Este es el núcleo de una máquina Von Neumann en la que se basa cada computadora basada en microprocesador.

En el código de máquina, se codifica un salto JP-Z-nnnn(donde Z es el indicador de cuál es la base de su condición). En un lenguaje de nivel superior, esto se traduce casi de inmediato a

if(z) goto x;

Un bucle no es más que un lugar gotodonde la etiqueta x precede a la instrucción goto misma.

Cualquier otra formulación (for, do, while, etc.) es solo "azúcar sintáctico" para domesticar mejor el goto salvaje en los casos muy comunes de repetición hasta que algo sucede


4

El concepto de bucle es una de las cosas que distingue a una computadora en toda regla de una máquina de calcular simple. Si un sistema no admite bucles, entonces no está completo y, por lo tanto, no es una computadora.

El primer diseño completo de Turing fue el motor analítico de Babbage , por lo que debe haber tenido un concepto de bucle. Sin embargo, hay sistemas que tienen bucles pero no están completos de Turing (porque omiten algo más). Sin embargo, el trabajo de Babbage es probablemente un buen punto de partida.


66
El cálculo lambda no tiene bucles (ni condiciones ni saltos), pero está completo. La recursión es tan poderosa como la iteración.

3
puede reescribir cualquier bucle a una función recursiva y eliminar bucles
frenético de trinquete

55
El artículo de wikipedia sobre bucles describe la recursividad como una forma de expresar un bucle, en lugar de un concepto completamente no relacionado. es.wikipedia.org/wiki/Program_loop#Loops En cuanto a las CPU que no tienen bucles, sí tienen las herramientas necesarias para implementarlas (saltar a una dirección de memoria arbitraria)
GordonM

8
Precisamente, la recursión puede usarse para expresar bucles. Que es un concepto muy diferente, a pesar de que son isomorfos entre sí. Una taza de café no es un donut solo porque los topólogos supuestamente los confunden.

44
Es cierto, pero cualquier sistema completo de turing debe tener una forma de expresar el concepto de realizar la misma secuencia varias veces, el mecanismo puede ser recursivo o saltar hacia atrás en la lista de instrucciones o cualquier otra cosa que logre el mismo efecto. Si un sistema no proporciona ninguna forma de repetir un conjunto de instrucciones (aparte de repetir físicamente las instrucciones de la lista), entonces no puede completarse. El motor analítico estaba Turing completo, por lo que debe implementar el bucle de una forma u otra.
GordonM

3

Suponiendo que se refiere a lenguajes de programación de texto modernos.

Algol60 tiene "FOR", "DO", "UNTIL" y "WHILE", por lo que fue antes de 1960.

El Museo de Computación Retro tiene algunos idiomas antes de 1960.

Kvikkalkul , el lenguaje de los años 50 para la programación de submarinos nucleares suecos solo tiene GOTO. (Sin embargo, Kvikkalkul es casi seguramente un engaño de los años 90, no un lenguaje histórico real).

Plankalkül de Konrad Zuse es lo primero que pude encontrar. Tiene una construcción "für".


Plankalkül fue esencialmente inédito hasta tiempos recientes, y se ha rumoreado que Kvikkalkul era un engaño. En ese sentido, el crédito probablemente debe ir a John Backus y al equipo FORTRAN , que tenía un compilador en funcionamiento en el campo en 1957, con DObucles.
Ross Patterson

2

El trabajo de Liebniz y Newton contiene algoritmos con construcciones de bucle. Liebniz construyó una calculadora mecánica y especuló (como lo hizo Lovelace años después) sobre una máquina para realizar análisis más sofisticados. Sus notas sobre estas ideas son incompletas, pero describen la lógica estructurada con bucles.

Sin embargo, la idea de secuencias de repetición y recuento de bucles controlados, así como lo que llamaríamos mientras que los bucles se discuten en el trabajo del hombre para el que se nombran los algoritmos: Muhammad ibn Musa al-Khwarizmi del siglo IX. Newton, Liebniz, Babbage, Lovelace, Lovelace, Lovelace, etc. .

Por supuesto, al-Khwarizmi confió, en parte, en los antiguos griegos. En algún momento, probablemente regresemos a la versión de enjuague, espuma y repetición de Adán y Eva.

Para más información sobre Al-Khwārizmī y su trabajo, ver:

http://www-groups.dcs.st-andrews.ac.uk/history/Mathematicians/Al-Khwarizmi.html

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.