誰が最初のループ構造のアイデアを作成しましたか?


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

開発者として、私たち全員非常に頻繁にループを使用する必要があります。私達はことを知っています。私が疑問に思っていたのは、ループを持っているという考えを誰が考えたのですか?どの言語がループを導入しましたか?最初のループ構造は何でしたか?それはたwhileループ?forループ?等?


22
チャールズ・バベッジとエイダ・ラブレース。
マクフィニガン

28
それはシャンプーの指示、すすぎ、泡立て、繰り返しで発明されました。:
ガイサートン

13
@GuySirton、愚かなことをしないでください、それは再帰です。
mowwwalker

18
@ user838584-再帰である場合、それぞれrepeatが別のものを呼び出しrepeatます-終了することはありません。女性はシャンプーの指示をそのように読んでいるかもしれませんが、男性はそれを繰り返して読んでおり、髪を洗うのに数分しかかかりません。
Steve314

3
ループのないコンピューターは計算機です。
スターブルー

回答:


102

以下のようmouvicielエミリオGaravagliaは指摘し、コンセプトは、コンピューティング以前から。しかし、最初のインスタンスのソフトウェア・ループは、ループしたエイダ・ラブレスを計算するために使用されるベルヌーイ番号に記載されているように、メモGの彼女の翻訳の解析エンジンのスケッチは、チャールズ・バベッジによって発明により、LF Menabrea。アナリティカルエンジンのループ機能は、メナブレアによって早くから注目されています。

これを理解して、実行したい一連の操作の開始時に、針Cを部門2に、針Bを部門5に、針Aを部門9に配置します。打つダイヤルCのハンマー; それは2回打たれ、同時に針Bは2つの部門を通過します。後者は、最初の違いの列の番号5に続く番号7を示します。ここで、ダイヤルBのハンマーがその順番で打つことを許可すると、7回打つことになり、その間に針Aは7師団を前進させます。すでにマークされている9に追加された数字は、16になります。これは、9に続く正方形の数字です。針Cから始まるこれらの操作を再開すると、常に部門2に残ります。

メナブレアの回想録に記されているように、分析エンジンのループメカニズムは、ジョセフマリージャカードの 機械織機(1801)から直接継承されます。

ここで、機械がそれ自体でどのように動作するのかを問い合わせ、人間の手に頼ることなく、操作に適した連続した処理を想定します。この問題の解決策は、次の方法で、ブロケード製品の製造に使用されるジャカードの装置から取られました。

2種類の糸は、通常、織り物で区別されます。1つは縦糸または縦糸、もう1つは横糸または横糸で、シャトルと呼ばれる器具によって運ばれ、縦糸または縦糸と交差します。ブロケードのものが必要な場合、特定のスレッドが横糸を横切るのを防ぐ必要があります。これは、再現されるデザインの性質によって決定される連続に従って決まります。以前は、このプロセスは長くて困難でした。そして、職人は、自分がコピーしようとしているデザインに注意を払うことによって、糸がとるべき動きを自分で調整する必要がありました。そのため、特にさまざまな色の糸が布地に入った場合、この記述の高い価格が生じました。この製造を簡素化するために、ジャカードは、一緒に行動するスレッドの各グループを、そのグループ専用の別個のレバーで接続する計画を考案しました。これらのレバーはすべて、通常は長方形のベースと平行六面体の形をした1つの束にまとめられたロッドで終端します。ロッドは円筒形で、小さな間隔で互いに分離されています。したがって、スレッドを上げるプロセスは、これらのさまざまなレバーアームを必要な順序で動かすプロセスに解決されます。これを実現するために、長方形のペーストボードのシートが取られ、レバーアームの束のセクションよりもサイズがいくぶん大きくなります。このシートをバンドルのベースに適用し、次に前進運動をペーストボードに伝えると、このボードはバンドルのすべてのロッドとともに移動します。その結果、それぞれに接続されているスレッド。しかし、もしペーストボードがプレーンである代わりに、それと出会うレバーの先端に対応する穴が開けられた場合、各レバーは後者の動作中にペーストボードを通過するので、それらはすべてその中に残ります場所。したがって、ペーストボードの穴の位置を決定するのが簡単であることがわかります。任意の瞬間に、一定数のレバーがあり、その結果、糸の小包が上昇し、残りはそれらの場所にとどまりますだった。このプロセスが実行されるパターンによって示された法則に従って連続的に繰り返されると仮定すると、我々はこのパターンがスタッフ上で再現される可能性があると認識する。このためには、必要な法律に従って一連のカードを作成するだけです。そして、それらを適切な順序で次々に配置します。次に、シャトルのストロークごとに新しいフェースを回転させるように接続されたポリゴンビームを通過させることにより、フェースがレバーアームの束に対してそれ自体に対して平行に推進され、スレッドは定期的に実行されます。したがって、ブロケード組織は、以前は入手が困難だった精度と迅速さで製造できることがわかります。

