文系人間がコンピュータの内部に潜入してみた①

# 👨‍💻 自己紹介：文系人間がコンピュータの内部に潜入してみた

こんにちは、**BB-KING777**というハンドル名の潜入レポーターです！

今日から、コンピュータの内部という謎めいた世界への潜入記録をお届けします。まずは、諜報員として私の身分証明書をご確認ください：

```
📋 諜報員プロファイル
-----------------------
コードネーム： BB-KING777
現在の潜伏先： 学生
年齢層： 20代
性別： 男性
得意フィールド： 文系科目全般
弱点： 理系科目、特にプログラミング
```

「待った！コンピュータアーキテクチャなんて超理系の記事を、理系科目が苦手な人が書くの！？」

はい、その通りです。私は高校時代、数学の先生から「**君は絶対に文系に行きなさい**」と、まるで人生の警告のように言われた人間です。方程式を見ると目が回り、プログラミングと聞くと冷や汗が出る体質でした。

でも、そんな私でも理解できたコンピュータアーキテクチャ。これを読んでいるあなたなら、きっと「余裕じゃん！」と思える内容にします。約束します！

# 🤔 なぜ文系人間がコンピュータの内部構造を学ぶのか？

想像してみてください。ある日突然、ゾンビが街にあふれる世界になったとします（よくある話ですよね）。

あなたは必死で逃げ回り、ついに無人の駐車場を見つけました。そこには一台の車が！しかし...

```
⚠️ 緊急事態：ゾンビ発生！使用可能な車両はMT軽トラのみ ⚠️
```

もしあなたがAT限定免許しか持っていないとしたら...？そう、ゾンビの餌食です。「クラッチって何？」と考えている間に、あなたの脳みそはゾンビのディナーになってしまいます。

一方、MTの運転方法を知っている私なら（たとえ下手でも）、エンジンをふかして逃げ出せるチャンスがあります。

コンピュータアーキテクチャを学ぶことは、デジタル世界のMT免許を取るようなものです。普段はほとんど出番がないかもしれません。でも、いざという時に「あ、これってこういう仕組みだったんだ！」と理解できることが、デジタル世界での生存率を高めるのです。

---

さあ、これから私たち文系人間が、コンピュータという謎めいた機械の内部に潜入していきます。ついてくる準備はできていますか？ 🕵️‍♂️💻

# 🤖 機械語を見る：コンピュータの「本当の言葉」

C言語で1と2を足して出力するプログラム、書けますよね？こんな感じです👇

```C
int main() {
    int a,b,result;
    a=1;
    b=2;
    result = a + b;
    printf("result:%d",result);
    return 0;
}
```

はにゃー、簡単ですわ。プログラミング初心者でも「なるほど、1と2を足して表示するんだな」と理解できますね。

でも待ってください...

## 🔍 コンピュータが「本当に」理解している言葉

**機械語、見たことありますか？**

これが同じプログラムの機械語バージョンです👇

```bash
0000000000001149 <main>:
    1149:       f3 0f 1e fa             endbr64            // 関数開始の境界保護（セキュリティ機能）
    114d:       55                      push   %rbp         // スタックフレーム設定開始
    114e:       48 89 e5                mov    %rsp,%rbp    // スタックフレームの設定
    1151:       48 83 ec 10             sub    $0x10,%rsp   // ローカル変数用のスタック領域確保
    1155:       c7 45 f4 01 00 00 00    movl   $0x1,-0xc(%rbp)   // a = 1
    115c:       c7 45 f8 02 00 00 00    movl   $0x2,-0x8(%rbp)   // b = 2
    1163:       8b 55 f4                mov    -0xc(%rbp),%edx    // edx = a
    1166:       8b 45 f8                mov    -0x8(%rbp),%eax    // eax = b
    1169:       01 d0                   add    %edx,%eax          // eax = eax + edx (result = a + b)
    116b:       89 45 fc                mov    %eax,-0x4(%rbp)    // result = eax
    116e:       8b 45 fc                mov    -0x4(%rbp),%eax    // eax = result (printf用の引数準備)
    1171:       89 c6                   mov    %eax,%esi          // esi = eax (printf用の引数)
    1173:       48 8d 05 8a 0e 00 00    lea    0xe8a(%rip),%rax   // "result:%d"文字列のアドレスをraxに格納
    117a:       48 89 c7                mov    %rax,%rdi          // rdi = rax (printf用の第1引数：文字列)
    117d:       b8 00 00 00 00          mov    $0x0,%eax          // 浮動小数点引数の数を0に設定
    1182:       e8 c9 fe ff ff          call   1050 <printf@plt>  // printf関数呼び出し
    1187:       b8 00 00 00 00          mov    $0x0,%eax          // 戻り値を0に設定
    118c:       c9                      leave                     // スタックフレームの解放
    118d:       c3                      ret                       // 関数からの復帰
```

