トラック1・📜プログラムとは何か

命令実行サイクル(Fetch-Decode-Execute)

読む目安 約10分・ゴール:CPUが命令を1つずつ取り出して実行する繰り返しで動いていることを理解する

アプリでこのトピックを学ぶ(無料・登録不要)

このトピックの要点

CPUは何億個ものトランジスタでできた複雑な部品ですが、やっていることは驚くほど単純です。次の3つを、ひたすら繰り返しているだけです。

  1. Fetch(フェッチ・取り出す) — メモリから次の命令を1つ持ってくる
  2. Decode(デコード・読み解く) — その命令が何をせよという意味かを解読する
  3. Execute(エグゼキュート・実行する) — 実際に計算したり値を移したりする

そして4番目に「次の命令へ進む」があり、また1に戻ります。この輪をぐるぐる回し続けるのがCPUの一生です。

具体例で見る

「3番地の値と4番地の値を足して、5番地にしまう」という処理は、実際には機械語の命令いくつかに分かれます。

C言語で書けばたった1行の c = a + b; が、機械のレベルではこれだけの手数に分解されています。1つの命令はとても小さい——これがCPUの世界観です。

ビット1歩がすごく小さいけど、1秒に何十億歩あるくんだ。だから速く見えるんだよ。

次にどこを実行するか、を覚えている

CPUの中には「次に実行する命令が何番地にあるか」を覚えている専用の置き場があります(プログラムカウンタと呼びます)。命令を1つ実行するたびに、この番号が1つ進みます。

すると、「if文で条件によって処理が分かれる」「ループで前に戻る」といった動きの正体も見えてきます。プログラムカウンタの中身を書き換えて、別の番地へ飛ぶ——ただそれだけのことなのです。

なぜこんなに細かく分けるのか、と思うかもしれません。理由は、部品が単純なほど速く正確に作れるからです。「足す」「比べる」「移す」といった数十種類の単純な命令だけを、極限まで速く実行できるように回路を作る。その代わり、複雑なことは命令をたくさん並べて実現する。この割り切りが、1秒間に何十億回という速度を生んでいます。

大原則: 一度に1つ、順番に

ここから、この先ずっと使う大原則が出てきます。CPUは一度に1つの命令しか実行しない(実際の最新CPUは工夫で同時実行しますが、結果は順番に実行したのと同じになるよう作られています)。

つまりプログラムの動きは、原理的に人間が紙の上で追いかけられるということです。速度でCPUに勝てなくても、正しさは同じように確かめられます。この「紙の上でCPUになる」訓練を、第3トラックで本格的にやります。

クロック周波数3GHzとは、この輪を1秒間に約30億回まわす速さ、という意味です。人間が1歩ずつ追えるのは、せいぜい1秒に1回でしょう。速さでは30億倍の差があります。それでも、追えるかどうかは速さの問題ではありません。時間さえかければ、あなたはCPUとまったく同じ結果にたどり着けます。この事実が、第3トラックの訓練の土台になります。

アプリでこのトピックを学ぶ(無料・登録不要)

確認問題

確認問題 1

CPUは1秒間に何十億回も命令を実行します。それでも人間が紙の上でプログラムの動きを追いかけられるのは、なぜでしょう。

  1. CPUは一度に1つの命令しか実行せず、順番どおりに実行したのと同じ結果になるように作られているから
  2. 人間のほうがCPUより正確に計算できるから
  3. CPUが実行できる命令は1種類しかないから
  4. 紙の上ではメモリを使わないから
答えを見る

正解:A(CPUは一度に1つの命令しか実行せず、順番どおりに実行したのと同じ結果になるように作られているから)

CPUの大原則は「一度に1つ、順番に」です(最新のCPUは工夫して同時に実行しますが、結果は順番に実行したのと同じになるよう作られています)。だから速さで30億倍の差があっても、時間さえかければ人間はCPUとまったく同じ結果にたどり着けます。追えるかどうかは速さの問題ではありません。人間のほうが正確なわけでもなく(正確さはCPUの得意分野です)、命令も1種類ではなく数十種類あります。紙で追うときもメモリにあたる変数の値は書き出すので、最後の選択肢も誤りです。

確認問題 2

CPUが1つの命令を実行するときの順番として、正しいものはどれでしょう。

  1. Decode(読み解く) → Fetch(取り出す) → Execute(実行する)
  2. Fetch(取り出す) → Decode(読み解く) → Execute(実行する)
  3. Execute(実行する) → Fetch(取り出す) → Decode(読み解く)
  4. Fetch(取り出す) → Execute(実行する) → Decode(読み解く)
答えを見る

正解:B(Fetch(取り出す) → Decode(読み解く) → Execute(実行する))

まずメモリから命令を取り出し(Fetch)、その意味を解読し(Decode)、それから実行します(Execute)。取り出す前に読み解くことも、意味を知る前に実行することもできません。CPUはこの輪を1秒間に何十億回も回し続けています。

「プログラムとは何か」の目次

  1. コンピュータは何をする機械か
  2. プログラムとは「手順書」である
  3. ソースコードから機械語へ——コンパイルの旅
  4. CPUとメモリの模式図
  5. 命令実行サイクル(Fetch-Decode-Execute)
  6. プログラミング言語の地図とCの位置
  7. なぜ最初にC言語なのか
  8. 0と1ですべてを表す——2進数の入口

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版の販売ページは準備中です。

ほかのトラック

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版