中級では、コンピュータを5大装置とフォンノイマン型という骨格でとらえ直しました。上級では、その骨格がなぜ「指示を差し替えるだけで何にでも化ける」のか——その原理まで降ります。そして万能に見えるこの機械にも、原理的な限界と物理的な限界があることまで見ます。
前提として、この機械が最終的に扱うのは 0 と 1 だけです。その土台は 2進数とデータ を参照。
上級の解説は準備中のため、上級の内容を表示しています。
中級では、コンピュータを5大装置とフォンノイマン型という骨格でとらえ直しました。上級では、その骨格がなぜ「指示を差し替えるだけで何にでも化ける」のか——その原理まで降ります。そして万能に見えるこの機械にも、原理的な限界と物理的な限界があることまで見ます。
前提として、この機械が最終的に扱うのは 0 と 1 だけです。その土台は 2進数とデータ を参照。
ノイマン型の核心は「プログラムをどこに置くか」にあります。
登場人物メモ(※の説明):
この「命令もデータとして扱える」性質が、コンパイラ(プログラムを別のプログラムに変換する道具)や、実行中に自分を書き換える処理まで可能にします。同じ CPU が電卓にもブラウザにもなるのはこのためです。CPU 側の詳しい動きは CPU を参照。
⚠️ イレギュラー — 命令とデータが同じメモリ・同じ通り道(バス)を共有するため、そこが渋滞点になるフォンノイマンボトルネックが生じます。また「命令もデータ」という性質は諸刃で、データのつもりの領域を命令として実行させる攻撃(コードインジェクション)の温床にもなり、命令用とデータ用のメモリを分けるハーバードアーキテクチャが選ばれる場面もあります。
「指示どおり順に計算する」の"順に"の正体が、この繰り返しです。
登場人物メモ(※の説明):
この単純な4手を毎秒何十億回も回すことで、複雑に見えるすべての処理が組み上がります。分岐(if)もループも、突き詰めればカウンタの値を書き換えているだけです。
⚠️ イレギュラー — 現実の CPU は1命令を待ってから次、では遅すぎるので、複数命令を流れ作業で重ねるパイプラインで高速化します。ところが分岐の行き先が読めないと、先読みが外れて途中まで進めた作業を捨てる(分岐予測ミス)ことになります。さらに外部からの割り込みが入ると、サイクルの途中でも現在の状態を退避し、別の処理へ切り替えます。
なぜ人間がこの機械を扱えるのか。答えは、層を積んで下の複雑さを隠しているからです。下から順に積み上がります。
登場人物メモ(※の説明):
各層は、下がどう作られているかを知らなくてよいように設計されます。プログラムを書く人はトランジスタの電圧を意識しません。約束さえ守られれば、下の実装(例: 別の半導体、別の CPU)が入れ替わっても上はそのまま動きます。この積み重ねこそ、巨大な複雑さを人間が扱える理由です。0 と 1 がどう情報になるかは 2進数とデータ が担当します。
⚠️ イレギュラー — 抽象化は「隠す」だけで「切り離す」わけではありません。土台の層が壊れれば上も動きません。隠された下の層が漏れ出て上の挙動に影響することを抽象化の漏れ(leaky abstraction)と呼びます。たとえば、メモリを無限の平地とみなして書いたプログラムが、実際のキャッシュ階層(速い記憶と遅い記憶の段差)の都合で急に遅くなる、といった形で下層が顔を出します。
十分な記憶と時間があれば、この機械は原理的にあらゆる計算をこなせます。これをチューリング完全(※1)と呼びます。だが「何でも計算できる」は「何でも解ける」ではありません。
登場人物メモ(※の説明):
だからこそ設計は、1つのコアをひたすら速くする路線から、複数コアで手分けする並列化へ舵を切りました。ただし並列化にも上限があります。処理の中に順番を守らねばならない部分が残る限り、コアを増やしても全体はそこまで速くならない(アムダールの法則)——直列の鎖は人手を増やしても縮まないのと同じです。プログラムがこの機械の上で実際にどう走るかは アプリとOS を参照。
⚠️ イレギュラー — 「速い機械なら停止性問題も解ける」は誤解で、これは原理的に解けません。また「コアを倍にすれば倍速」も誤りで、直列部分がボトルネックになり頭打ちします(アムダールの法則)。物理的にも、微細化・発熱・並列化の壁が同時に効いてくるため、性能向上は「1つを速く」から「賢く手分け・省電力」へと質を変えています。
そのまま解けます(成績は保存されません)。無料アカウントを作ると、学習の記録と進捗の山登りが始まります。
問1. 命令実行サイクルをフェッチ→デコード→実行→書き戻しの順で回すとき、次に取り出す命令の在り処を指しているのはどれ?
問2. トランジスタ→論理ゲート→算術回路→命令→プログラムという抽象化の積み重ねについて、正しい説明はどれ?
問3. 「チューリング完全」と「停止性問題」について、正しい組み合わせはどれ?
問4. 近年、CPUのクロック周波数の伸びが頭打ちになり、コア数を増やす方向(並列化)に舵を切った主因はどれ?
問5. パイプラインで先読みした分岐(if)の行き先が外れたとき、何が起きるか?
問6. コアを倍に増やしても処理が単純に倍速にならない理由を説明する法則はどれ?
問7. 命令用メモリとデータ用メモリを分離し、フォンノイマン型と対比される構成を何と呼ぶ?
問8. ストアドプログラム方式(プログラム内蔵方式)の本質を最もよく表しているのはどれ?