Quem criou a (s) ideia (ões) das primeiras construções de loop?


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

Como desenvolvedor, todos temos que usar loops com muita frequência. Nós sabemos isso. O que eu queria saber era: quem pensou na ideia de ter laços? Que idioma introduziu loops? Qual foi a primeira construção de loop? Foi um whileloop? Um forlaço? etc?


22
Charles Babbage e Ada Lovelace, provavelmente.
Mcfinnigan

28
Foi inventado em instruções de xampu, enxágüe, ensaboe, repita. :-)
Guy Sirton

13
@GuySirton, não seja bobo, isso é recursão.
Mkwwalker

18
@ user838584 - se fosse recursão, cada um repeatchamaria outro repeat- você nunca terminaria. Acho que talvez as mulheres leiam as instruções de xampu dessa maneira, mas os homens leem como iteração e precisam apenas de alguns minutos para lavar os cabelos.
31330 Steve314

3
Um computador sem loops é uma calculadora.
starblue

Respostas:


102

Como mouviciel e Emilio Garavaglia observaram, o conceito antecede a computação. No entanto, a primeira instância de um loop de software foi o loop que Ada Lovelace usou para calcular os números de Bernoulli , conforme descrito na Nota G de sua tradução do esboço do mecanismo analítico inventado por Charles Babbage , por LF Menabrea . A capacidade do mecanismo analítico de fazer um loop é notada cedo por Menabrea:

Entendendo isso, vamos, no início da série de operações que desejamos executar, colocar a agulha C na divisão 2, a agulha B na divisão 5 e a agulha A na divisão 9. Vamos permitir que o martelo do mostrador C para golpear; ele ataca duas vezes e, ao mesmo tempo, a agulha B passa por duas divisões. O último indicará o número 7, que sucede ao número 5 na coluna das primeiras diferenças. Se agora permitirmos que o martelo do mostrador B toque por sua vez, ele tocará sete vezes, durante o qual a agulha A avançará sete divisões; estes somados aos nove já marcados por ele fornecerão o número 16, que é o número quadrado consecutivo a 9. Se agora recomeçarmos essas operações, começando com a agulha C, que sempre será deixada na divisão 2,

O mecanismo de loop do Analytical Engine é herdado diretamente do tear mecânico de Joseph Marie Jacquard (1801), conforme observado nas memórias de Menabrea:

Agora será perguntado como a máquina pode, por si mesma, e sem recorrer à mão do homem, assumir as disposições sucessivas adequadas às operações. A solução desse problema foi retirada do aparelho da Jacquard, usado para a fabricação de produtos em brocado, da seguinte maneira:

