2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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の中を駆け巡って実行されるわけです

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

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

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

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

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の中で何が起きているのかを探検しましょう!

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?