😱 たった6行のC言語コードが、この魔術的な呪文のような機械語に変身しています！

これが「コンピュータが実際に理解している言語」です。画面に表示されているのは16進数ですが、コンピュータの内部では全て2進数（0と1の羅列）として処理されています。

## 💡 なぜこんなに複雑なの？

C言語の `a = 1` という簡単な命令が、機械語では `c7 45 f4 01 00 00 00` という謎の呪文に変わっています。これは、まるで...

「メモリのこの場所に、この数値を置いてください」

...というCPUへの超具体的な指示書なのです。

**たった1つの足し算**（`result = a + b`）を実行するために、コンピュータは：

1. まずメモリから値aを取り出して一時保管場所（レジスタ）に入れ ← `8b 55 f4`
2. 次にメモリから値bを別の一時保管場所に入れ ← `8b 45 f8`
3. 2つの値を足し算して ← `01 d0`
4. 結果をメモリに戻す ← `89 45 fc`

という複雑な手順を踏んでいるのです！

## 🧠 なぜこれを知る必要があるの？

これがコンピュータの「本当の姿」です。我々が普段書いているプログラムは、この複雑な機械語を書かなくて済むように作られた「人間向けの便利ツール」なのです。

**これが、CPUの中を駆け巡って実行されるわけです**。

では、どうやって駆け巡るのか、それがコンピュータアーキテクチャの話です。それは次の旅で明らかにしていきましょう...

# 🧩 どこにプログラムがあるの？コンピュータの記憶の謎

ある日、私は先ほどのコードを渡されて、こう言われました。
「お前、これコンパイルして実行した結果を教えて」

了解です。さっそくターミナルで：

```bash
gcc program.c -o program.o
./program.o
result:3
```

はい、できました！上司は「じゃあ、実行ファイルをメールで送っといて」と言うので、`.o`ファイルを送信しました。

## 🤔 クイズタイム！

さて問題です。**どこにプログラムの実行ファイルはあるでしょうか**。以下から選んでください。

1. RAMの中
2. ROMの中
3. どこにもない
4. 私の頭の中

🎯 正解は... **2. ROMの中** です！

先ほど見た機械語はROMの中に格納されています。CPUはこのROMから命令を読み取って実行しているのです。

## 🖥️ シンプルなコンピュータの旅

ここで、シンプルなコンピュータの仕組みを見てみましょう。ROMとCPUとRAMだけのシンプルなモデルです（OSなどの複雑な要素は無視します）。

このシンプルなコンピュータでは：

1. **CPU**は常に時間を刻んでいます。これを「**クロック**」と呼びます。
   - クロックはコンピュータの心臓の鼓動のようなもの
   - 「ティック、トック、ティック、トック...」

2. クロックが「ティック」と上がった瞬間に、CPUはROMから一行目の機械語を「**フェッチ**」（取り出し）します。
   - まるで本を読むように、ROMから次の命令を読み取ります

3. CPUは「**プログラムカウンタ**」という特別な記憶場所を持っています。
   - これは「今、何行目を読んでいるか」を記録する栞のようなもの
   - 命令を読み終えたら、自動的に次の行を指すよう更新されます

4. フェッチされた命令は「**デコーダ**」という部品に送られます。
   - デコーダは暗号解読者のように機械語を解読して
   - 「これは足し算だ」「これはメモリからデータを取り出せという命令だ」と理解します

これが、コンピュータが命令を実行する最初のステップです。フェッチして、デコードして...そして次は？

次は実際に命令を実行する段階です。この流れを「**フェッチ・デコード・実行サイクル**」と呼びます。コンピュータは常にこのサイクルを繰り返しているのです。

---

*次回：デコードされた命令がどのように実行されるのか、CPUの中で何が起きているのかを探検しましょう！*