計算機は CPU, RAM, DISK, 周辺 LSI, 入出力装置とそれらを結ぶ各種通信路 ( バス 等) からなる. これらの話題を詳細にのべることはこの本の目的ではないが, プログラムを書くうえで, 計算機の仕組みについてそれなりのイメージをもっているのは 大事である.
図 3.1 は単純化した, 計算機の仕組みの図である. 計算機は メモリ (図 3.3 の写真), CPU (central processing unit, 図 3.2 の写真 も参照), および入出力機器をもつ.
メモリには番地が付いており, 一つの番地には2進数 8 桁分を記憶できる. 2進数 8 桁分を 1 byte と呼ぶ. 2進数の 11111111 は 10 進数の 255 なので, メモリの一つの番地には, 0 から 255 までの数を格納できる.
CPU はメモリよりプログラムを読み込み逐次実行する.
たとえば, から
までの和を求める次のプログラムを考えよう.
Re = 0$ for (K=1; K<=100; K++) { Re = Re + K; } print(Re)$
メモリには, 変数 Re, K に対応する適当な大きさの領域が確保される.
for ループにはいるとまず, K に 1 が格納される.
次に条件 K<=100 が成り立つか CPU が判断して for ループを抜けるか
どうか決めている.
この場合はループを抜ける必要はないので,
メモリより, Re と K の値を読み込み,
を計算し, メモリの領域 Re へ計算結果の値を
格納する. K の値を 1 増やしてから,
次に条件 K<=100 が成り立つか CPU が判断して for ループをぬけるか
どうか決めている.
この場合はループを抜ける必要はないので,
メモリより, Re と K の値を読み込み,
を計算し, メモリの領域 Re へ計算結果の値を
格納する. K の値を 1 増やす.
以下これを繰り返す.
最後にループを抜けたら, Re の値を印刷する.
ただしこの説明はすこし読者をだましている. CPU は Asir のプログラムを理解できるわけではない. CPU が理解できるのは, Asir よりとっつきにくい機械語である. すこしとっつきにくいが, 上の Asir とおなじように, 代入, 比較, 足し算などの機能をもつ.
機械語(マシン語)は と
の列である.
これが順に解釈実行される.
機械語は CPU の種類によりことなる.
Intel Pentium CPU とか, R3000 CPU とか PowerPC CPU とかいろんな CPU がある.
現在いわゆる IBM PC コンパチ機(互換機)で利用されているのは,
Intel 80386 系 CPU である.
この系統の CPU は長い歴史をもっており,
以下のように発展してきた.
アドレス空間というのは, メモリの番地のとりえる値の範囲である.
たとえばアドレス空間が のときは,
番地は 0 から
まである.
Intel Pentium の起源ともいえる, Intel 8080 CPU は各種シミュレータが存在しており, 現在でも 8080 CPU のマシン語プログラミングを経験することが 可能である.
マシン語は Risa/Asir とことなり, 2 進数の列で表現する. たとえば, TK-80 エミュレータ [1] に載っている Intel 8080 CPU では, マシン語命令 1100 1010 は, 一つ前の演算結果が 0 なら この命令の次にくる 16 桁の 2 進数を メモリの番地とみなして, その番地にジャンプせよという意味となる. このような数字の列をメモリにプログラムとして書き込んでいくことにより TK-80 をプログラミングする. TK-80 を実際実行するところを, マシン語に堪能な人にたのんで見せて 見せてもらうとよいであろう. 全ての計算機は最終的にはこのマシン語を解釈実行している.
計算機内部では全てが 2 進数の数字で表現されている. 図 3.3 (メモリ) を良く見ると, 金色に光る縦の 線が沢山見えるであろう. メモリが動作中は, 金色に光る縦の線ひとつひとつが 2 進数の 1 桁に対応することとなる. この部分にかかる電圧を目にみることができれば, 2 進数で現在どのアドレスにアクセスしているのか? どのようなデータを読んでいるのかを知る事が可能である. 第 10 章末の Risa/Asir ドリル ギャラリー のハードディスクの写真にも, 何本もの線がたばになったケーブルが写っているであろう. この線一本一本がハードディスクに転送されるデータやコマンドの 2 進数表現の 1 桁 1 桁に対応している.