Chi ha creato l'idea / i dei costrutti del primo ciclo?


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

Come sviluppatore, noi tutti abbiamo di utilizzare i cicli molto di frequente. Lo sappiamo. Quello che mi chiedevo era, chi pensava all'idea di avere dei loop? Quale lingua ha introdotto i loop? Qual è stato il primo costrutto loop? Era un whileciclo? Un forciclo? eccetera?


22
Charles Babbage e Ada Lovelace, molto probabilmente.
Mcfinnigan,

28
È stato inventato nelle istruzioni di shampoo, risciacquo, schiuma, ripetizione. :-)
Guy Sirton,

13
@GuySirton, non essere sciocco, questa è la ricorsione.
mowwwalker,

18
@ user838584 - se fosse una ricorsione, ognuno repeatinvocherebbe un altro repeat- non finiresti mai. Penso che forse le donne leggano le istruzioni dello shampoo in quel modo, ma gli uomini lo leggono come iterazione e hanno solo bisogno di pochi minuti per lavarsi i capelli.
Steve314,

3
Un computer senza loop è una calcolatrice.
Starblue,

Risposte:


102

Come hanno notato mouviciel ed Emilio Garavaglia , il concetto precede l'informatica. Tuttavia, la prima istanza di un ciclo software è stata il ciclo utilizzato da Ada Lovelace per calcolare i numeri di Bernoulli , come descritto nella Nota G della sua traduzione dello Sketch of the Analytical Engine inventata da Charles Babbage , da LF Menabrea . La capacità del ciclo analitico del motore analitico è nota all'inizio di Menabrea:

A questo proposito, all'inizio della serie di operazioni che desideriamo eseguire, posizioniamo l'ago C sulla divisione 2, l'ago B sulla divisione 5 e l'ago A sulla divisione 9. Consentiamo il martello del quadrante C per colpire; colpirà due volte e allo stesso tempo l'ago B passerà su due divisioni. Quest'ultimo indicherà quindi il numero 7, che subentra al numero 5 nella colonna delle prime differenze. Se ora permettiamo al martello del quadrante B di colpire a sua volta, colpirà sette volte, durante il quale l'ago A avanzerà di sette divisioni; questi aggiunti ai nove già contrassegnati da esso daranno il numero 16, che è il numero quadrato consecutivo a 9. Se ora ricominciamo queste operazioni, iniziando con l'ago C, che deve sempre essere lasciato sulla divisione 2,

Il meccanismo di looping del motore analitico è direttamente ereditato dal telaio meccanico di Joseph Marie Jacquard (1801), come osservato nel libro di memorie di Menabrea:

Si chiederà ora come la macchina può di per sé, e senza ricorrere alla mano dell'uomo, assumere le disposizioni successive adatte alle operazioni. La soluzione di questo problema è stata presa dall'apparato di Jacquard, utilizzato per la fabbricazione di materiale broccato, nel modo seguente: -