ジャカード織機は、マシンに繰り返し出力を生成するように命令するというコンテキストでのループの非常に初期の適用です。

ジャカード織機の背後にあるアイデアは、パンチカードとフックのシステムでした。カードは非常に厚く作られ、長方形の穴が開けられていました。製織に使用されるフックと針は、厚紙のこれらの穴によってガイドされていました。フックがカードに接触すると、パンチ穴の1つに出会わない限り、フックは固定されたままでした。次に、フックが針に別の糸を挿入して穴を通過することができたため、所望のパターンが形成されました。複雑なパターンは、多くのカードを次々に配置したり、繰り返し使用したりすることで実現しました。

ジャカード織機は、保存プログラムの非常に初期の形態としても認識されています。

これまでに説明した計算機の開発の大部分の背後にある推進力が数値計算から生じた場合、「保存プログラム」の最も初期の形態に至った動機は、非常に異なるソース、つまり繊維産業に由来することでした。計算システムの基本的な側面の1つは、情報を表す概念であることが以前にわかりました。明示的には行いませんでしたが、このアイデアの適用は、これまで検討したすべての成果物で識別できます。数値の記述表現と、これらから生まれた機械的類似物の開発において。したがって、そろばんフレーム上の小石の整列、スライドルール上の移動スケールの並置、およびSchickard、Pascal、Leibnizのデバイス上のコギングされたギアの構成、算術タスクの基礎となる複雑なプロセスを簡素化しようとする表現手法の例です。ただし、計算プロセスを実行できる数以外に、情報のカテゴリとその表現があります。1801年にJoseph-Marie Jacquardによって開発された製織技術は、そのようなカテゴリーの一例を示しています。

チャールズバベッジは、ジャカードの保管手順を分析エンジンにも適合させました。

分析エンジンには、最新のデジタルコンピューターに見られる多くの重要な機能があります。パンチカードを使用してプログラムできました。これは、テキスタイルに複雑なパターンを織り込むために使用されたジャカード織機から借用したアイデアです。エンジンには、数値と中間結果を保持できる「ストア」と、演算処理が実行される別の「ミル」がありました。4つの算術関数の内部レパートリーがあり、直接の乗算と除算を実行できました。また、条件付き分岐、ループ(反復)、マイクロプログラミング、並列処理、反復、ラッチ、ポーリング、パルス整形など、現代の名前を持つ機能も使用できましたが、バベッジはこれらの用語を使用していませんでした。ハードコピー印刷、パンチカード、

分析エンジンの条件分岐とジャカードに触発された機械的ループおよび保存手順は、特に部品についてBabbageのプリンターをミックスに追加する場合、(概念的に)あなたの例に非常に似ていますprint "...";

明らかに機械ループは、ジャカードの織機の前にあり、ループ方式で動作する最初の既知のデバイスはAntikytheraメカニズム(100 BCE)であり、歴史をさらに調べると(そして恐ろしく話題から外れたベンチャー)、サンダイアルはおそらく最も古い人造のメカニズムですループの理解が明らかな場所では、もちろん太陽と他の恒星の軌道の繰り返しパターンに従っています。

ただし、コンピューティングのコンテキストでは(計算などではなく)、Analytical EngineとAdaのベルヌーイ数計算アルゴリズムはループを導入し、少なくとも一部のクレジットをジャカードの織機と共有し、それ。


3
ジャカード織機の前に、ブルージュのようにシリンダーの回転によってベルが制御されるカリロンに機械ループがあります。
mouviciel

6
@mouviciel私はあなたのベルの怪物を見て、私はあなたにAntikytheraのメカニズムを提起します。; P
ヤニス

2
2000年のコンピューターを含む、百科事典的な答えに対して+1!
mouviciel

2
この美しい答えにより、私はこの質問を気に入った。質問に答えるだけでなく、「質問に答える方法」の一例です。良い仕事、親愛なる先生。
チャニ

それは決定的で、百科事典的で、素晴らしかったので、この答えを受け入れました!
ダイナミック

50

ループはコンピューティングに先行します。グレゴリオ聖歌と同じくらい早く、それらを楽譜で見つけることができます:

サインを繰り返します


2
これにもう少し詳細を追加すれば、これは素晴らしい答えになります。それでも、素晴らしい仕事です。
ダイナミック

複数の参照(最も早い日付、機能ループ/リピート構造に最も初期の楽譜を)教えてください
スキッピーFastol

@SkippyFastolそれはその記事にあります:en.wikipedia.org/wiki/Repeat_sign#Other_notation
cwallenpoole

