1945 年にペンシルベニア大学で完成した ENIAC は、当時世界最速の電子計算機だった。一万八千本近い真空管を使い、一秒間に五千回の足し算をした。だが計算を変えるには、パネルの上のケーブルとスイッチを配線し直さなければならず、それはプログラマーのチームが何日もかける仕事だった。

ENIAC の制御パネルを操作する二人のプログラマー。ペンシルベニア大学ムーア・スクール、1946 年ごろ。
ENIAC の制御パネルを操作する二人のプログラマー。ペンシルベニア大学ムーア・スクール、1946 年ごろ。United States Army · Wikimedia Commons · パブリックドメイン

ENIAC の技術者 J・プレスパー・エッカートとジョン・モークリーは、すでに次の機械 EDVAC を計画していた。そこではプログラムが記憶装置に保持される。フォン・ノイマンは彼らの会議に出席するようになり、1945 年 6 月、「器官」や「ニューロン」について語る抽象的な、ほとんど生物学的な言葉で、グループの考えを整理した文書を書いた。

『EDVAC に関する報告書の第一草稿』の表紙。日付は 1945 年 6 月 30 日。
『EDVAC に関する報告書の第一草稿』の表紙。日付は 1945 年 6 月 30 日。John von Neumann · Wikimedia Commons · パブリックドメイン

計算機の部分

『EDVAC に関する報告書の第一草稿』は、次のものからなる計算機を記述している。

  1. 計算を行う演算装置
  2. 命令を一つずつ読み、実行させる制御装置
  3. 数と命令を同時に保持する記憶装置。どちらも二進数字の列として書かれる
  4. 入力と出力の装置

決定的な新しさは 3 番目にある。プログラムがデータと同じ記憶装置に保持されるので、計算を変えるとは記憶装置の中の数を変えることであり、配線を変えることではない。しかもプログラムは自分自身の命令を計算し、書き換えることさえできる。これは 1936 年のチューリングの万能機械のアイデアを、真空管と水銀遅延線で実現したものである。

四行のプログラム

0 から 7 まで番号のついた八つの位置をもつ記憶装置と、アキュムレータと呼ばれるレジスタを考えよう。

位置 内容 意味
0 LOAD 5 位置 5 の数をアキュムレータに入れる
1 ADD 6 位置 6 の数をアキュムレータに足す
2 STORE 7 アキュムレータを位置 7 に格納する
3 HALT 終了
5 40 データ
6 2 データ
7 0 結果

制御装置は位置 0 から始め、実行しては次へ進む。三歩の後、位置 7 には $42$ が入っている。命令とデータは隣り合って住んでいる。STORE 1 という命令が二番目の命令を上書きするのを妨げるものは何もない。そして、それこそが、あるプログラムが別のプログラムを生成できる理由なのだ。

アメリカ陸軍アバディーン弾道研究所に設置された EDVAC。1951 年に稼働を始めた。
アメリカ陸軍アバディーン弾道研究所に設置された EDVAC。1951 年に稼働を始めた。United States Army · Wikimedia Commons · パブリックドメイン

発明したのは誰か

報告書は本来、参加者の間だけで回覧されるはずだったが、ハーマン・ゴールドスタインがそれを広く配布し、表紙にはフォン・ノイマンの名前だけがあった。フォン・ノイマンが来る前からプログラム内蔵方式について議論していたエッカートとモークリーは、成果を奪われたと感じた。さらに、この文書は公表済みとみなされたため、彼らはこのアイデアで特許をとる機会を失った。争いはグループをむしばみ、グループは 1946 年に解散した。今日の歴史家たちは、このアイデアが集団のものであり、フォン・ノイマンの功績はそれを明快かつ一般的に記述し、世界中に広めたことにある、という点で一致している。

1952 年 6 月 10 日、高等研究所の計算機の前に立つ J・ロバート・オッペンハイマーとジョン・フォン・ノイマン。この日、計算機が一般に公開された。
1952 年 6 月 10 日、高等研究所の計算機の前に立つ J・ロバート・オッペンハイマーとジョン・フォン・ノイマン。この日、計算機が一般に公開された。Jeremy Norman Collection of Images · Wikimedia Commons · CC BY 4.0
練習:プログラムを追う

位置 5 と 6 の内容を $17$ と $25$ に、位置 1 の命令を SUBTRACT 6 に替える。最後に位置 7 には何が入るか。

アキュムレータはまず $17$ を受け取り、次に $17 - 25 = -8$ となり、これが位置 7 に格納される。同じ回路が、記憶装置の数が変わっただけで、配線に一本も触れずに別の計算をしたのである。

練習:自分を書き換えるプログラム

HALT の前に、次に実行したときには位置 7 を自分自身にも足すようにする命令を加えよ。なぜこれはプログラム内蔵方式でなければできないのか。

たとえば、アキュムレータに ADD 7 の符号が入っているときに STORE 1 を実行すれば、二番目の命令が書き換えられる。次にプログラムを実行すると、位置 1 には ADD 7 と書かれている。これができるのは、命令がデータと同じ記憶装置に保持された数だからにほかならない。ENIAC ではプログラムは配線の中にあり、プログラム自身がそれを書くことはできなかった。

出典: John von Neumann, First Draft of a Report on the EDVAC(1945)· Herman Goldstine, The Computer from Pascal to von Neumann(1972)· George Dyson, Turing’s Cathedral(2012)· John Backus, “Can programming be liberated from the von Neumann style?”, Communications of the ACM(1978)。


ジョン・フォン・ノイマンの全トピック · ← ヒルベルト空間の中の量子力学 · マージソート:併合して並べる →

画像クレジット.