Di solito si distinguono due specie di fili in tessuti; uno è il filo di ordito o longitudinale, l'altro il filo o filo trasversale, che viene convogliato dallo strumento chiamato navetta e che attraversa il filo o ordito longitudinale. Quando è necessario un materiale broccato, è necessario a sua volta impedire ad alcuni fili di attraversare la trama, e questo secondo una successione determinata dalla natura del disegno che deve essere riprodotto. In precedenza questo processo era lungo e difficile, ed era necessario che il lavoratore, prestando attenzione al disegno che doveva copiare, dovesse regolare lui stesso i movimenti che i fili dovevano prendere. Da qui nacque il prezzo elevato di questa descrizione delle cose, specialmente se filati di vari colori entrassero nel tessuto. Per semplificare questa fabbricazione, Jacquard ha ideato il piano di collegamento di ciascun gruppo di fili che dovevano agire insieme, con una leva distinta appartenente esclusivamente a quel gruppo. Tutte queste leve terminano in aste, che sono unite in un unico fascio, che di solito ha la forma di un parallelopipedo con una base rettangolare. Le aste sono cilindriche e sono separate l'una dall'altra da piccoli intervalli. Il processo di sollevamento dei fili viene così risolto in quello di spostare questi vari bracci a leva nell'ordine richiesto. Per fare ciò, viene preso un foglio rettangolare di cartone, di dimensioni leggermente maggiori rispetto a una sezione del fascio di bracci a leva. Se questo foglio viene applicato alla base del fascio e un movimento di avanzamento viene quindi comunicato al cartone, quest'ultimo si sposterà con esso tutte le aste del fascio, e di conseguenza i thread che sono collegati a ciascuno di essi. Ma se i pannelli di cartone, anziché essere semplici, fossero perforati con fori corrispondenti alle estremità delle leve che lo incontrano, allora, poiché ciascuna delle leve passerebbe attraverso il pannello di cartone durante il movimento di quest'ultimo, rimarrebbero tutti nel loro posti. Vediamo quindi che è facile determinare la posizione dei fori nel cartone, che, in un dato momento, deve esserci un certo numero di leve, e conseguentemente di pacchi di fili, sollevati, mentre gli altri rimangono dove sono erano. Supponendo che questo processo venga ripetuto successivamente secondo una legge indicata dal modello da eseguire, percepiamo che questo modello può essere riprodotto sul materiale. A tal fine dobbiamo semplicemente comporre una serie di carte secondo la legge richiesta, e disporli in ordine adeguato uno dopo l'altro; quindi, facendoli passare sopra una trave poligonale che è così connessa da trasformare una nuova faccia per ogni colpo della navetta, la quale faccia deve quindi essere spinta parallelamente a se stessa contro il fascio di bracci a leva, l'operazione di sollevamento del i thread verranno eseguiti regolarmente. Quindi vediamo che i tessuti broccati possono essere fabbricati con una precisione e una rapidità precedentemente difficili da ottenere.

Il telaio di Jacquard è un'applicazione molto precoce di un ciclo nel contesto dell'ordinazione di una macchina per produrre un risultato ripetuto :

L'idea alla base del telaio Jacquard era un sistema di schede perforate e ganci. Le carte erano molto spesse e avevano dei fori rettangolari. I ganci e gli aghi utilizzati nella tessitura erano guidati da questi fori nel cartone. Quando i ganci sono entrati in contatto con la carta sono stati tenuti fermi a meno che non incontrasse uno dei fori. Quindi il gancio è stato in grado di passare attraverso il foro con un ago inserendo un altro filo, formando così il motivo desiderato. Modelli complessi sono stati raggiunti disponendo molte carte disposte una dopo l'altra e / o usate ripetutamente.

Il telaio di Jacquard è anche riconosciuto come una forma molto antica di un programma memorizzato :

Se l'impulso dietro gran parte dello sviluppo delle macchine calcolatrici discusso finora era derivato dal calcolo numerico, la motivazione che ha portato alla prima forma di "programma memorizzato" doveva provenire da una fonte molto diversa: l'industria tessile. Abbiamo visto in precedenza che uno degli aspetti fondamentali dei sistemi computazionali è il concetto di rappresentazione delle informazioni e, sebbene non l'abbiamo fatto esplicitamente, l'applicazione di questa idea può essere individuata in tutti i manufatti che abbiamo esaminato finora: nello sviluppo di rappresentazioni scritte per valori numerici e parallelismi meccanici che ne sono derivati. Pertanto, l'allineamento dei ciottoli su un telaio di abaco, la giustapposizione di scale mobili su una regola di scorrimento e la configurazione di ingranaggi dentati sui dispositivi di Schickard, Pascal e Leibniz, sono tutti esempi di tecniche di rappresentazione che cercano di semplificare i complessi processi alla base delle attività aritmetiche. Vi sono, tuttavia, categorie di informazioni e loro rappresentazioni, oltre al numero su cui è possibile eseguire processi computazionali. La tecnologia di tessitura sviluppata da Joseph-Marie Jacquard nel 1801 illustra un esempio di tale categoria.

Charles Babbage ha anche adattato la procedura di memorizzazione di Jacquard nel motore analitico , la presenza o l'assenza di un foro comunicava un semplice comando on-off alla macchina:

Il motore analitico ha molte funzionalità essenziali presenti nel moderno computer digitale. Era programmabile usando le schede perforate, un'idea presa in prestito dal telaio Jacquard utilizzato per tessere modelli complessi nei tessuti. Il motore aveva un "negozio" in cui potevano essere conservati numeri e risultati intermedi e un "mulino" separato in cui veniva eseguita l'elaborazione aritmetica. Aveva un repertorio interno delle quattro funzioni aritmetiche e poteva eseguire la moltiplicazione e la divisione diretta. Era anche in grado di funzioni per le quali abbiamo nomi moderni: diramazione condizionale, looping (iterazione), microprogrammazione, elaborazione parallela, iterazione, latching, polling e modulazione di impulsi, tra gli altri, sebbene Babbage non abbia mai usato questi termini. Aveva una varietà di uscite tra cui stampa cartacea, schede perforate,

I rami condizionali del motore analitico combinati con i circuiti meccanici ispirati a Jacquard e la procedura di conservazione sono spaventosamente simili (concettualmente) al tuo esempio, specialmente se aggiungiamo la stampante di Babbage alla miscela, per le print "...";parti.

Ovviamente i circuiti meccanici precedono il telaio di Jacquard, il primo dispositivo noto a funzionare in modo circolare è il meccanismo Antikythera (100 a.C.), e se guardiamo ancora più avanti nella storia (e ci avventuriamo in modo orribile fuori tema), le meridiane sono probabilmente i più antichi meccanismi creati dall'uomo dove è evidente la comprensione dei cicli, seguendo ovviamente lo schema ripetitivo delle orbite del sole e di altri corpi stellari.

Tuttavia, penso che nel contesto dell'informatica (e non del calcolo o di altro), all'analitico algoritmo di calcolo dei numeri del motore analitico e di Bernoulli di Ada si possano attribuire dei loop, condividendo almeno parte del merito con il telaio di Jacquard, avendo direttamente adattato il concetto da esso.


3
Prima del telaio di Jacquard, puoi trovare anelli meccanici nei carillon, come quello di Bruges, dove le campane sono controllate dalla rotazione di un cilindro .
mouviciel,

6
@mouviciel Vedo la tua mostruosità di campana e ti sollevo un meccanismo Antikythera. ; P
yannis,

2
+1 per la tua risposta enciclopedica, incluso un computer 2000 y / o!
mouviciel,

2
questa bellissima risposta mi ha reso la domanda preferita. Non solo risponde alla domanda, ma rappresenta un esempio di "come rispondere a una domanda". Ottimo lavoro, caro signore.
Chani,

Ho accettato questa risposta perché era sia conclusivo, enciclopedico, sia semplicemente fantastico!
Dinamico


32

Il concetto di "rifarlo" è in qualche modo "primitivo" alla percezione umana. Puoi dirlo a un bambino che ha appena elaborato una comprensione minima del linguaggio naturale.

Nei sistemi discreti i loop si trovano in tutte le macchine a stati finiti quando ammetti di poter raggiungere uno stato in cui sei già stato .

Il ciclo più semplice è il ciclo tra due stati (un orologio). Dato che qualsiasi numero più elevato di stati può derivare da un conteggio da esso, ogni macchina più complessa viene eseguita su un "contatore" incrementato da un orologio che può far "saltare" su determinati flag che rappresentano determinate operazioni combinatorie. Questo è il nucleo di una macchina Von Neumann su cui si basa ogni computer basato su microprocessore.

Nel codice macchina, un salto è codificato JP-Z-nnnn(dove Z è la bandiera più bianca su cui basare la propria condizione). In un linguaggio di livello superiore questo si traduce quasi immediatamente in

if(z) goto x;

Un ciclo non è altro che un punto in gotocui l'etichetta x precede l'istruzione goto stessa.

Ogni altra formulazione (per, fare, mentre, ecc.) È solo "zucchero sintattico" per addomesticare meglio il goto selvaggio nei casi molto comuni di ripetizione fino a quando succede qualcosa


