プログラムとデータのアドレス
序論
CPUは計算装置であるが、
「どこにある命令やデータを使うのか」を
自分で判断しているわけではない。
CPUが参照するのは常に
アドレス(address)と呼ばれる数値である。
本節では、アドレスとは何か、
なぜプログラムとデータが同じ仕組みで扱えるのかを説明する。
本論
アドレス(address)とは何か
アドレスとは、
メモリ上の「場所」を示す番号である。
メモリは巨大な配列のような構造をしており、
各位置には 0, 1, 2, 3 … と連続した番号が割り当てられている。
CPUはこの番号を指定してデータを読み書きする。
CPUは中身を理解していない
CPUにとって、
メモリ上に置かれているものが
「プログラム」か「データ」かは区別されていない。
それは単なるビット列であり、
そのビット列を
「命令として実行する」のか
「数値として計算する」のかは、
使われる文脈によって決まる。
プログラムカウンタ(PC)の役割
CPUには
プログラムカウンタ(Program Counter, PC)
と呼ばれるレジスタが存在する。
PCには、
「次に実行する命令が置かれているアドレス」
が格納されている。
CPUは以下の動作を繰り返す。
- PCが指すアドレスから命令を読み出す
- 命令を実行する
- PCを次のアドレスに更新する
データもアドレスで指定される
命令の中には、
「このアドレスにあるデータを使え」
という指定が含まれているものがある。
例えば、
「address 1000 にある値をレジスタに読み込め」
という命令は、
プログラム自身が
データの場所を数値として持っていることを意味する。
同じメモリに置かれる理由
プログラムとデータを
同じメモリ構造で扱う設計を
「プログラム内蔵方式」と呼ぶ。
この方式により、
プログラムがデータを生成し、
そのデータを再び命令として扱う、
といった柔軟な処理が可能になった。
危険性と制約
アドレスを誤って扱うと、
本来データとして使うべき領域を
命令として実行してしまう可能性がある。
この問題は、
バッファオーバーフローや
不正実行といった
深刻な障害の原因となる。
結論
アドレスとは、
CPUが世界を認識する唯一の手がかりである。
CPUは意味を理解せず、
数値として与えられたアドレスを
機械的に追いかけているだけである。
その単純さこそが、
高速で汎用的な計算を可能にしている。
Q&A
- Q. address とは何ですか?
-
A. メモリの中の場所を示す番号です。
番地や住所のようなものです。
- Q. なぜCPUは中身を区別しないのですか?
-
A. 区別すると回路が複雑になり、
柔軟性が失われるためです。
CPUは単純な規則だけを守ります。
- Q. プログラムが壊れるのはなぜですか?
-
A. 誤ったアドレスを指定すると、
意図しない場所を読み書きしてしまうからです。
- Q. なぜこれが重要なのですか?
-
A. 安全性・信頼性・性能のすべてが、
アドレスの正しい理解に依存しているからです。