Duas espécies de fios são geralmente diferenciadas nos tecidos; um é o fio de urdidura ou longitudinal, o outro o fio de trama ou transversal, que é transportado pelo instrumento chamado lançadeira e que atravessa o fio ou urdidura longitudinal. Quando é necessário um material de brocado, é necessário, por sua vez, impedir que certos fios cruzem o woof, e isso de acordo com uma sucessão que é determinada pela natureza do desenho a ser reproduzido. Antigamente, esse processo era demorado e difícil, e era necessário que o trabalhador, atendendo ao projeto que ele deveria copiar, deveria ele próprio regular os movimentos que os fios deveriam executar. Daí surgiu o alto preço dessa descrição de animais, especialmente se fios de várias cores entrassem no tecido. Para simplificar essa fabricação, Jacquard concebeu o plano de conectar cada grupo de segmentos que deveriam agir juntos, com uma alavanca distinta pertencendo exclusivamente a esse grupo. Todas essas alavancas terminam em hastes, que são unidas em um feixe, tendo geralmente a forma de um paralelepípedo com uma base retangular. As hastes são cilíndricas e são separadas umas das outras por pequenos intervalos. O processo de elevação das roscas é, portanto, resolvido no de mover esses vários braços de alavanca na ordem necessária. Para isso, é feita uma folha retangular de papelão, um pouco maior em tamanho do que uma seção do feixe de braços de alavanca. Se esta folha for aplicada à base do pacote, e um movimento de avanço for então comunicado ao cartão, este último moverá com ela todas as hastes do pacote, e, consequentemente, os threads que estão conectados a cada um deles. Mas se o papelão, em vez de liso, fosse perfurado com orifícios correspondentes às extremidades das alavancas que o encontram, então, como cada uma das alavancas passaria pelo papelão durante o movimento desta, todas elas permaneceriam em suas lugares. Vemos, portanto, que é fácil determinar a posição dos furos no papelão, que, a qualquer momento, haja um certo número de alavancas e, conseqüentemente, pacotes de fios levantados, enquanto o restante permanece onde eles estavam. Supondo que esse processo seja repetido sucessivamente de acordo com uma lei indicada pelo padrão a ser executado, percebemos que esse padrão pode ser reproduzido no material. Para esse fim, precisamos apenas compor uma série de cartões de acordo com a lei exigida, e organizá-los em ordem adequada, um após o outro; então, fazendo com que passem sobre um feixe poligonal que é conectado de modo a virar uma nova face para cada movimento da lançadeira, essa face será então impelida paralelamente a si mesma contra o feixe de braços de alavanca, a operação de elevar o threads serão executados regularmente. Assim, vemos que os tecidos brocados podem ser fabricados com uma precisão e rapidez anteriormente difíceis de obter.

O tear de Jacquard é uma aplicação muito precoce de um loop no contexto de ordem de uma máquina para produzir uma saída repetida :

A idéia por trás do tear Jacquard era um sistema de cartões perfurados e ganchos. As cartas eram muito grossas e tinham furos retangulares. Os ganchos e agulhas usados ​​na tecelagem foram guiados por esses furos no papelão. Quando os ganchos entraram em contato com o cartão, eles foram mantidos imóveis, a menos que encontrassem um dos orifícios perfurados. Em seguida, o gancho passou pelo orifício com uma agulha inserindo outra linha, formando o padrão desejado. Padrões intricados foram alcançados tendo muitos cartões dispostos um após o outro e / ou usados ​​repetidamente.

O tear de Jacquard também é reconhecido como uma forma muito precoce de um programa armazenado :

Se o ímpeto por trás de grande parte do desenvolvimento das máquinas de calcular discutidas até o momento surgiu da computação numérica, a motivação que levou à forma mais antiga de "programa armazenado" veio de uma fonte muito diferente: a indústria têxtil. Vimos anteriormente que um dos aspectos fundamentais dos sistemas computacionais é o conceito de representação de informações e, embora ainda não o tenhamos explicitado, a aplicação dessa ideia pode ser discernida em todos os artefatos que examinamos até agora: no desenvolvimento de representações escritas para valores numéricos e os paralelos mecânicos que surgiram a partir deles. Assim, o alinhamento de seixos em uma estrutura de ábaco, a justaposição de escalas móveis em uma régua de cálculo e a configuração de engrenagens dentadas nos dispositivos de Schickard, Pascal e Leibniz, são exemplos de técnicas representacionais que buscam simplificar os processos complexos subjacentes às tarefas aritméticas. Existem, no entanto, categorias de informações e representações das mesmas, além do número sobre o qual os processos computacionais podem ser executados. A tecnologia de tecelagem desenvolvida por Joseph-Marie Jacquard em 1801 ilustra um exemplo dessa categoria.

Charles Babbage também adaptou o procedimento de armazenamento de Jacquard no Analytical Engine , a presença ou ausência de um furo comunicava à máquina um simples comando on-off:

