※小説ではない※専門書 要約資料集 為替(換算)3.9万円でもらう 紐解集生成 専門 初入門 資料 作:{作者名}
> 学問の宇宙・応用の軌道ステーション群(工学)「作る力と生きる力シリーズ」計算機文明部 第3巻。ガイド役: Fable 5 監修 / Sonnet 5 執筆(脚本班)
> トーン規約: GAKUMON_UNIVERSE.md準拠。専門用語は初出で必ず説明する。
> **安全枠(§16.18・BOOK-0300と同じ規約を継承・絶対厳守)**: 本冊が扱う実験・作例は、乾電池(単三形1.5V・単四形1.5V・角形9V等)およびUSB電源(5V)の範囲に限定する。家庭のコンセントにつながる交流100Vの配線工事・改造は、電気工事士法により電気工事士の資格を持たない者が行うことを固く禁じられている。本冊はその種の実配線の手順を一切示さず、扱うのはあくまで乾電池・USBという低電圧の直流電源だけである。
> 接続先: →BOOK-0300(回路の読み方と設計・電子回路の基礎はそちらが土台)、→BOOK-0340(OSを作るということ・ハードウェアの上に乗るソフトウェア)、→BOOK-0343(情報構造の設計)。
> 水準: 一〜十二(スイッチのON/OFFがなぜ0と1になるのかという入口から、レジスタとクロックで簡単な計算がどう進むかという出口までを扱う)。
# BOOK-0342 作る力と生きる力: 論理回路からCPUへ — 0と1でできた小さな部品が、なぜプログラムになるのか
> 学問の宇宙・応用の軌道ステーション群(工学)「作る力と生きる力シリーズ」計算機文明部 第3巻。ガイド役: Fable 5 監修 / Sonnet 5 執筆(脚本班)
> トーン規約: GAKUMON_UNIVERSE.md準拠。専門用語は初出で必ず説明する。
> **安全枠(§16.18・BOOK-0300と同じ規約を継承・絶対厳守)**: 本冊が扱う実験・作例は、乾電池(単三形1.5V・単四形1.5V・角形9V等)およびUSB電源(5V)の範囲に限定する。家庭のコンセントにつながる交流100Vの配線工事・改造は、電気工事士法により電気工事士の資格を持たない者が行うことを固く禁じられている。本冊はその種の実配線の手順を一切示さず、扱うのはあくまで乾電池・USBという低電圧の直流電源だけである。
> 接続先: →BOOK-0300(回路の読み方と設計・電子回路の基礎はそちらが土台)、→BOOK-0340(OSを作るということ・ハードウェアの上に乗るソフトウェア)、→BOOK-0343(情報構造の設計)。
> 水準: 一〜十二(スイッチのON/OFFがなぜ0と1になるのかという入口から、レジスタとクロックで簡単な計算がどう進むかという出口までを扱う)。
---
## 入口の物語 — 「このAND回路は、さっきのif文と同じことをしている」
BOOK-0300で回路図の記号を覚え、オームの法則で検算できるようになった新人技師は、半年後、格納庫の奥にある小さな作業机に呼ばれた。机の上には、乾電池(角形9V)一本と、三つのスイッチ、三つのLEDが載った学習用トレーナー基板が置かれている。基板には「AND」「OR」「NOT」という三つの文字が印刷され、それぞれのブロックにスイッチとLEDがつながっていた。
「これを触ってみてくれ」と先輩は言い、隣のノートパソコンの画面を指した。画面には、こんな短いプログラムが表示されている。
```
if (スイッチA が ON) and (スイッチB が ON):
LEDを点灯する
```
新人技師はまず基板の「AND」と書かれたブロックのスイッチAとスイッチBを両方ONにしてみた。LEDが灯る。片方だけをOFFに戻すと、LEDは消える。両方OFFでも消えたままだ。「プログラムの`if`文とスイッチの動きが、同じ答えを返している」と気づいた新人技師に、先輩はうなずいた。
「その通り。実はコンピュータの中には、いま君が指で動かしたのとまったく同じ回路――ANDやOR、NOTと呼ばれるごく単純な部品――が、何十億個も詰まっている。プログラムを書くとき、君は`if`や`for`という文字で条件や繰り返しを書くけれど、それがコンピュータの中で実際に実行されるときには、必ずこうした単純な部品の組み合わせに姿を変えている。今日から、その変換の道筋を、下から一段ずつ登ってもらう」。
先輩はさらに続けた。「スイッチのON/OFFが0と1になるところから始めて、AND・OR・NOTを組み合わせて足し算をする回路を作り、値を覚えておく部品を知り、最後にはレジスタとクロックだけで簡単な計算が一歩ずつ進んでいく様子まで、実際に手を動かしながら追いかけてもらう。すべて乾電池とUSB電源だけで確かめられる範囲の話だ」。
この一言が、計算機文明部第3巻の出発点になる。回路図を読む力(→BOOK-0300)の先に、論理回路の部品一つひとつがプログラムのどの文法に対応するのかを積み上げ、最後にCPUという小さな計算装置がどう動いているのかを見晴らすところまでを、本冊は目指す。
---
## 第一章: スイッチのON/OFFが0と1になる理由(水準一)
### なぜ「2つの状態」しか使わないのか
BOOK-0300で扱った電池・抵抗器・LEDの回路は、電圧や電流を細かい数値(3V、15mAなど)として扱ってきた。しかし論理回路の世界では、電圧の細かい値そのものにはあまり意味を持たせず、代わりに「電圧が高いか、低いか」という2つの状態だけに注目する。この考え方でつくられた信号を**デジタル信号(でじたるしんごう、水準一: 電圧の細かい値ではなく、高い/低いという2つの状態だけで情報を表す信号)**と呼び、2つの状態のうち高いほうを**1**、低いほうを**0**という数字で表す約束になっている。
なぜ細かい電圧の値を使わず、2つの状態だけに単純化するのか。電子回路には、配線のわずかなノイズや部品ごとのばらつきによって、電圧が少しだけ想定と違う値になることがよくある。もし「2.3Vなら情報A、2.4Vなら情報B」というように細かい電圧の違いに意味を持たせてしまうと、わずかなノイズだけで情報が入れ替わってしまう。しかし「1.5V以下なら0、3V以上なら1」というように大きな幅で2つの状態に分けてしまえば、多少のノイズが乗っても0か1かの判定は揺らがない。この頑丈さこそが、コンピュータの内部でデジタル信号が使われる最大の理由である。
### ビットという最小単位
0か1かという、たった1個ぶんの情報量を**ビット(bit、水準一: 0か1かのどちらかを表す、情報の最小単位)**と呼ぶ。ビットを複数並べれば、0と1だけの組み合わせでもっと大きな数を表せるようになる。この0と1だけを使って数を表す方法を**二進数(にしんすう、水準一: 0と1の2種類の数字だけを使って数を表す方法)**と呼び、普段使う十進数の5は二進数では「101」、十進数の7は二進数では「111」と表される(BOOK-0002算術シリーズで十進数の桁上がりを扱った内容と、仕組みは同じで、使う数字が0〜9の10種類から0と1の2種類に変わっただけである)。
```
1本のスイッチと1個のLED、乾電池(単三形1.5V)1本の回路:
スイッチが開いている(OFF) → LED消灯 → これを「0」と読む
スイッチが閉じている(ON) → LED点灯 → これを「1」と読む
```
この、たった1本のスイッチと1個のLEDの回路こそが、コンピュータが扱う情報の最小単位「1ビット」の正体である。次章から、この0と1の組み合わせを操る部品を一つずつ見ていく。
---
> **定着量の目安(第一章)**: デジタル信号・ビット・二進数という3つの用語と、「なぜ2状態に単純化するとノイズに強くなるのか」という理由づけを、自分の言葉で説明できるようにするには、身の回りの二値な物事(スイッチ・信号機の色・出席簿の○×など)を5つ挙げて「これは0/1で表せるか」を判定する練習を10問程度こなすと、ほぼ完全に定着すると見込まれる。
---
## 第二章: AND回路とif文の対応(水準二)
### スイッチを直列につなぐとANDになる
複数のビットを受け取り、決まった規則にしたがって1つのビットを出力する部品を**論理回路(ろんりかいろ、水準二: 0と1の入力を受け取り、決まった規則で0か1を出力する回路)**と呼ぶ。その中でもっとも基本的な部品の一つが、BOOK-0300で紹介したスイッチを2つ直列につないだ回路である。
```
AND回路(直列スイッチ):
電池+ ──[スイッチA]──[スイッチB]──(LED)── 電池−
A=0 または B=0 → 電流の通り道が途中で切れる → LED消灯(出力=0)
A=1 かつ B=1 → 電流が最後まで通る → LED点灯(出力=1)
```
この回路は「AとBが両方とも1のときだけ、出力が1になる」という規則を持っている。この規則を**AND回路(論理積回路、水準二: 2つ以上の入力がすべて1のときだけ、出力が1になる回路)**と呼ぶ。入力と出力の組み合わせをすべて表にしたものを**真理値表(しんりちひょう、水準二: 論理回路の、すべての入力の組み合わせに対する出力をまとめた表)**と呼ぶ。
### 検算1 — AND回路の真理値表
```
A B 出力(A AND B)
0 0 0
0 1 0
1 0 0
1 1 1
```
4通りの組み合わせのうち、出力が1になるのは「A=1かつB=1」の1通りだけである。
### プログラムのif文との対応
この規則は、プログラムを書くときに使う`if`文の条件式と、驚くほど正確に対応している。多くのプログラミング言語では、2つの条件がどちらも成り立つときだけ処理を実行したい場合、`&&`という記号(AND演算子)を使って条件をつなぐ。
```
if (A が真) && (B が真):
処理を実行する
```
この`if (A && B)`という一行が実行されるとき、コンピュータの内部では、まさに検算1の真理値表とまったく同じ規則を持つAND回路が、AとBの信号を受け取って0か1かを判定している。プログラムの文字づらは「A かつ B」という日本語(あるいは英語)の言い回しだが、その裏側で実際に動いているのは、スイッチを2つ直列につないだのと同じ、単純な電子部品の集まりなのである。
---
> **定着量の目安(第二章)**: AND回路の真理値表(4行)を暗記ではなく「直列だから両方通らないと電流が届かない」という理屈から即座に再現できるようにし、`if (A && B)`という書き方とAND回路の対応を説明できるようにするには、入力の組み合わせを変えたAND判定ドリルを20問程度こなすと、ほぼ完全に定着すると見込まれる。
---
## 第三章: OR回路とif文の拡張(水準三)
### スイッチを並列につなぐとORになる
スイッチを直列ではなく並列につなぐと、AND回路とは異なる規則を持つ回路ができる。
```
OR回路(並列スイッチ):
電池+ ──┬─[スイッチA]─┬── (LED) ── 電池−
└─[スイッチB]─┘
A=0 かつ B=0 → どちらの道も電流が通らない → LED消灯(出力=0)
A=1 または B=1(両方でも可) → どちらかの道を電流が通る → LED点灯(出力=1)
```
この「AとBのどちらか一方でも1なら、出力が1になる」という規則を持つ部品を**OR回路(論理和回路、水準三: 2つ以上の入力のうち、どれか1つでも1なら、出力が1になる回路)**と呼ぶ。BOOK-0300第四章で扱った並列回路(道が増えるほど電流が流れやすくなる)の考え方が、ここでは「どちらかの条件が満たされれば十分」という論理の規則として現れている。
### 検算2 — OR回路の真理値表
```
A B 出力(A OR B)
0 0 0
0 1 1
1 0 1
1 1 1
```
4通りのうち、出力が0になるのは「A=0かつB=0」の1通りだけであり、それ以外の3通りはすべて出力が1になる。
### プログラムの||演算子との対応
プログラムでは、2つの条件のうちどちらか一方でも成り立てば処理を実行したいとき、`||`という記号(OR演算子)を使う。
```
if (A が真) || (B が真):
処理を実行する
```
`if (A || B)`という一行の裏側で動いているのが、検算2の真理値表を持つOR回路である。第二章のANDと合わせると、`&&`と`||`という2つの記号だけで、プログラムのほとんどの条件判断が組み立てられていることがわかる。そしてその2つの記号は、それぞれ「スイッチの直列つなぎ」と「スイッチの並列つなぎ」という、BOOK-0300ですでに学んだ2種類の配線方法にそのまま対応している。
---
> **定着量の目安(第三章)**: OR回路の真理値表と`if (A || B)`の対応、そしてAND(直列)とOR(並列)という配線の違いが論理の違いに対応する点を身につけるには、AND判定とOR判定を混ぜた識別ドリルを20問程度こなすと、ほぼ完全に定着すると見込まれる。
---
## 第四章: NOT回路とブール代数の基礎(水準四〜五)
### 信号をひっくり返すNOT回路
AND・ORに続く3つ目の基本部品は、入力をそのまま反転させて出力する回路である。これには単純なスイッチの組み合わせでは作れず、BOOK-0005・BOOK-0300で紹介した**トランジスタ(でんりゅうを電気的に流したり止めたりできる、電子スイッチとして働く半導体部品)**を使う。
```
NOT回路(トランジスタによる反転):
電池+ ──[抵抗]──┬── 出力Y
│
[トランジスタ]── 電池−
│
入力A
A=0(信号なし) → トランジスタは電流を通さない → Yは電池+側の電圧のまま(出力=1)
A=1(信号あり) → トランジスタが電流を通す → Yが電池−側に引き込まれる(出力=0)
```
入力が0のときは出力が1に、入力が1のときは出力が0になる。この「入力をそのまま反転させる」規則を持つ回路を**NOT回路(論理否定回路、水準四: 入力が0なら1を、1なら0を出力する回路)**と呼ぶ。プログラムでは`!`という記号(否定演算子)を使い、`!A`と書けば「Aではない」という意味になる。`if (!A)`は「Aが偽のときだけ処理する」という意味であり、これはNOT回路の出力をそのまま条件判定に使っているのと同じである。
### ブール代数とXOR — もう一つの組み合わせ
AND・OR・NOTという3つの部品を使って、0と1の計算規則を体系的にまとめた数学の分野を**ブール代数(ぶーるだいすう、水準五: 0と1という2つの値だけを使って、AND・OR・NOTの組み合わせで論理を計算する数学の体系)**と呼ぶ。イギリスの数学者**ジョージ・ブール(George Boole、1815-1864)**が1854年の著書『思考の法則の研究(An Investigation of the Laws of Thought)』の中で、この体系の土台を築いたとされる。その約80年後、アメリカの技術者**クロード・シャノン(Claude Shannon、1916-2001)**が1937年の修士論文の中で、ブール代数がスイッチ回路の設計にそのまま応用できることを示し、この対応関係が、今日のデジタル回路設計の出発点になったとされている。
AND・OR・NOTを組み合わせると、さらに複雑な規則を持つ回路を作れる。その代表例が、「AとBのうち、ちょうど一方だけが1のときに出力が1になる」という規則を持つ**XOR回路(排他的論理和回路、水準五: 2つの入力のうち、ちょうど一方だけが1のときに出力が1になる回路)**である。
### 検算3 — XOR回路の真理値表と身近な実例
```
A B 出力(A XOR B)
0 0 0
0 1 1
1 0 1
1 1 0
```
XORは`(A AND NOT B) OR (NOT A AND B)`という組み合わせで作れる。実は、この回路の実例は多くの家の階段の照明スイッチにすでに使われている。階段の上と下、両方に照明スイッチがある家では、どちらのスイッチを押しても照明のON/OFFが切り替わる。これは「上下どちらのスイッチの状態が一致しているか、食い違っているか」によって照明の点灯が決まる、XOR回路と同じ論理を、機械式のスイッチの配線だけで実現した身近な例である。
---
> **定着量の目安(第四章)**: NOT回路の反転規則、`!`演算子との対応、ブール代数という体系の名前と成り立ち、XOR回路の真理値表を身につけるには、AND・OR・NOT・XORの4種類を混ぜた真理値表の穴埋めドリルを30問程度こなすと、水準四〜五の内容がほぼ完全に定着すると見込まれる。
---
## 第五章: 半加算器・全加算器 — 関数という部品のかたまり(水準六)
### 部品を「まとめて名前を付ける」という発想
ここまでのAND・OR・NOT・XORは、いずれも回路図の中の小さな1部品である。しかし実際の設計では、複数の部品を組み合わせて「1つのまとまった機能」を作り、その機能に名前を付けて、まるで1個の部品であるかのように扱うことがよくある。プログラミングで言えば、これは複数の処理をひとまとめにして名前を付ける**関数(かんすう、水準六: 複数の処理をひとまとめにし、入力を受け取って出力を返す、名前の付いた処理のかたまり)**という考え方に、そのまま対応する。
その最初の例が、二進数の足し算を行う回路である。AとBという1ビットずつの入力を受け取り、その和(Sum)と桁上げ(Carry、けたあげ)を出力する回路を**半加算器(はんかさんき、水準六: 1ビットの入力2つを受け取り、和と桁上げを出力する、足し算のための回路)**と呼ぶ。
```
半加算器 = XOR回路1個 + AND回路1個
Sum = A XOR B (和のビット)
Carry = A AND B (桁上げのビット)
```
### 検算4 — 半加算器で1+1を計算する
```
A=1, B=1 のとき:
Sum = 1 XOR 1 = 0
Carry = 1 AND 1 = 1
→ 出力は「Carry, Sum」= 「1, 0」= 二進数の「10」= 十進数の2
```
1+1=2という、誰もが知っている計算が、XOR回路とAND回路という2つの単純な部品の組み合わせだけで、正しく導かれている。
### 全加算器 — 下の桁からの桁上げも受け取る
半加算器は下位の桁からの桁上げを受け取れないため、2桁以上の足し算には使えない。そこで、下位からの桁上げ(Cin、キャリーイン)も入力に加えた回路を**全加算器(ぜんかさんき、水準六: 1ビットの入力2つと、下位桁からの桁上げを合わせた3つの入力を受け取り、和と新たな桁上げを出力する回路)**と呼ぶ。全加算器は半加算器2個とOR回路1個を組み合わせて作れる。
### 検算5 — 全加算器で1+1+1を計算する
```
A=1, B=1, Cin=1 のとき:
Sum = 1
Cout = 1
→ 出力は「Cout, Sum」= 「1, 1」= 二進数の「11」= 十進数の3
```
1+1+1=3という計算が、全加算器という「半加算器2個+OR回路1個」のまとまりによって、正しく導かれている。全加算器を何個も横につなげば、何ビットでも桁上げを伝えながら足し算を続けられる。プログラムの側から見れば、この全加算器は「2つの数値と繰り上がりを受け取り、和と新しい繰り上がりを返す関数」そのものであり、複数の全加算器をつなげる配線は、その関数を繰り返し呼び出しながら結果を積み上げていく処理に対応している。
---
> **定着量の目安(第五章)**: 半加算器(XOR+AND)と全加算器(半加算器2個+OR)の構成、そして「部品のまとまりに名前を付ける」という発想がプログラムの関数に対応する点を身につけるには、1桁・2桁の二進数足し算を回路の式で追う演習を15問程度こなすと、水準六の内容がほぼ完全に定着すると見込まれる。
---
## 第六章: マルチプレクサとフリップフロップ — 選ぶ回路と覚える回路(水準七〜八)
### 複数の入力から1つを選ぶ回路
プログラムには、複数の選択肢の中から条件に応じて1つを選ぶ`switch`文や、配列の中から添字(インデックス)で1つの要素を選び出す処理がある。これに対応する回路が**マルチプレクサ(選択回路、水準七: 複数の入力の中から、選択信号によって指定された1つだけを出力する回路)**である。マルチプレクサは、内部にAND回路とOR回路を組み合わせて作られており、選択信号のビットパターンによって「どの入力を通すか」をAND回路で絞り込み、最後にOR回路でまとめて1本の出力にする、という仕組みで動く。逆に、1つの入力信号を選択信号に応じて複数の出力先のどれか1つへ振り分ける回路を**デコーダ(水準七: 1つの入力を、選択信号に応じて複数の出力先のどれか1つへ振り分ける回路)**と呼ぶ。
### 値を覚えておく回路 — フリップフロップ
ここまでの回路(AND・OR・NOT・半加算器・マルチプレクサ)には、共通する弱点がある。それは、入力を変えた瞬間に出力もすぐ変わってしまい、「さっき入力した値」を後で取り出すことができない点である。プログラムで言えば、変数に一度代入した値を、後の行で読み出せなければ意味がない。この「値を保持し続ける」という機能を持つ回路が**フリップフロップ(水準八: 一度入力された0か1の値を、次に書き換えられるまで保持し続ける回路)**である。
フリップフロップは、2つのNAND回路(AND回路の出力をさらにNOTで反転させた回路)や2つのNOR回路(OR回路の出力をさらにNOTで反転させた回路)を、互いの出力を互いの入力に戻す形でつなぐことで作られる。この「出力を自分の入力に戻す」配線を**フィードバック**と呼び、これによって一度書き込んだ値が、新しい命令が来るまで回路の中をぐるぐる回り続け、結果として値が保持される。
### 検算6 — フリップフロップが値を保持する様子
```
時刻t0: 「1」を書き込む信号 → 出力Q=1
時刻t1: 何も書き込まない → 出力Qは1のまま(保持されている)
時刻t2: 何も書き込まない → 出力Qはまだ1のまま(保持されている)
時刻t3: 「0」を書き込む信号 → 出力Q=0(新しい値に上書き)
```
t1とt2では新しい信号が来ていないにもかかわらず、出力は直前に書き込まれた「1」を保ち続けている。この「保持する」という性質こそが、プログラムにおける**変数(へんすう、水準八: プログラムの中で、値を一時的に保持しておくための名前の付いた箱)**の物理的な正体である。`let x = 5`という一行を実行するとき、コンピュータの内部では、5という値がどこかのフリップフロップに書き込まれ、その値が次に上書きされるまで保持され続けている。
---
> **定着量の目安(第六章)**: マルチプレクサ・デコーダの選択の仕組みと、フリップフロップの「フィードバックによる保持」の仕組み、そして変数との対応を身につけるには、フリップフロップへの書き込み・保持のタイムライン読み取り演習を15問程度こなすと、水準七〜八の内容がほぼ完全に定着すると見込まれる。
---
## 第七章: レジスタとクロック — 変数の束とループの正体(水準九〜十)
### フリップフロップを束ねるとレジスタになる
1個のフリップフロップは1ビットしか保持できない。しかし実際のプログラムで扱う数値(例えば十進数の5や100)は、1ビットでは表せない。そこで、複数のフリップフロップを横に並べて束ね、まとめて1つの数値を保持できるようにした部品を**レジスタ(水準九: 複数のフリップフロップを束ね、まとめて1つの数値〈複数ビット〉を保持できるようにした部品)**と呼ぶ。束ねたフリップフロップの個数を**ビット幅**と呼び、例えば8個束ねたレジスタは「8ビットレジスタ」と呼ばれる。
### 検算7 — 4ビットレジスタに十進数5を格納する
```
十進数の5 = 二進数で 0101
ビット3 ビット2 ビット1 ビット0
0 1 0 1
→ 4個のフリップフロップに、それぞれ0・1・0・1を書き込んで保持する。
```
プログラムで`let x = 5`と書いたとき、この4個(実際には多くのCPUで32個や64個)のフリップフロップの束が、変数`x`の実体である。プログラムの中の1つの変数は、回路の世界では複数ビットのレジスタという「フリップフロップの小さな部屋」に対応している。
### クロック信号 — 回路にとっての「1コマ」
これまでの検算6・検算7では、「時刻t0」「時刻t1」というふうに、時間を区切って値の変化を追った。実際の回路でこの時間の区切りを作り出しているのが**クロック信号(水準十: 一定の間隔でON/OFFを繰り返す信号で、回路全体の動作のタイミングを揃えるために使われる)**である。クロック信号のON/OFFが切り替わる瞬間(立ち上がり)ごとに、フリップフロップやレジスタは新しい値を取り込み、それ以外の瞬間は値を保持し続ける。このように、クロック信号に合わせてすべての部品が足並みを揃えて動く回路を**同期式回路(水準十: クロック信号に合わせて、すべての部品が同じタイミングで動作する回路)**と呼ぶ。
### 検算8 — クロックとループの対応
```
プログラム:
for i = 0 to 3:
合計 += i
このループは4回繰り返される(i=0,1,2,3)。
回路の側では、1回の繰り返しがクロック信号の1回分(1クロック)に対応し、
「合計」を保持するレジスタが、クロックが1回進むたびに新しい値へ書き換えられていく。
```
プログラムの`for`ループが「同じ処理を繰り返す」動作は、回路の側では「クロック信号が刻む1コマごとに、レジスタの値を書き換える」という動作の繰り返しに対応している。ループの1周とクロックの1周期は、同じ「くり返しの単位」を、ソフトウェアの言葉とハードウェアの言葉、それぞれで言い換えたものにすぎない。
---
> **定着量の目安(第七章)**: レジスタ(フリップフロップの束)とビット幅、クロック信号による同期式回路の動き、そして`for`ループとクロックの対応を身につけるには、レジスタへの値の書き込み・クロックのカウント演習を20問程度こなすと、水準九〜十の内容がほぼ完全に定着すると見込まれる。
---
## 第八章: プログラムカウンタとCPUの動作サイクル(水準十一〜十二)
### 次にどの命令を読むかを覚えているレジスタ
プログラムは、命令を1行ずつ順番に実行していく。この「次に読むべき命令の場所」を覚えておくための専用のレジスタを**プログラムカウンタ(水準十一: 次に実行すべき命令が置かれている場所〈アドレス〉を保持しておく、専用のレジスタ)**と呼ぶ。通常、1つの命令を実行し終えるたびに、プログラムカウンタの値は自動的に1つ進み、次の命令を指すようになる。
if文がプログラムの実行順序を変える様子は、このプログラムカウンタの動きとして説明できる。高水準言語(人間が読み書きしやすいプログラミング言語)の`if`文は、コンパイルされると「比較を行う命令」と「条件付きジャンプ命令」の組み合わせに変換される。比較を行う命令の実体は、第二章から第四章で見たAND・OR・NOT(と、値の一致を調べるXOR)の組み合わせであり、その判定結果が1(真)であれば、プログラムカウンタの値を強制的に書き換えて、別の命令の場所へジャンプする。`for`ループも同じ仕組みで、条件付きジャンプがプログラムカウンタを後方(すでに実行した命令の場所)へ戻すことで、同じ命令列を繰り返し実行させている。
### フェッチ・デコード・実行 — CPUが1つの命令を処理する3段階
**命令(めいれい、水準十一: コンピュータに実行させたい、ひとまとまりの動作を表すデータ)**を1つ処理するために、**CPU(中央演算処理装置、水準十二: 命令を1つずつ読み取り、解釈し、実行する、コンピュータの中心的な部品)**は次の3段階を繰り返す。
1. **フェッチ**: プログラムカウンタが指す場所から、命令をメモリから読み込む。
2. **デコード**: 読み込んだ命令が「何をせよという命令なのか」を解釈する。
3. **実行**: 解釈した内容にしたがって、実際に計算や値の書き換えを行う。この計算を担当するのが、AND・OR・NOT・半加算器・全加算器などを組み合わせて作られた**ALU(算術論理演算装置、水準十二: 加算・比較・AND・ORなどの計算を実際に行う、CPU内部の演算専用の回路)**である。
この3段階を、フェッチ→デコード→実行→(次の命令へ)フェッチ→…と、クロック信号に合わせて延々と繰り返し続けることが、CPUが「プログラムを実行する」ということの正体である。1945年ごろ、数学者**ジョン・フォン・ノイマン(John von Neumann、1903-1957)**がまとめた報告書の中で示されたとされる、命令とデータを同じメモリに保存し、命令を順番に読み進めながら実行するという設計方針は、**ノイマン型アーキテクチャ**と呼ばれ、今日の多くのコンピュータの基本設計として受け継がれている。
### 検算9(最終) — レジスタとクロックで3+4を計算する
命令「レジスタAにレジスタBの値を加算し、結果をレジスタAに格納せよ(ADD A, B)」を、レジスタA=3、レジスタB=4という状態から実行する様子を、クロックごとに追ってみる。
```
実行前: レジスタA = 3、レジスタB = 4
クロック1回目(フェッチ) : プログラムカウンタが指す命令「ADD A, B」を読み込む。
クロック2回目(デコード) : 「AとBをALUに送り、加算せよ」と解釈する。
クロック3回目(実行) : ALUが全加算器の組み合わせで 3 + 4 を計算し、
結果7をレジスタAに書き戻す。プログラムカウンタは次の命令へ進む。
実行後: レジスタA = 7、レジスタB = 4(変化なし)
```
3クロック(3回のクロック信号の立ち上がり)を経て、レジスタAの値が3から7へと書き換わった。これが、第一章で見たスイッチのON/OFFという1ビットの世界から出発し、AND・OR・NOT・半加算器・全加算器・フリップフロップ・レジスタ・クロックという部品を1段ずつ積み上げてきた末にたどり着く、「レジスタとクロックで簡単な計算が進む」という水準十二の到達点である。
---
> **定着量の目安(第八章)**: プログラムカウンタと条件付きジャンプによるif文・forループの実現方法、フェッチ・デコード・実行の3段階、ALUの役割を身につけるには、検算9のような命令実行トレースを、レジスタの初期値やALUの演算を変えて10例ほど自分の手でたどると、水準十一〜十二の内容がほぼ完全に定着すると見込まれる。
---
## 三つの実践解(§16.21) — 低電圧でできる論理回路実験
理論を、実際に手を動かして確かめる方法を三つ紹介する。いずれも乾電池・USB電源という低電圧の範囲だけで完結する、安全な実践解である。実際に量産されているCPUチップの内部は非常に微細な配線と低い電圧(1V前後)で動作しており、分解して直接計測するような実験は行わない。本冊で扱うのは、あくまで乾電池・USB電源で安全に動かせる学習用の部品だけである。
1. **スイッチ組み合わせ実践**: 乾電池(角形9V)1本、スイッチ2〜3個、LED1個を用意し、まずスイッチを直列につないでAND回路を、次に並列につないでOR回路を組んでみる。第二章・第三章の真理値表どおりにLEDが光るかを、自分の手で確かめる練習である。
2. **ロジックICを使ったXOR体験実践**: 市販のロジックIC(74HC08〈AND〉・74HC32〈OR〉・74HC86〈XOR〉など、いずれもUSB電源からの5Vや乾電池で動作する低消費電力の部品)をブレッドボード(→BOOK-0301参照)に載せ、スイッチとLEDをつないで真理値表どおりに動くかを確認する。特にXOR ICは、第四章で紹介した階段の照明スイッチと同じ論理を再現できるため、身近な実例との対応がひときわ実感しやすい。
3. **プログラムと回路の対応表作り実践**: 手元の簡単なプログラム(if文とforループを含む10行程度のもの)を1本選び、各行がAND/OR/NOT/比較/ジャンプのどれに対応しそうかを、本冊の第二章〜第八章を見ながら自分の手で表にまとめてみる。厳密な機械語への変換ではなく、「この`if`はAND回路っぽい」「このforループはプログラムカウンタが戻る動きっぽい」という対応の感覚を養う、CPUを分解せずにできる実践である。
---
## まとめ — 0と1から、レジスタとクロックの計算へ
本冊では、「このAND回路は、さっきのif文と同じことをしている」と気づいた新人技師の物語から出発し、スイッチのON/OFFが0と1になる理由(第一章)、AND回路と`&&`の対応(第二章)、OR回路と`||`の対応(第三章)、NOT回路・ブール代数・XOR回路(第四章)、半加算器・全加算器という「関数のような部品のまとまり」(第五章)、マルチプレクサとフリップフロップという「選ぶ回路」と「覚える回路」(第六章)、レジスタとクロックによる変数とループの正体(第七章)、そしてプログラムカウンタとCPUのフェッチ・デコード・実行サイクル(第八章)までをたどってきた。
AND・OR・NOTという3つの単純な部品が、`&&`・`||`・`!`というプログラムの記号にそのまま対応し、それらを組み合わせた半加算器・全加算器が関数という考え方に、フリップフロップとレジスタが変数という考え方に、クロック信号とプログラムカウンタがループと条件分岐という考え方に、それぞれ対応している。この積み上げこそが、「プログラムを書く」という行為と「回路を組む」という行為が、実は同じことを2つの異なる言葉で語っているだけだと理解するための道筋である。すべての実験は、乾電池とUSB電源という低電圧の範囲にとどめてある。次巻(→BOOK-0343『情報構造の設計』)では、この本で組み上げたレジスタやメモリの上に、配列・木・グラフといった情報の並べ方がどう作られていくのかを扱う予定である。
---
## 章末: 簡易回路図とまとめの階段図
まずは第八章で追った「レジスタA=3にレジスタB=4を加算する」計算を、ブロック図で表してみよう。
```
プログラムカウンタ ──フェッチ──▶ [命令: ADD A, B]
│
デコード
│
レジスタA(3) ──┐ ▼
├──▶ [ ALU(全加算器の束) ] ──▶ 結果7 ──▶ レジスタAへ書き戻し
レジスタB(4) ──┘
関係式: Sum = A XOR B、Carry = A AND B(半加算器)を全加算器へ拡張し、
8桁分並べれば 3(0011) + 4(0100) = 7(0111) が1クロックで計算される。
```
続いて、本冊全体の歩みを階段図としてまとめる。
```
[水準十一〜十二] プログラムカウンタとCPUの動作サイクル
フェッチ→デコード→実行(検算9: 3+4=7を3クロックで計算)
▲
│ if文=比較+条件付きジャンプ、forループ=後方ジャンプの繰り返し
[水準九〜十] レジスタとクロック
4ビットレジスタに5(0101)を格納(検算7)、forループ=クロックの繰り返し(検算8)
▲
│ フリップフロップを束ねて複数ビットの値を保持する
[水準七〜八] マルチプレクサとフリップフロップ
switch文=選択回路、変数=値を保持し続ける回路(検算6)
▲
│ 値を「覚えておく」という新しい機能を追加する
[水準六] 半加算器・全加算器
1+1=10(検算4)、1+1+1=11(検算5)、関数という部品のまとまり
▲
│ 複数の部品を組み合わせ、名前を付けてひとまとめにする
[水準四〜五] NOT回路・ブール代数・XOR回路
!演算子との対応、階段の照明スイッチ=XORの実例(検算3)
▲
│ 信号を反転させ、さらに複雑な規則を組み立てる
[水準二〜三] AND回路・OR回路
&&演算子(検算1)、||演算子(検算2)との対応
▲
│ スイッチの直列・並列という配線が論理の規則になる
[水準一] スイッチのON/OFFと0/1
デジタル信号・ビット・二進数という最小単位
安全枠: 乾電池・USB電源(低電圧の直流)に限定。実チップの分解・直接計測は行わない。
```
**横の広がり**: 水準二のAND ←(双対の関係)→ 水準三のOR(直列と並列、両方すべて条件と一つでも条件という対の規則)。水準六の全加算器 ←(逆の演算)→ 減算器(全加算器を反転入力と組み合わせて作れる、引き算のための回路)。水準八のフリップフロップ ←(同じ記憶素子の仲間)→ ラッチ(クロックを使わずに値を保持する、より単純な記憶回路)。
**現在のフロンティア**: 従来のトランジスタでは信号のON/OFFの切り替えに熱と時間がかかることが、回路の高速化の壁になっている。これに対し、より小さいエネルギーで演算できる新方式の探求が続いており、例えば量子力学の重ね合わせを使う量子ゲート(0と1だけでなく、その中間状態も同時に扱える演算方式)や、脳の神経細胞の働きを模したニューロモーフィック回路(消費電力を大きく減らす設計方針として研究が続けられている)などが、2020年代の研究テーマとして挙げられる。いずれも、AND・OR・NOTという本冊で扱った基本部品の先にある、次の世代の論理回路の姿である。
**次の冊子への矢印**: 次の冊子(→BOOK-0343『情報構造の設計』・水準一〜十二)は、本冊で組み上げたレジスタとメモリという「値を保持する場所」の上に、配列・木・グラフという情報の並べ方がどう選ばれ、なぜ新しい構造が生まれてきたのかという歴史的な比較を扱う予定である ─────▶
---
## 参照文献(定番教科書・一般規格)
1. デジタル回路設計の標準的教科書(大学初年次・高等専門学校向けに広く使われている、論理回路の基礎からCPUの動作原理までを扱う定番の入門教科書群)。
2. ジョージ・ブールの原著: Boole, G. *An Investigation of the Laws of Thought*, 1854年刊。
3. クロード・シャノンの修士論文(1937年、スイッチ回路とブール代数の対応を示したとされる論文)。
4. ジョン・フォン・ノイマンによる報告書(1945年ごろ、命令とデータを同じメモリに保存する設計方針〈ノイマン型アーキテクチャ〉を示したとされる報告書)。
---
(本冊子は現代学問宇宙図鑑シリーズ BOOK-0342。応用の軌道ステーション群・工学分野・「作る力と生きる力シリーズ」計算機文明部の第3巻(論理回路からCPUへ)。→BOOK-0300『回路の読み方と設計』の続編的位置づけであり、→BOOK-0340『OSを作るということ』・→BOOK-0343『情報構造の設計』と接続する。GAKUMON_UNIVERSE.md進捗台帳・CATALOG_作る力と生きる力シリーズ.mdを参照。)
# BOOK-0342 作る力と生きる力: 論理回路からCPUへ — 0と1でできた小さな部品が、なぜプログラムになるのか