32

「もう一度やる」という概念は、人間の知覚に対して何らかの形で「原始的」です。これは、自然言語の最小限の理解を詳しく説明したばかりの子供に伝えることができます。

離散システムでは、すべての有限状態マシンにループがあり、以前にあった状態に到達できることを認めます。

最も単純なループは、2つの状態(クロック)間のサイクルです。カウントの結果、より多くの状態が発生する可能性があるため、より複雑なマシンはすべて、特定の組み合わせ操作を表す特定のフラグを「ジャンプ」できるクロックでインクリメントされる「カウンター」で構築されます。これは、すべてのマイクロプロセッサベースのコンピューターがベースにしているフォンノイマンマシンのコアです。

マシンコードでは、ジャンプがコーディングされますJP-Z-nnnn(Zは条件に基づいたyeferフラグです)。高レベルの言語では、これはすぐに翻訳されます

if(z) goto x;

ループはgoto、xラベルがgoto命令自体の前にある場所にすぎません。

他のすべての製剤は、(のため、行う、しばらく、など)良くするだけで、「シンタックスシュガー」で飼い慣らす野生の非常に一般的なケースではgotoを何かが起こるまで繰り返します


4

ループの概念は、本格的なコンピューターと単純な計算機を区別するものの1つです。システムがループをサポートしていない場合、チューリング完全ではないため、コンピューターではありません。

最初のチューリング完全な設計はBabbageの分析エンジンであったため、ループの概念があったに違いありません。ただし、ループはあるがチューリング完全ではないシステムがあります(他の何かを省略しているため)。しかし、バベッジの作品はおそらく良い出発点です。


6
ラムダ計算にはループはなく(条件もジャンプもありません)、チューリング完全です。再帰は反復と同じくらい強力です。

3
ループを再帰関数に書き換えてループを削除できます
ラチェットフリーク

5
ループに関するウィキペディアの記事では、再帰は完全に無関係な概念ではなく、ループを表現する方法として説明されています。en.wikipedia.org/wiki/Program_loop#Loopsループを持たないCPUについては、それらを実装するために必要なツールがあります(任意のメモリアドレスへのジャンプ)
GordonM

8
正確には、再帰を使用してループを表現できます。それはある、彼らは互いに同型であっても、全く異なる概念。コーヒーマグカップは、トポロジー学者が混乱させるという理由だけでドーナツではありません。

4
確かに、チューリング完全なシステムには、同じシーケンスを複数回実行するという概念を表現する方法が必要です。メカニズムは、再帰、または命令リストまたは同じ効果を達成する他の何かで後方にジャンプすることができます。システムが(リスト内の命令を物理的に繰り返す以外に)一連の命令を繰り返す方法を提供しない場合、チューリングを完了できません。分析エンジンはチューリング完全であったため、何らかの形でループを実装する必要があります。
GordonM

3

あなたが現代のテキストコンピュータープログラミング言語を意味すると仮定します。

Algol60には「FOR」、「DO」、「UNTIL」、「WHILE」があるため、1960年以前でした。

レトロなコンピューティング博物館は 1960を事前にいくつかの言語を持っています。

50年代からスウェーデンの原子力潜水艦をプログラミングするための言語であるKvikkalkulにはGOTOしかありません。(ただし、Kvikkalkulはほぼ確実に90年代のデマであり、実際の歴史的言語ではありません。)

Konrad ZuseのPlankalkülは、私が見つけた最も早いものです。「für」コンストラクトがあります。


Plankalkülは最近まで本質的に非公開であり、Kvikkalkulはデマであると長い間噂されていました。その観点から、信用はおそらく、ジョン・バッカスと1957年に現場でコンパイラーを実行していたループを持つFORTRANチームに委ねなければなりませんDO
ロスパターソン

2

LiebnizとNewtonの両方の作業には、ループ構造を持つアルゴリズムが含まれています。Liebnizは、機械式計算機を構築し、(Lovelaceが数年後に行ったように)より洗練された分析を実行するマシンについて推測しました。これらのアイデアに関する彼のメモはおおまかなものですが、構造化されたロジックをループで説明しています。

しかし、繰り返し配列を、アイデアと我々が呼ぶものの制御ループを数えるだけでなく、ループがしながら、アルゴリズムが命名されている誰のために男の仕事で議論されていますフワーリズミー第九世紀から。彼の2番目の本、アル・キタブ・アル・ムフタサル・フィ・ヒサブ・アル・ジャブル・ワル・ムカバラ。

もちろん、アル・クワリズミは、一部、古代ギリシャ人に依存していました。ある時点で、アダムとイブのリンスのバージョンに戻り、泡を立て、繰り返します。

Al-Khwārizmīと彼の作品の詳細については、以下を参照してください。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.