O mecanismo analítico possui muitos recursos essenciais encontrados no computador digital moderno. Era programável usando cartões perfurados, uma idéia emprestada do tear Jacquard usada para tecer padrões complexos em têxteis. O mecanismo possuía uma 'loja' onde os números e resultados intermediários poderiam ser mantidos e uma 'fábrica' separada onde o processamento aritmético era realizado. Tinha um repertório interno das quatro funções aritméticas e podia realizar multiplicação e divisão direta. Também era capaz de funções para as quais temos nomes modernos: ramificação condicional, loop (iteração), microprogramação, processamento paralelo, iteração, trava, polling e modelagem de pulso, entre outras, embora Babbage em nenhum lugar usasse esses termos. Ele tinha uma variedade de saídas, incluindo impressão em papel, cartões perfurados,

As ramificações condicionais do Analytical Engine combinadas com os loops mecânicos inspirados em Jacquard e o procedimento de armazenamento são assustadoramente semelhantes (conceitualmente) ao seu exemplo, especialmente se adicionarmos a impressora de Babbage à mistura, para as print "...";peças.

Obviamente, loops mecânicos são anteriores ao tear de Jacquard, o primeiro dispositivo conhecido a funcionar em loop, sendo o mecanismo Antikythera (100 aC), e se olharmos ainda mais para a história (e nos aventurarmos terrivelmente fora de tópico), os relógios de sol provavelmente serão os mecanismos mais antigos criados pelo homem. onde a compreensão dos loops é evidente, seguindo, é claro, o padrão repetitivo das órbitas do Sol e de outros corpos estelares.

No entanto, acho que, no contexto da computação (e não o cálculo ou qualquer outra coisa), o algoritmo de cálculo dos números do Analytical Engine e do Bernalli de Ada pode ser creditado pela introdução de loops, compartilhando pelo menos parte do crédito com o tear de Jacquard, tendo adaptado diretamente o conceito de isto.


3
Antes do tear de Jacquard, você pode encontrar loops mecânicos em carrilhões, como o de Bruges, onde os sinos são controlados pela rotação de um cilindro .
Mouviciel

6
@mouviciel Eu vejo a sua monstruosidade de sino e levanto a você um mecanismo Antikythera. ; P
yannis

2
+1 para sua resposta enciclopédica, incluindo um computador de 2000 anos!
Mouviciel

2
essa linda resposta me fez a pergunta favorita. Ele não apenas responde à pergunta, mas também é um exemplo de "como responder a uma pergunta". Bom trabalho, caro senhor.
Chani

Aceitou esta resposta porque era ao mesmo tempo conclusiva, enciclopédica e simplesmente incrível!
Dynamic

50

Os loops são anteriores à computação. Você pode encontrá-los em notação musical desde o canto gregoriano:

repita o sinal


2
Essa pode ser uma ótima resposta se um pouco mais de detalhes forem adicionados a ela. Ainda assim, ótimo trabalho.
Dynamic

Por favor, dar mais referências (data mais próxima, mais antiga notação musical para construções recurso de loop / repetição)
Skippy Fastol


32

O conceito de "faça de novo" é de alguma forma "primitivo" para a percepção humana. Você pode contar isso para uma criança que acabou de elaborar uma compreensão mínima da linguagem natural.

Em sistemas discretos, loops são encontrados em todas as máquinas de estados finitos quando você admite que pode alcançar um estado que já havia estado antes .

O loop mais simples é o ciclo entre dois estados (um relógio). Dado que qualquer número mais alto de estados pode resultar de uma contagem, toda máquina mais complexa é controlada por um "contador" incrementado por um relógio que pode "saltar" sobre certas bandeiras que representam certas operações combinatórias. Esse é o núcleo de uma máquina Von Neumann em que todos os computadores baseados em microprocessadores se baseiam.

No código de máquina, um salto é codificado JP-Z-nnnn(onde Z é o sinalizador mais baixo em que você baseia sua condição). Em linguagem de nível superior, isso se traduz quase imediatamente em

if(z) goto x;

Um loop nada mais é do que a gotoonde o rótulo x precede a própria instrução goto.

