『コンピュータのしくみを理解するための10章』- 第1章まとめ


『コンピュータのしくみを理解するための10章』という本の第1章「コンピュータの動く基本」についてまとめた。

[Amazon.co.jp： コンピュータのしくみを理解するための10章: 馬場 敬信: 本](http://www.amazon.co.jp/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AE%E3%81%97%E3%81%8F%E3%81%BF%E3%82%92%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE10%E7%AB%A0-%E9%A6%AC%E5%A0%B4-%E6%95%AC%E4%BF%A1/dp/4774124222)

## 電卓とコンピュータの違い
電卓の機能はほぼコンピュータにおいても対応する機能に置き換えできる

- 電卓の表示部 → ディスプレイ
- 入力ボタン → キーボード
- 演算機能 → CPU

では一体何が違うのか。それは、 **電卓では計算手順が使用者の頭の中にあるのに対して、コンピュータでは計算手順そのものもメモリに記憶している** 点である。この方式を「プログラム内蔵方式」と呼ぶ

## プログラム内蔵方式
プログラム内蔵方式はフォン・ノイマンが初めて公にした。それ以降、プログラム内蔵方式を採用したコンピュータを「ノイマン型コンピュータ」と呼ぶようになった。

1946年、世界初の電子計算機「 **ENIAC** 」が発表されたが、ENIACはプログラム内蔵方式ではなかった。ENIACは設定に手間がかかったり変更が困難という問題があり、このような問題を解決するためにノイマンの提案に従って作られたのが「 **EDSAC** 」である。つまりEDSACがプログラム内蔵方式を採用した世界初のコンピュータである。

現在のコンピュータは全てこのプログラム内蔵方式になっている。

## コンピュータの中を見る
プログラム内蔵方式は、データとともに操作手順もメモリに格納すると言った。しかし、具体的にどのようにしてデータと操作手順をメモリにおいて処理をしているのか

まず必要となるのが、メモリのアドレス（番地）付けである。これにより、メモリ中におかれたデータあるいは操作手順の読み書きをアドレスを指定して実行できるようになる

■ メモリの中のイメージ図
![コンピュータの仕組みを理解するための10章.001.png](https://qiita-image-store.s3.amazonaws.com/0/2813/fb3addd5-4d65-ab87-7d33-9e9420ec9532.png "コンピュータの仕組みを理解するための10章.001.png")

上の図は次の内容を示している

- 0番地から6番地に操作の手順とデータを保存している
- 0番地から3番地までに4つの命令がある
- 4番地と5番地に各命令から参照されるデータ1と2がある
- 演算結果を格納するために6番地は空けてある

### 演算制御装置
先の図のように、メモリに置いたこれらの命令列を処理するためには、命令を読みだして命令の指示する操作を実行する仕組みが必要になる。この操作を行うため、「 **演算制御装置** 」をメモリの上に追加しなけらばならない。

■ 演算制御装置とメモリのイメージ図
![コンピュータの仕組みを理解するための10章.004.png](https://qiita-image-store.s3.amazonaws.com/0/2813/219b5aba-e340-806f-de2e-d1fc86f5e64c.png "コンピュータの仕組みを理解するための10章.004.png")

|演算制御装置名|役割|
|:--|:--|
|プログラムカウンタ<br>（PC: Program Counter）|実行中の命令のアドレスを保持する。次の命令のアドレスを計算する機能をもっているので、「カウンタ」と呼ばれている|
|命令レジスタ<br>（IR: Instruction register）|メモリから読みだした命令の入れ物|
|汎用レジスタ<br>（R: Register）|データを置いておくための入れ物|
|加算器<br>（adder）|足し算を行うための制御装置|

## コンピュータにおける命令サイクル
ここまでで必要な道具は揃ったので、次に具体的にどのように処理が実行されていくのかを見ていく。

まず、プログラムカウンタの指す命令の読み出しに始まり、読みだした命令の実行、そして次の命令の読み出しのためのプログラムカウンタの設定へと進んで元に戻る。この繰り返しは「命令サイクル」と呼ばれる。

■ 命令サイクルのイメージ図
![コンピュータの仕組みを理解するための10章.002.png](https://qiita-image-store.s3.amazonaws.com/0/2813/e75f7119-08b1-1c12-6a63-7e344de57512.png "コンピュータの仕組みを理解するための10章.002.png")

先ほどの「メモリの中のイメージ図」を例に具体的な処理を追うと次のようになる

1. プログラムカウンタを0にセットして実行開始
2. プログラムカウンタが指す0番地の命令（= 4番地の内容を持ってくる）を命令レジスタに読み出す
3. 読みだした命令（= 4番地の内容を持ってくる）を実行する。結果、値1が汎用レジスタに設定される
4. プログラムカウンタの値を変更して（この場合は1を加えて）、次に実行する命令のアドレス（= 1）にする
5. 1番地の命令を命令レジスタに読み出す
6. 読みだした命令（= 5番地の内容を加える）を実行する。結果、加算処理が行われ汎用レジスタに3が設定される
7. プログラムカウンタの値を変更して、次に実行する命令のアドレス（= 2）にする
8. プログラムカウンタが指す2番地の命令を（= 結果を6番地に格納する）を実行する
9. 6番地に汎用レジスタの値（= 3）が格納される
10. プログラムカウンタの値を変更して、次に実行する命令のアドレス（= 3）にする
11. 読みだした命令（= 停止する）を実行する
12. 実行した結果、処理が終了する

**このように、プログラム内蔵方式では、プログラムカウンタの指すアドレスにあるものは全て命令とみなされ、実行される**

## コンピュータの基本構成
コンピュータの基本構成はざっくり次の図のようになる
![コンピュータの仕組みを理解するための10章.003.png](https://qiita-image-store.s3.amazonaws.com/0/2813/71eb2659-0fc5-2ae3-2e47-2b560018a8de.png "コンピュータの仕組みを理解するための10章.003.png")

- まず、入力装置からプログラムとデータが読み込まれる
- 読み込まれたデータは記憶装置に記憶される
- プログラムを構成する命令は制御装置へと読み出される
- 命令は解読され、制御信号となってコンピュータの各部へ送られる
- この制御によって記憶装置からデータが読み出されて演算装置に送られ、演算が行われて再度記憶装置に書き戻される
- 演算結果は最終的に、出力装置から出力される


## プログラム内蔵方式コンピュータの特徴のまとめ

### プログラム内蔵方式コンピュータの3つの特徴
#### アドレス付け可能なメモリ
記憶装置にはアドレスが付けられ、アクセスする命令やデータはこのアドレスを用いて指定される

#### プログラムカウンタの指定による逐次的な実行
命令はプログラムカウンタの指定に従って逐次的に選ばれ、読みだしと実行が行われる。このため、命令単位で見ると処理は逐次的である

#### 命令とデータの混在
メモリ上の命令とデータの本質的な区別はない。
**プログラムカウンタによって指定され、制御装置に読み出されたものが命令として扱われる**

### プログラム内蔵方式コンピュータの能力
上述の特徴から、プログラム内蔵方式コンピュータには次のような能力がある

#### 自分で自分自身を制御する能力
メモリに記憶したプログラムを読みだして実行することによって、自分自身を制御する

#### 制御内容を変更する能力
メモリの内容を書き換えることによってデータだけでなく制御内容をも変更する能力を持つ

### プログラム内蔵方式の問題点
#### ノイマンボトルネック
命令もデータも記憶装置におくため、これを制御装置あるいは演算装置に送るために記憶装置との間で頻繁に命令やデータの往来が必要になる。つまり、CPUとメモリの間がネックになりやすい。これをノイマンボトルネックと呼ぶ

#### 命令実行の逐次性
命令の実行は基本的に逐次的であるため、これが高速化のネックになる