4

Il concetto di looping è una delle cose che distinguono un computer completo da una semplice macchina calcolatrice. Se un sistema non supporta il looping, allora non è completo e quindi non è un computer.

Il primo progetto completo di Turing fu il motore analitico di Babbage , quindi doveva avere un concetto di looping. Tuttavia, ci sono sistemi che hanno un ciclo ma non sono completi di Turing (perché omettono qualcos'altro). Il lavoro di Babbage è probabilmente un buon punto di partenza, però.


6
Il calcolo lambda non ha loop (né condizioni o salti), ma è completo. La ricorsione è potente quanto l'iterazione.

3
puoi riscrivere qualsiasi loop in una funzione ricorsiva ed eliminare i loop
maniaco del cricchetto,

5
L'articolo di wikipedia sui loop descrive la ricorsione come un modo di esprimere un ciclo, piuttosto che un concetto completamente non correlato. en.wikipedia.org/wiki/Program_loop#Loops Per quanto riguarda le CPU che non hanno loop, hanno gli strumenti necessari per implementarli (saltando su un indirizzo di memoria arbitrario)
GordonM,

8
Precisamente, la ricorsione può essere utilizzata per esprimere loop. Si tratta di un concetto molto diverso, anche se sono isomorfi tra loro. Una tazza di caffè non è una ciambella solo perché presumibilmente i topologi le confondono.

4
È vero, ma qualsiasi sistema completo di turing deve avere un modo per esprimere il concetto di eseguire la stessa sequenza più volte, il meccanismo può essere ricorsivo o saltare all'indietro nell'elenco delle istruzioni o qualsiasi altra cosa che ottenga lo stesso effetto. Se un sistema non fornisce alcun modo di ripetere una serie di istruzioni (oltre a ripetere fisicamente le istruzioni nell'elenco), non può essere Turing completo. Il motore analitico era Turing completo, quindi deve implementare il loop in un modo o nell'altro.
GordonM,

3

Supponendo che intendi moderni linguaggi di programmazione per computer di testo.

Algol60 ha "FOR", "DO", "UNTIL" e "WHILE", quindi era prima del 1960.

Il Retro Computing Museum ha alcune lingue prima del 1960.

Kvikkalkul , la lingua degli anni '50 per programmare sottotitoli nucleari svedesi ha solo GOTO. (Tuttavia, Kvikkalkul è quasi certamente una bufala degli anni '90, non un vero linguaggio storico.)

Plankalkül di Konrad Zuse è il primo che ho potuto trovare. Ha un costrutto "für".


Plankalkül era essenzialmente inedito fino a tempi recenti e Kvikkalkul è stato a lungo ritenuto una bufala. Alla luce di ciò, il merito probabilmente è dovuto a John Backus e al team FORTRAN , che nel 1957 avevano un compilatore in esecuzione sul campo, con DOloop.
Ross Patterson,

2

Il lavoro di Liebniz e Newton contiene algoritmi con costrutti loop. Liebniz costruì un calcolatore meccanico e ipotizzò (come fece Lovelace anni dopo) su una macchina per eseguire analisi più sofisticate. Le sue note su queste idee sono imprecise, ma descrivono la logica strutturata con anelli.

Tuttavia, l'idea delle sequenze di ripetizione e il conteggio dei loop controllati, nonché di ciò che chiameremmo mentre i loop sono discussi nel lavoro dell'uomo per il quale gli algoritmi sono chiamati: Muhammad ibn Musa al-Khwarizmi del IX secolo. Il suo secondo libro, al-Kitab al-mukhtasar fi hisab al-jabr wa'l-muqabala (الكتاب المختصر في حساب الجبر والمقابلة) (A Compendium on Calculation by Completion and Balancing) era noto a Newton, Liebniz, Babbage Lovace .

Naturalmente al-Khwarizmi si affidava, in parte, agli antichi greci. Ad un certo punto probabilmente torneremo alla versione di Adam and Eve di risciacquo, schiuma, ripetizione.

Per ulteriori informazioni su Al-Khwārizmī e il suo lavoro, vedere:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.