Todas as outras formulações (para, faça, enquanto, etc.) são apenas "açúcar sintático" para domesticar melhor o goto selvagem nos casos muito comuns de repetição até que algo aconteça


4

O conceito de loop é uma das coisas que diferencia um computador completo de uma simples máquina de calcular. Se um sistema não suporta loop, ele não está completo e, portanto, não é um computador.

O primeiro projeto completo de Turing foi o Analytical Engine de Babbage , por isso deve ter um conceito de loop. No entanto, existem sistemas com loop, mas o Turing não é completo (porque omitem outra coisa). O trabalho de Babbage provavelmente é um bom ponto de partida.


6
O cálculo lambda não possui loops (e sem condições ou saltos), mas está completo. A recursão é tão poderosa quanto a iteração.

3
você pode reescrever qualquer loop para uma função recursiva e eliminar ciclos
catraca aberração

5
O artigo da wikipedia sobre loops descreve a recursão como uma maneira de expressar um loop, em vez de um conceito totalmente não relacionado. pt.wikipedia.org/wiki/Program_loop#Loops Quanto às CPUs que não possuem loops, elas possuem as ferramentas necessárias para implementá-las (saltando para um endereço de memória arbitrário) #
2177 GordonM Gordon

8
Precisamente, a recursão pode ser usada para expressar loops. Ele é um conceito bastante diferente, mesmo que eles são isomorfos entre si. Uma caneca de café não é um donut apenas porque os topologistas os confundem.

4
É verdade, mas qualquer sistema completo de turing precisa ter uma maneira de expressar o conceito de executar a mesma sequência várias vezes, o mecanismo pode ser recursivo ou retroceder na lista de instruções ou qualquer outra coisa que atinja o mesmo efeito. Se um sistema não fornece nenhuma maneira de repetir um conjunto de instruções (além de repetir fisicamente as instruções na lista), ele não pode ser Turing completo. O Analytical Engine estava completo em Turing, portanto, ele deve implementar o loop de uma forma ou de outra.
GordonM 22/12/12

3

Supondo que você queira dizer linguagens de programação de computador de texto modernas.

O Algol60 possui "FOR", "DO", "ATÉ" e "WHILE", assim como antes de 1960.

O Museu da Computação Retro tem algumas línguas antes de 1960.

Kvikkalkul , o idioma dos anos 50 para a programação de submarinos nucleares suecos, possui apenas GOTO. (No entanto, Kvikkalkul é quase certamente uma farsa dos anos 90, não uma linguagem histórica real.)

O Plankalkül de Konrad Zuse é o mais antigo que pude encontrar. Ele tem uma construção "für".


Plankalkül era essencialmente inédito até os últimos tempos, e há muito que se diz que Kvikkalkul é uma farsa. Sob esse prisma, o crédito provavelmente deve recair sobre John Backus e a equipe FORTRAN , que tinha um compilador em execução em campo em 1957, com DOloops.
Ross Patterson

2

O trabalho de Liebniz e Newton contém algoritmos com construções de loop. Liebniz construiu uma calculadora mecânica e especulou (como Lovelace fez anos depois) sobre uma máquina para realizar análises mais sofisticadas. Suas anotações sobre essas idéias são incompletas, mas descrevem a lógica estruturada com loops.

No entanto, a idéia de sequências de repetição e contagem de loops controlados, bem como o que chamaríamos de loops são discutidos no trabalho do homem para quem os algoritmos são nomeados: Muhammad ibn Musa al-Khwarizmi, do século IX. Seu segundo livro, al-Kitab al-mukhtasar fi hisab al-jabr wa'l-muqabala, era conhecido por Newton, Liebniz, Babbage, Lovelace, entre outros. .

É claro que al-Khwarizmi confiava, em parte, nos antigos gregos. Em algum momento, provavelmente voltaremos à versão de Adão e Eva de enxaguar, ensaboar, repetir.

Para mais informações sobre Al-Khwārizmī e seu trabalho, consulte:

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.