現代の僕「コンピュータが生まれた歴史知りたい」

# TL;DR
コンピュータの歴史も何も知らなかった私が、「ありがとう、先人たちよ」と言えるぐらいまでコンピュータの歴史を調べたので共有したいと思います。

# 最初の動機 「コンピュータってどうやって動いてるんだろう」
あなたは、この疑問に自信を持って答えられますか？

そして、仮にコンピュータを知らない人類がいたとして、「コンピュータとは何か」を説明できますか？

私はできませんでした。

もちろん、コンピュータを使うことはできます。
こうして、キーボードをカタカタを打つと、見慣れた文字となってディスプレイに映すことが出来ます。

しかし、**「使えること」**と、**「それが動く原理を説明すること」** は途方もなく大きな壁で隔てられています。

この記事では、コンピュータが動く原理を、その歴史をたどることで探っていきます。

コンピュータの歴史をまとめつつ、 **「コンピュータってどうやって動くの？」** に答えられるようなものにしたいです。


# この記事の内容について

全体の流れは、英語版のWikipediaである [Computer(en.wikipedia)](https://en.wikipedia.org/wiki/Computer) の構成を参考にしています。

記事中の内容を引用する時は、blockquotesで囲んだ上で、出典を明記しています。英文の場合は、[DeepL](https://www.deepl.com/translator)で翻訳を行っています。


# 歴史に入る前に言葉の定義： 「コンピュータ」とは？

こういう派手なタイトルの記事を書くにしも、土台を固めていきたいタイプなので、「コンピュータ」という単語の定義を見ていきましょう。

## コンピュータ

[Computer(en.wikipedia)](https://en.wikipedia.org/wiki/Computer)

> コンピュータとは、コンピュータのプログラミングによって、一連の算術演算や論理演算を自動的に実行するように指示することができる機械のことです。現代のコンピュータは、プログラムと呼ばれる一般化された一連の操作に従う能力を持っています。これらのプログラムによって、コンピュータは非常に広範囲のタスクを実行することができます。「完全な」動作に必要なハードウェア、オペレーティングシステム（メインソフトウェア）、および周辺機器を含む「完全な」コンピュータをコンピュータシステムと呼ぶことができます。

コンピュータとは、 以下のような機械を指します。

- **プログラムと呼ばれる一般化された一連の操作 に従う能力を持つ**
- **一連の算術演算や論理演算を自動的に実行するように指示することができる**


なるほど、よく見るような説明ですね。

でも、 **プログラム** とは、なんでしょうか？
ここでQiitaを読んでいるということは、普段プログラムを書いている人が多いと思いますが、「プログラム」という言葉に慣れすぎて、それがどういう意味なのか考えたことがない人がいるかもしれません（私のように）。

さっそく調べてみます。

## コンピュータプログラム

[Computer_program(en.wikipedia)](https://en.wikipedia.org/wiki/Computer_program)

> コンピュータプログラムとは、特定のタスクを実行するためにコンピュータによって実行される命令の集合体である。ほとんどのコンピュータ装置は、適切に機能するためにプログラムを必要とします。

> コンピュータプログラムは通常、コンピュータプログラマーによってプログラミング言語で書かれます。人間が読める形式のソースコードのプログラムから、コンパイラやアセンブラはマシンコード（コンピュータが直接実行できる命令で構成された形式）を導き出すことができます。また、コンピュータプログラムはインタプリタの助けを借りて実行されることもあります。

**コンピュータプログラム** とは、特定のタスクを実行するためにコンピュータによって実行される **命令の集合体** です。

「現代のコンピュータ」とは、よく言われるように単に算術演算や論理演算を実行できる機械のことだけを指すのではありません。
大事なのは、**プログラムという一般化された命令の集合体を、コンピュータが直接実行できる命令へと変換することが出来る**という点です。

ふむふむ、、わかったような、わからないような・・・。

私自身そういう気持ちになったのですが、この点がなぜ大事なのかは、**コンピュータが生まれる歴史を遡ることでわかります**。

**一般化された命令** とは？それに対して、 **コンピュータが直接実行できる命令** とは？
この辺りが、キーワードになってきます。


# コンピュータが生まれた歴史を知ろう。

細かくやりだすとキリがないのですが、個人的に重要なターニングポイントをいくつか設定して、それに沿って解説していきます。
アジェンダ（言ってみたいだけ）はこちらです。

1. [**コンピュータ誕生以前**](#1-コンピュータ誕生以前)
2. [**実現しなかった「幻のコンピュータ」**](#2-実現しなかった幻のコンピュータ)
3. [**チューリングが作った「コンピュータ」の理論的基盤**](#3-チューリングが作ったコンピュータの理論的基盤)
4. [**「コンピュータ」の誕生**](#4-コンピュータの誕生)
5. [**そして、現代のコンピュータへ 〜ストアドプログラム〜**](#5-そして現代のコンピュータへストアドプログラム)

(@thomasJs8 さんのご指摘でアジェンダにリンクを追加しました。ありがたい！)

# 1. コンピュータ誕生以前

複雑な計算を簡単にしたいという需要は昔からあり、多くのツールが開発されてきました。
そろばんなどは、紀元前2400年前のバビロニアで開発されていたようです。

現代で言われるコンピュータが生まれるよりも前に、特定の用途の計算を自動化するアナログコンピュータは存在していました。


しかし、今のようなデジタルコンピュータが発明されるよりもずっと前、紀元前50~100年頃、古代ギリシャに高度なアナログコンピュータ **Antikythera機構** があったことがわかっています。

## 古代ギリシャのアナログコンピュータ： Antikythera機構

[Antikythera_mechanism(en.wikipedia)](https://en.wikipedia.org/wiki/Antikythera_mechanism)

> Antikythera機構（/ˌæntɪkɪˈθɪərə/、/ˌæntɪˈkɪθərə/）は、古代の手で動力を与えられたギリシャのアナログコンピュータであり、このようなデバイスの最初の例としても記述されている事前に何十年ものカレンダーや占星術の目的のために天文学的な位置や日食を予測するために使用されている。それはまた、オリンピアード、古代オリンピックのサイクルに似ていた運動競技の4年間のサイクルを追跡するために使用することができた。

![673px-NAMA_Machine_d'Anticythère_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260547/5e9935c8-e987-7b9a-78e1-9dd988c73259.jpeg)

**Antikythera機構** は、およそ紀元前60~70年頃に占星術などのために使われたとされる **ギリシャの機械式アナログコンピュータ** です。
1901年に海から回収され、高解像度の表面スキャンや、X線トモグラフィーによって、およそ37個の歯車があり、時計仕掛けの詳細を調べる研究がされました（これもすごい）。
それによると、この機構は、日食を予測したり、月や太陽の動きを追うことができ、月の速度が遠地点よりも近地点の方が早くなることなども計算されていたようです。

2000年前にここまですごい機械を作っていた人類がいたというだけで夢が膨らみますね。


しかし、Antikythera機構がいかに優れていようとも、現代のコンピュータとは呼べない **決定的な違い** があります。
それは、 **外部からプログラムを読み込めない** ということです。



なんと、「プログラムを読み込んで実行する」コンピュータの設計が誕生するのは、Antikythera機構から **1900年後** の1837年になります。


# 2. 実現しなかった幻の「コンピュータ」

Antikythera機構はあまりにも時代を先取りしていましたが、18世紀にもなると機械式アナログコンピュータは、天文学や航海のために広く使われるようになっていました。

調べていて面白いなぁと思ったものを紹介すると、

> 1770年代、スイスの時計師ピエール・ジャケ＝ドロズは、羽ペンを持って文字を書くことができる機械人形（オートマタ）を作りました。内部の車輪の数と順序を変えることで、異なる文字、それゆえに異なるメッセージを作り出すことができる。事実上、人形は機械的に命令を読み取るように「プログラム」されていたのです。他の2つの複雑な機械とともに、この人形はスイスのヌーシャテル美術館にあり、現在も稼働している。

([Computer(en.wikipedia)](https://en.wikipedia.org/wiki/Computer))

![627px-Automates-Jaquet-Droz-p1030472.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260547/eb160556-adcf-9d86-8549-779ea34426be.jpeg)
(https://en.wikipedia.org/wiki/Pierre_Jaquet-Droz より)


1770年代、スイスの時計師ドロズが羽ペンで文字を書く機械人形(オートマタ)を作りました。
その機械の内部にある車輪の数や順序を変えることで、異なるメッセージを出力できるようになっていました。

つまり、車輪の数や順序といった「命令」を読み取るようになっていたというのです。

正直なところ、どんな複雑な命令も解釈して実行する現代のコンピュータとは異なります。
しかし、 **プログラムを機械の外から与えて、実行したいという考えが生まれるのも時間の問題だった** ように思えます。

そして生まれたのが、バベッジの「解析機関」です。


（追記：@cheetaso さんから `日本語でオートマトンは計算機理論の用語をさすことが多く、機械人形はオートマタと表記するのが一般的かと思います。` というご指摘をいただきました。 `オートマトン` と表記していたところを、誤解を避けるため、 `オートマタ` の表記にしました。ありがとうございます！）

## バベッジの「解析機関」

[Analytical_Engine(en.wikipedia)](https://en.wikipedia.org/wiki/Analytical_Engine)

> 解析機関は、イギリスの数学者でありコンピュータのパイオニアであるチャールズ・バベッジによって設計された機械式汎用コンピュータの提案である。 よりシンプルな機械式コンピュータのために設計されたバベッジの差分エンジンの後継として、1837年に最初に記述された。
> Analytical Engine は、算術論理ユニット、条件分岐やループの形での制御フロー、統合メモリを組み込み、現代用語でチューリング完全と表現できる汎用コンピュータの最初の設計となりました。 言い換えれば、Analytical Engine の論理構造は、電子時代のコンピュータ設計を支配してきたものと本質的に同じでした。 Analytical Engine は、チャールズ・バベッジの最も成功した業績の 1 つです 。
> バベッジは、主任技術者との対立や資金不足のため、どの機械も完成させることができませんでした。


イギリスの数学者であるチャールズ・バベッジによって設計された **解析機関(Analytical Engine)** は、他の単なる機械式コンピュータとは一味違うものでした。

- 算術論理ユニット
- 条件分岐やループなどの制御フロー
- 統合メモリ

といった、現代のコンピュータ設計でも通用するような論理構造を生み出しました。

しかし、 **主任技術者との対立や資金対立のために、どの機械も完成することが出来ませんでした。**

息子のヘンリーが、途中まで作ったものがロンドンの科学博物館に展示されています。

![450px-Analytical_Engine_(2290032530).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260547/07c57a6b-391a-c2b0-14b9-9f3d4aa6cc18.jpeg)


この解析機関で特筆すべき事項が、 **プログラムとデータの入力が、パンチカードを介して機械に提供されることになっていた** ということです。

> プログラム（「式」）とデータからなる入力は、当時ジャカード織機のような機械織機に使用されていた方法であるパンチングカードを介して機械に提供されることになっていた。 出力のために、機械はプリンタ、カーブプロッタ、ベルを備えていた。 機械はまた、後に読み込まれるようにカードに数字をパンチングすることも可能であった。この機械は通常のベース10固定小数点演算を採用していた。

![PunchedCardsAnalyticalEngine.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260547/2128a231-fc9f-d4de-6f4d-185654b14d74.jpeg)
（https://en.wikipedia.org/wiki/Analytical_Engine より）

この画像の手前のパンチカードは **命令を入力するための「オペレーションカード」** で、奥側のパンチカードは **データを入力するための「変数カード」** です。
命令とデータをパンチカードで外部から入力することによって、汎用的なオペレーションが可能になります。
また、現代で言う **命令セットアーキテクチャ(ISA)** も作られていました。

> それぞれ40桁の10進数の数字を1,000個（約16.2kB）保持することができるストア（つまりメモリ）が予定されていた。算術ユニット（「ミル」）は、4つの算術演算のすべてに加えて、比較や平方根などの演算を実行することができる。  当初（1838年）は、長いストアが片側に出ている一般的な円形のレイアウトで、それ自体に湾曲した差分エンジンとして構想されていた。  後の図面(1858年)では、正則化されたグリッドレイアウトが描かれている。 現代のコンピュータの中央処理装置(CPU)のように、このミルは、「バレル」と呼ばれる回転ドラムに挿入されたペグの形で保存され、ユーザーのプログラムが指定するより複雑な命令のいくつかを実行するために、独自の内部手続きに依存していた。

現代コンピュータとバベッジの「解析機関」の大きな違いの一つが、10進数でデータを保持する点でした。
設計では、40桁の10進数の数字を1,000個保持するメモリが予定されていた、とあります。

バベッジの「解析機関」は、現代のコンピュータに近い先駆的な設計でしたが、当時は歯車を基本とした機械式計算装置として作る必要があることや、先進的すぎて事の重大さが認識されていなかったのもあり、 **未完成に終わります** 。


そして、時代は移り変わり第二次世界大戦直前に飛んでみましょう。

# 3. チューリングが作った「コンピュータ」の理論的基盤

![352px-Alan_Turing_Aged_16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260547/c4bceaa9-49c8-80f6-c24f-11b65c3ec81c.jpeg)
(https://en.wikipedia.org/wiki/Alan_Turing より)

「コンピュータ」とは何か、を決定付ける論文が **アラン・チューリング** によって１９３６年に投稿されました。
そのタイトルとは、 *On Computable Numbers, with an Application to the Entscheidungsproblem* です。

ちなみに、論文は、 [Oxford University Press](https://academic.oup.com/plms/article-abstract/s2-42/1/230/1491926) で読むことが出来ます（私は最初をちょっとだけ読んで諦めましたｗ）。


このタイトルを日本語に訳すと、 *計算可能な数について、Entscheidungsproblemへの応用も含めて* のようになります。
**Entscheidungsproblem** ってなんやねん、となると思うので、調べてみます。


## Entscheidungsproblem - ”決定問題”
[Entscheidungsproblem(en.wikipedia)](https://en.wikipedia.org/wiki/Entscheidungsproblem)

ドイツ語の単語なのですが、英語の中でもこのまま表記する珍しい例です。

> 数学とコンピュータサイエンスでは、Entscheidungsproblem（"決定問題 "のためのドイツ語）は、1928年にデビッド・ヒルベルトとヴィルヘルム・アッカーマンによって提起された課題です。問題は、文が普遍的に有効であるかどうかに応じて、入力として、文と答え "はい "または "いいえ "を考慮したアルゴリズムを求めている、すなわち、公理を満たすすべての構造で有効です。


ドイツ語→日本語では、 **決定問題** と訳される Entscheidungsproblem です。浅い知識ですが、 **ざっくり** 説明してみようと思います。
ここからは、Entscheidungsproblemを **"決定問題"** と呼びます。

”決定問題” とは、 **「どんな数学的記述を入力としても、真理値を決定できるようなすごい機械があるかどうか」** というもので、17世紀のライプニッツによって提起されました。
この問題を考える上で、 **そもそも機械ってなんなん？** みたいな話があるので、その辺の定義が重要になってくるわけです。

また、ここでは詳細に踏み込まない（踏み込めない？）ですが、 ”決定問題”は、 **有名なゲーデルの不完全性定理とかあの辺とも密接な関わりがあります**。
この ”決定問題”は、1928年にデビット・ヒルベルトとヴェルヘルム・アッカーマンによって改めて提起されました。

ヒルベルト自身は、1930年頃には、「解けない問題は存在しない」と考えていたようですが、結果は **否定的** なものでした。
つまり、アロンゾ・チャーチとアラン・チューリングが独立に発表した結論では、 **「どんな問題でも解けるすごい機械などない」** というものです。

結論だけで見たら残念に思えるかもしれないですが、おそらく結論以上に重要なのは、チューリングがこの論文の中で導入した仮想的な **チューリング・マシン** です。

## チューリングマシンとは

![640px-Turing_machine_1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260547/03e16c55-bf54-02dc-d17b-5cfc27ed83d5.jpeg)
(https://en.wikipedia.org/wiki/Turing_machine_gallery より)

説明してると１記事が無限に増えそうなので、ざっくり説明します。

個別の **「セル」** が無限に並んだすっごい長いテープがあるとします。その **「セル」** には、0か1かを印をつけることが出来ます。

**「ヘッド」はテープに沿って動くことが出来る機械** で、「セル」の情報を読み取ることができます。
そして、 **「テーブル」は、「セル」の情報と、「状態」を組み合わせて、次の「ヘッド」の動きと「状態」を決める対応表です**。

「テーブル」はこんな感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260547/0f7b724d-c795-ff37-a192-6920b3fb6a39.png)

(https://en.wikipedia.org/wiki/Turing_machine をキャプチャ)


なんやかんやして、ヘッドは読み取っては動きや状態を変えながら色んな場所を動きます。


[Turing_machine(en.wikipedia.org)](https://en.wikipedia.org/wiki/Turing_machine) を引用します。

> チューリング・マシンは、1936年にアラン・チューリングによって発明されたもので、「a-machine」（自動機械）と呼ばれていました。このモデルを使って、チューリングは2つの疑問に否定的に答えることができた。
> (1) テープ上の任意の機械が「円形」であるかどうかを判断できる機械は存在するのか(例えば、フリーズするか、計算タスクを継続するのに失敗するか)
> (2) テープ上の任意の機械が与えられた記号を印刷するかどうかを判断できる機械は存在するのか
> このように、任意の計算が可能な非常に単純な装置の数学的記述を提供することによって、彼は計算の性質を一般的に証明することができました、特に「決定問題」の計算不可能性を証明することができました。

数学的に厳密なチューリングマシンを定義することで、このチューリングマシンによって解ける問題と解けない問題があることを明らかにしました。

また、チューリングは、 **任意のチューリングマシンをシミュレートすることができる（！）、万能チューリングマシン** を考え出しました。

## 万能チューリングマシン

[Universal_Turing_machine(en.wikipedia)](https://en.wikipedia.org/wiki/Universal_Turing_machine)
> すべてのチューリングマシンは、そのアルファベット上の入力文字列から、ある固定された部分的な計算可能な関数を計算します。その意味では、それは固定されたプログラムを持つコンピュータのように振る舞います。しかし、どんなチューリング・マシンの動作表も文字列でエンコードすることができます。このようにして、動作表を記述した文字列と入力テープを記述した文字列をテープに期待し、エンコードされたチューリング・マシンが計算したであろうテープを計算するチューリング・マシンを構築することができます。チューリングは1936年の論文でそのような構造を完全に詳細に記述しています。

先程説明したような、普通のチューリングマシンを考えます。
**「テーブル」** にいろいろな動作が書かれていますね。例えば、数値と四則演算ができる電卓のようなものを思い浮かべると良いでしょう（ここでは **このチューリングマシンを「電卓マシン」** とします）。

そして、また別のチューリングマシンを考えます。

まず、 **「電卓マシン」の「テーブル」を0と1の文字列にエンコードして、新しいチューリングマシンに読ませるテープ上に表現します**。

また、「電卓マシン」に入れる入力も、 **同じテープ上に書き込みます** 。
そして、**その全部のテープを読み込んで、元々のチューリングマシン「電卓マシン」と同じ結果を出すようなチューリングマシン** が作れそうですね。

**万能チューリングマシン** とは、 **任意の入力に対して、任意のチューリングマシンの動きをシミュレートできるチューリングマシン** です。

頭がこんがらがりますね。私もこんがらがってきました。

実は、 **現在のPCは、万能チューリングマシンであることが知られています** （無限テープとかその辺抜きにして）。すごいですね。

このチューリングの理論を背景にしながら、本物の「コンピュータ」が誕生します。

# 4. コンピュータの誕生

バベッジの「解析機関」の設計から約100年後、時代は第二次世界大戦です。

この戦争がコンピュータ誕生の針を一気に進めます。

バベッジの頃とは異なり、コンピュータによって計算速度を向上させることが、戦争の勝敗に関わってくる時代となっていました。
やはり、奇しくも戦争というのは技術を進歩させてしまうのです。

## Z3 - 世界初の電気機械式全自動デジタルコンピュータ

[Computer(en.wikipedia)](https://en.wikipedia.org/wiki/Computer)

1941年に、ドイツは **世界初の電気機械式全自動デジタルコンピュータ Z3** を発表しました。
1998年になって、限られた条件の元でチューリング完全であることが証明されました。

![640px-Z3_Deutsches_Museum.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260547/e3a946bc-a1b2-b4b4-eb2d-afb651df3ea5.jpeg)
(Z3のレプリカ https://en.wikipedia.org/wiki/Z3_(computer) より)

> 1941 年、Zuse はそれ以前の機械に続いて、世界初の動作する電気機械式プログラム可能な全自動デジタルコンピュータ Z3 を発表した 。 Z3 は 2000 個のリレーを搭載し、約 5～10 Hz のクロック周波数で動作する 22 ビットのワード長を実装した 。これはいくつかの点で現代の機械に酷似しており、浮動小数点数のような数多くの進歩を開拓していた。実装が困難な10進法（チャールズ・バベッジの初期の設計で使用されていた）ではなく、2進法を使用することは、当時利用可能な技術を考えると、ズースの機械の構築が容易であり、潜在的に信頼性が高いことを意味していた。

バベッジの「解析機関」の設計は、10進法でしたが、Z3では、 **2進法** での計算が行われました。
[Z3(computer)](ttps://en.wikipedia.org/wiki/Z3_(computer)) によると、「戦争上重要ではない」と資金提供が拒否されたり、最終的には戦争中に破壊されてしまったようです。

> Zuseはドイツ政府にリレーを完全に電子化されたスイッチに置き換えるための資金提供を求めたが、そのような開発は「戦争上重要ではない」とみなされたため、第二次世界大戦中に資金提供は拒否された。オリジナルのZ3は1943年12月21日に連合国軍のベルリン砲撃の間に破壊された。


## コロッサス - 世界初の電子デジタル・プログラマブル・コンピュータ

一方、第二次世界大戦中のイギリスでは、ドイツ軍の暗号であるエニグマを解読するために **コロッサス** が作られました。
**コロッサス** は、チューリング完全ではないものの、 **紙テープ入力** ができる、 **世界初の電子デジタル・プログラマブル・コンピュータ** でした。 

![Colossus.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260547/42d05a91-6c0d-f470-d71f-5fbe5617bd9d.jpeg)
(https://en.wikipedia.org/wiki/Colossus_computer より)

Z3とコロッサス何が違うのよ、っていう話でいうと、 **電気機械** か、 **電子的(真空管を使っている)** かどうかが違います。

## 真空管の登場

[Vacuum_tube(en.wikipedia.org)](https://en.wikipedia.org/wiki/Vacuum_tube)

![640px-Elektronenroehren-auswahl.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260547/ab03101e-8fd7-a6de-03b7-e76e43068e79.jpeg)

時代が前後しますが、タイミング的にはここが良いかなと思って **真空管** の説明を入れました。

**真空管** は、 **「フレミング左手の法則」でおなじみのジョン・フレミングによって 1904年に発明されました** 。
コンピュータ内では、よく知られているように 0 か 1 の情報だけやり取りします。これを電子回路で表現しようと思うと、 **0と1に対応する正確な電圧を生み出す装置が必要** になり、そういった用途で真空管が使われていました。

[コンピューターに入っている「トランジスタ」は何をしているのか？ - GIGAZINE](https://gigazine.net/news/20160607-how-transistor-work/) がとても参考になりました。


## ENIAC

[ENIAC(en.wikipedia)](https://en.wikipedia.org/wiki/ENIAC)

![638px-ENIAC_Penn1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260547/ad020078-ca32-799b-59f1-53a8c69a278c.jpeg)

> ENIAC (Electronic Numerical Integrator and Computer)は、米国で最初に作られた電子的にプログラム可能なコンピュータでした。ENIACはコロッサスに似ていましたが、より高速で柔軟性があり、チューリング・コンプリートでした。コロッサスと同様に、ENIACの「プログラム」はパッチケーブルとスイッチの状態によって定義され、後に登場した保存されたプログラムの電子機械とはかけ離れたものでした。一度プログラムが書かれたら、それは機械的にプラグやスイッチを手動でリセットしてマシンにセットしなければなりませんでした。ENIACのプログラマーは6人の女性で、しばしば "ENIACガールズ "としてまとめて知られていた。

**ENIAC** は、アメリカで開発された **世界初の電子的汎用デジタルコンピュータ** です。 **チューリング完全** です。つまり、万能チューリングマシンと等価です。
しかし、ENIACの「プログラム」は、現代のコンピュータとは大きく異なり、パッチケーブルとスイッチの状態で定義されていました。
これを手作業で切り替えてプログラムをセットさせていたのは、 **６人の女性です。** 彼女たちは、現代では **ENIACガールズ** と呼ばれています。

![Two_women_operating_ENIAC.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260547/75f87eb8-6d33-c0ce-314f-6965a384b0dd.gif)
(**ENIACガールズ** と呼ばれていた女性プログラマー https://en.wikipedia.org/wiki/ENIAC より)

[The ENIAC Girls who revolutionised computer programming](https://www.girlmuseum.org/the-eniac-girls-who-revolutionised-computer-programming/) で "ENIACガールズ" についての記事がありましたので、引用します。

> 電子数値積分器とコンピュータは、ENIACの愛称で呼ばれ、最初の全電子プログラム可能なコンピュータでした。長さは80フィート、高さは8フィートでした。内部には18,000本の真空管が入っており、頭から足元まで3,000本以上のスイッチ、ワイヤー、ケーブルで覆われていました。

ENIACには、なんと18000本の真空管と、3000本以上のスイッチがありました。

元々、戦争中多くの女性によって、ミサイルが進む距離や、着弾箇所の計算が **手作業で** 行われていたらしく、その高速化を図るためにENIACが計画されました。

> この仕事は簡単だと考えたエンジニアたちは、この仕事をするために女性を募集することにしました。選ばれたのは、Jean Jennings Bartik、Marlyn Wescoff Meltzer、Ruth Lichterman Teitelbaum、Betty Snyder Holberton、Frances Bilas Spence、Kay Mauchly Antonelliの6人でした。

後に "ENIACガールズ" と呼ばれることになる彼女たちは、 **設計図の山を渡され、「これで機械の仕組みを考えて、プログラムの仕方を考えろ」** と言われたそうです。
数ヶ月かけて、マシン全体のプログラミングを完成させていきました。

しかし、ENIACガールズの活躍は、 1997年まで公開されていませんでした。彼女らの中の数人は、日の目を浴びることなく亡くなってしまったそうです。

さて、ここまで、 **電子的な汎用デジタルコンピュータの誕生** までを追ってきました。
次は、現代のコンピュータの仕組みそのものを決定付けた **ストアドプログラム** の概念を見てみます。

# 5. そして、現代のコンピュータへ　〜ストアドプログラム〜

「コンピュータ」はできたじゃないか！！おしまい！！
・・・と言いたくなりますが、話はここでは終わることは出来ません。

第二次世界大戦で絶賛開発されたコンピュータが、今のコンピュータアーキテクチャになるための重要なステップが第二次世界大戦末期に訪れます。

[von Neumann architecture](https://en.wikipedia.org/wiki/Von_Neumann_architecture) の歴史を引用しながら、解説をしていきます。

> 初期のコンピュータは固定プログラムを持っていました。非常にシンプルなコンピュータの中には、今でもシンプルさやトレーニング目的のためにこの設計を採用しているものもあります。例えば、机上電卓は（原理的には）固定プログラムコンピュータです。基本的な数学はできますが、ワープロやゲームはできません。

最初は、そろばんのようなアナログ装置から始まり、その次に、特定の計算をするためのシンプルなコンピュータが生まれました。
例えば、机上電卓は良い例です。数字や四則演算の記号を入力できますが、使用法は限定されています。
大体の場合、もっと他のことがしたい！と思うでしょう。

> 固定プログラムのマシンのプログラムを変更するには、マシンの再配線、再構築、再設計が必要です。初期のコンピュータは、特定のタスクのために「設計された」というほど「プログラムされた」ものではありませんでした。"再プログラム "は、可能な場合には、フローチャートや紙のメモから始まり、詳細なエンジニアリング設計、そして物理的にマシンを再配線して再構築するという手間のかかるプロセスを経て行われていました。ENIAC上でのプログラムのセットアップとデバッグには3週間かかることもありました。

電卓のような「固定プログラム」の場合、プログラムの変更には、 **マシンの再配線、再構築、再設計** が必要になり、大変な労力が必要となります。
そして、前章で紹介したようなコンピュータ、例えばENIACですら、物理的にマシンを再配線するなど手間がかかり、 **プログラムのセットアップとデバッグに３週間もかかっていた** そうです。

（現代のみなさんなら、結果が出るまで３週間かかるプログラムを書くことの絶望感はわかるでしょう）

## ENIACの後継機 EDVAC の設計が始まる

**EDVAC**とは、ENIACの次の世代のコンピュータです。ENIACが動き出す前の1944年に計画が始まりました。
この設計に携わったのが、 **ジョン・フォン・ノイマン** です。

![460px-JohnvonNeumann-LosAlamos.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260547/ac5a6d28-b7c3-f10c-b747-57817d4700a9.gif)

(https://en.wikipedia.org/wiki/John_von_Neumann より)

彼は、はっきりいって天才です。暗算とか超早かったらしいです。マジの人間コンピュータです。
そういうエピソードはぜひみなさんで調べてみてください。

そんな彼が、コンピュータの設計について書いた *EDVACに関する報告書の第一草稿* という文書が非常に有名です。

## *EDVACに関する報告書の第一草稿*

> EDVACに関する報告書の第一稿（一般的には第一稿と短縮される）は、ジョン・フォン・ノイマンによって書かれた101ページの不完全な文書で、1945年6月30日に機密扱いのENIACプロジェクトのセキュリティオフィサーであったハーマン・ゴールドスタインによって配布されました。この文書には、保存プログラムの概念を使用したコンピュータの論理設計の最初の公開された記述が含まれており、物議を醸してフォン・ノイマン・アーキテクチャとして知られるようになりました。

*EDVACに関する報告書の第一草稿* は、**ストアドプログラムの概念を使用したコンピュータの論理設計を初めて記述したもの** です。

**ストアドプログラム** とは何でしょうか？

## ストアドプログラムコンピュータ

[Stored-program_computer(en.wikipedia)](https://en.wikipedia.org/wiki/Stored-program_computer)

> ストアドプログラムコンピュータとは、プログラム命令を電子メモリに格納するコンピュータのことである。これは、プログラム命令がプラグボードまたは同様のメカニズムに格納されている機械とは対照的である。

**ストアドプログラム** とは、 **プログラムもメモリに載せちゃえばええやん！** という考え方です。

そして、さらに推し進めて、 **プログラムもデータも同じメモリに載せちゃえばええやん！** というアーキテクチャが **ジョン・フォン・ノイマン・アーキテクチャ** と呼ばれています。


・・・あれ？どこかで聞いた話のような・・・

そうです。 **万能チューリングマシンの考え方と似てますよね** 。
あるテーブ上に、別のチューリングマシンのテーブルを文字列にエンコードします。さらに、そのチューリングマシンへの入力もそのテープに書きます。
そして、万能チューリングマシンは、そのテープに書かれた情報を読み取って、元々のチューリングマシンの計算をシミュレートすることができます。
実は、ノイマンはチューリングの論文は知っていた上で影響を受けたことが分かっています。詳しくは後で述べます。

**話をストアドプログラムに戻します。**

今でこそ、「プログラムがメモリに保持されていること」は当然のことのように思えますが、ストアドプログラムコンピュータが生まれる前は、 **プラグボード(もしくは、コントロールパネル)** と呼ばれる電気回路の一部をそのまま挿入するコンピュータが使われていました。



![640px-Man_holding_an_IBM_control_panel.ds.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260547/a1051419-64cb-17e4-cdc2-84e42445fcc5.jpeg)
**プラグボードの例 (IBM コントロールパネル)** [Plugboard(en.wikipedia)](https://en.wikipedia.org/wiki/Plugboard)より

プログラム命令を組み込まれたプラグボードを挿入することで、デジタルコンピュータとして電気回路が完成し、その命令を計算ができるようになるのです。

一方、ストアドプログラムコンピュータは、プラグボードのコンピュータとは **対照的** です。
ストアドプログラムでは、プログラム命令がメモリ上に保持されているので、それを変えれば、異なる命令を実行できます。

## ノイマン型(フォン・ノイマン・アーキテクチャ)

[Von_Neumann_architecture(en.wikipedia)](https://en.wikipedia.org/wiki/Von_Neumann_architecture)

> フォン・ノイマン・アーキテクチャ（フォン・ノイマン・モデル、プリンストン・アーキテクチャとも呼ばれる）は、ハンガリー系アメリカ人の数学者で物理学者のジョン・フォン・ノイマンらが1945年に発表した「EDVACに関する報告書の第1次草案」に基づいたコンピュータ・アーキテクチャです。

![800px-Von_Neumann_Architecture.svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260547/78fe0b76-0040-e0e9-99e0-eaa371b35cb9.png)
([Von_Neumann_architecture(en.wikipedia)](https://en.wikipedia.org/wiki/Von_Neumann_architecture) より)

ここまで長々とまとめてきて、この記事はここを説明するためにあったんだと、しみじみと思いながら書いています。

上の画像に合わせて各パーツを紹介します。
ノイマン型アーキテクチャの最も重要なパーツは、以下の３つです。

- **Control Unit (制御装置)**
- **Processing Unit (処理装置)**
- **Memory Unit (メモリ)**

です。

### Memory Unit (メモリ)

データや命令を記憶するための場所です。
すごい雑に書くと、下みたいな感じでデータと命令が同じメモリ上に記憶されています。細かい記憶の形式をここでは問いたくないのですが、 **データと命令が同じメモリに記憶されている** ことを理解していただければと思います。

> <------- データ---><----------- 命令-------------><---------------データ-----------><-------命令--------->

ノイマンは、[EDVACに関する報告書の第一草稿(en.wikipedia.org)](https://en.wikipedia.org/wiki/First_Draft_of_a_Report_on_the_EDVAC) の中でこう述べています。

> "デバイスはかなりのメモリを必要とします。このメモリの様々な部分が、その性質や目的が大きく異なる機能を実行しなければならないように見えましたが、それにもかかわらず、メモリ全体を一つの器官として扱い、上で列挙した様々な機能のために、その部分を可能な限り交換可能にしておくことは魅力的です。" (第2.5節)

一見、データと命令を同じ装置にまとめるとなると、サイズも大きくなるし、大変だろうと考えるのが普通の人だと思いますが、ノイマンは、 **データでも命令のどちらでも使えるメモリ** の意義を見出していました。

しかし、この共通化によって、CPUが少ない命令で大量のデータを処理するときに実効処理速度が低下する **フォン・ノイマン・ボトルネック** が生まれるわけです。
CPUが早くなればなるほど、速度差が大きくなります。これからの時代、どうなっていくのでしょうね。専門家がんばれ。

### Control Unit (制御装置)

**制御装置** は、メモリ上にあるプログラムの場所を指し示す **プログラムカウンタ** と、実行する命令コードを保存しておく **命令レジスタ** を内蔵しています。
これによって、メモリに展開されているプログラムのどこを実行しているかや、実際にどんな命令を実行するかをコントロールすることができるようになります。


> <------- データ---><----xxx(プログラムカウンタが指す命令)------ 命令-------------><---------------データ-----------><-------命令--------->

ノイマンは、「命令」というものを **コード** と呼びました。現代では、 **命令** は **InstructionとかOrderとか** と呼ばれています。
この命令コードは、CPUにめっちゃ依存します。この命令コードを集めた **命令セット(Instruction set)** は、 **x86** など有名です（長くなるのでまた今度）。


### Processing Unit (処理装置)

**処理装置** は、四則演算や論理演算をする **Arithmetic/Logic Unit(算術論理ユニット)** と、素早くデータにアクセスするために少量のデータを置いておく **プロセッサレジスタ** を内蔵しています。

さて、なんで少量のデータを置くレジスタなんてものが必要なのでしょうか？

メモリのアクセスは、算術論理ユニットによる計算と比較すると、桁レベルで遅いです。（それでも人間レベルでは早いですが）
計算するたびに、いちいちメモリに値を保存しに行くよりは、高速にアクセスできる記憶できる場所であるプロセッサレジスタを処理装置の中に作ってあげた方が、全体の計算時間が短くなります。

かなり、ざっくり説明してしまいましたが、気になる方は、[Processor register(en.wikipedia.org)](https://en.wikipedia.org/wiki/Processor_register)を見てみてください。

# その後
トランジスタの開発とか、様々なCPUや命令セットアーキテクチャが生まれたことなど、語りたいことはたくさんあるのですが、記事が長くなりすぎるので、ここまでにしておきます。



# まとめ

ここまで読んでいただき、本当にありがとうございました。
最初にこの記事を書こうと思ってから材料集めから記事を書き終えるまで数週間かかりました（汗）。
私の（元）専門は地球物理で、大学の先生が昔Fortranのプログラム入力でパンチカードを使ってた話などを聞いていたので、バベッジの頃からあるんだなと思って感慨にふけっていました。

とにかく、私がこの記事で伝えたかったことは、

**コンピュータって面白い**

ということに尽きます。

古代ギリシャに作られたAntikythera機構から始まり、先進的な設計のバベッジの解析機関を説明しました。
そして、第二次世界大戦直前のチューリングが考え出したチューリングマシンや万能チューリングマシンの概念。
第二次世界大戦中に各国で実現されていった「デジタルコンピュータ」も見てきました。

そして、最後は、現代のコンピュータの礎となったストアドプログラムの考えや、ジョン・フォン・ノイマン・アーキテクチャも見ました。

ここまで読んでくださったあなたであれば、私が記事の最初に提示した疑問にも答えられることかと思います。

> **「どうやってコンピュータって動くの？」**

ほんとうの意味で動いている原理を説明しだすと、電磁気学からになってしまいますが、メモリやCPUの役割などざっくりとした概念は説明できるのではないでしょうか。
CPUも単なる計算装置と思われがちですが、実は、メモリにあるプログラムを読み取ったり、メモリにデータを書きに行ったり色々やってくれる働き者だったわけです。

私自身、一人のプログラマとして、日々プログラムを書いているわけですが、 **メモリ上にプログラムが置かれていて、簡単に修正可能になっていることが、どれほど偉大なことであるのか** ということに気付かされました。

この記事を読んで、 **コンピュータアーキテクチャに興味を持ってくれる** 方がいれば、著者冥利に尽きます。

[ざわきん/zawakin](https://twitter.com/zawawahoge)という名前で、Twitterもやっているので、記事の感想やコメントをツイートしてくださると嬉しいです。
専門家の方からの「ここは間違ってるよ！」とか「曖昧過ぎない？」などの指摘も歓迎です！

# おまけ チューリングとノイマンの関係性

[von Neumann architecture](https://en.wikipedia.org/wiki/Von_Neumann_architecture) によると、チューリングとノイマンが知り合ったのは、1935年の頃らしいですが、そのときにノイマンがチューリングの論文を知っていたかどうかは明らかではない、とあります。


> 独立して、ペンシルバニア大学のムーア電気工学部でENIACを開発していたJ Presper EckertとJohn Mauchlyは、1943年12月にストアドプログラムの概念について書いています。エッカートは新機械EDVACを計画するにあたり、1944年1月に、新しいアドレス可能な記憶装置である水銀金属遅延線メモリにデータとプログラムを格納すると書いている。これが、実用的なストアドプログラムマシンの建設が提案された初めてのことであった。この時、彼とモークリーはチューリングの研究を知らなかった。

ENIACを開発していたエッカートとモークリーは、チューリングの研究を知らなかったらしいですが、ノイマンは、チューリングのアイデアを尊重していたと述べる人もいます。
ノイマンの同僚だったスタン・フランケルはこう述べています。

> *私は、1943年か44年頃にフォン・ノイマンが1936年のチューリングの論文の根本的な重要性を十分に認識していたことを知っています...フォン・ノイマンは私にその論文を紹介してくれました。多くの人がフォン・ノイマンを「コンピュータの父」(現代的な意味での)と称賛していますが、私は彼自身がそのような過ちを犯すことはなかったと確信しています。彼は助産師と呼ばれているかもしれませんが、私や他の人たちには、基本的な概念はバベッジが予想していなかった限りにおいてチューリングによるものであることをしっかりと強調していました...*

ノイマンは、後世になると **「コンピュータの父」** と呼ばれることになりますが、そんな周りとは裏腹に、チューリングの論文の根本的な重要性について尊重していたようです。

また、スタン・フランケルは続いてこう述べています。

> *もちろんチューリングとフォン・ノイマンは、これらの概念の「実践への還元」にもかなりの貢献をしましたが、私はこれらを、活動のプログラムをメモリに保存し、活動の過程でそのプログラムを修正することができるコンピュータの概念の導入と説明に匹敵する重要性とは考えていません。* 

ここは重要な指摘だと思いました。いくら理論を作り出しても、「実践への還元」が出来なければ、技術としては空想のもので終わってしまいます。
第二次世界大戦前後には、「コンピュータの誕生」という大きなうねりが起こりました。

ただ、その実践以上に、**既存の「コンピュータ」の概念を覆し、ストアドプログラムという新時代のコンピュータの礎を築いたチューリングやノイマンの功績は計り知れない** ものだと思いました。