手で入れた 6032 を「動作」に変えるのは、何か
6032 という数値をメモリに入れました。でも数値は、それだけでは何も起きません。「メモリを読め」という動作に変えるのは何か ── それは論理ゲートで配線された命令デコーダ。そしてそれを設計したのも、人間です。
私たちは長い階段を降りてきました ── Linux を gcc が、gcc を既存 cc が、C を B が、アセンブラをクロスが、そして最初の数語を人間の手が。第9回で「ソフトの底」に着いたはずでした。でも、まだ一段残っています。手で入れた 6032 は、ただのビットの並び。これを「メモリを読む」という現実の動作に変えているものが、必ず要る。それが今回の主役 ── ハードウェアです。ここから下は、もうプログラムではありません。配線された物理と、それを設計した人間の手だけ。鶏と卵の、いちばん底です。
第7回で見たとおり、機械語はただの数値です。6032 という並びが「メモリを読め」を意味するのは、そう解釈するように作られた機械の中でだけ。同じビット列も、別の設計の機械に入れれば、まったく違う動作になる(あるいは何も起きない)。数値そのものに意味は無い。意味は、それを受け取る機械の側にある。
CPU の中で、命令の数値(オペコード)を受け取り、「どの動作をせよ」という制御信号に変える部品を 命令デコーダ(制御装置)と呼びます。オペコードのビットの並びに応じて、加算器を動かす線、メモリを読む線、レジスタに書く線…のどれを点灯させるかが決まる。下の図で、オペコードを変えて、点灯する制御線=実行される動作が切り替わる様子を見てください。
命令デコーダの中身は、論理ゲート(AND・OR・NOT)の集まりです。AND・OR・NOT を組み合わせれば、どんな真理値表(入力の各パターンに、出力をこう割り当てる、という表)でも作れます。デコーダとは、「このオペコードのときは、この制御線を点灯」という真理値表を、ゲートで物理的に実現したものにほかなりません。そしてゲートは、トランジスタというスイッチの集まりです。
プログラムの意味をどこまでも下へたどると、最後は 「オペコード → 制御線」という表を、論理ゲートで配線したものに行き着きます。これはもうプログラムではありません。書き換え可能なソフトではなく、固定された物理。ソフトの鶏と卵は、ここでソフトでないものに受け止められて、止まります。
ただし、一段だけ寄り道があります。CPU によっては、命令の解釈をマイクロコードというCPU内部の小さなプログラムで行います(Maurice Wilkes が1951年に提唱)。この場合、機械語はいったんマイクロコードという「小さなインタプリタ」に渡され、より細かいマイクロ命令の列に分解される。── まるでミニチュアの鶏と卵です。でも安心してください。そのマイクロコードを実行する土台は、結局ハードワイヤード(べた配線)な論理ゲート。下の図で、両方式を切り替えて、どちらも最後は論理ゲートで底を打つことを確かめてください。
では、その真理値表を決め、ゲートに落とし、チップに焼いたのは誰か。── 人間です。 どのビット列にどの動作を割り当てるか(命令セット)を設計し、それを論理回路にし、配線した。第9回で「最初の数語を手で彫った」のと、ここで「意味を与える配線を手で設計した」のは、シリーズの二つの種です。両方とも ── プログラムではなく、人間+物理。鶏と卵をさかのぼる旅は、ソフトの外(人間の設計と、配線された物理)で、ちゃんと底を打ちます。
ゲートはトランジスタ、トランジスタはシリコン、シリコンは物理法則に従う電子 ── と、まだ下に世界は続きます。でもそれは物理と製造の話で、「何がコンパイルしたか」というソフトの鶏と卵ではありません。もちろんハードにも独自のブートストラップがあります(チップの設計に使う道具も、また別のチップ…)。でもそれは別の鎖。私たちのたどってきたソフトの鎖は、ここ ── 人間が設計し配線した論理ゲート ── で、確かに終わりました。
(1) 図1の「オペコード2ビット→4動作」は説明用の最小モデルで、実際の命令セットははるかに多く、複雑です。(2) 現代の CPU は、パイプライン・投機実行・マイクロオペレーションのキャッシュなど桁違いに込み入っていて、「デコーダ=単純な真理値表」はあくまで骨格の話です。(3) マイクロコード(Wilkes, 1951)は実在の技術で、機械語をCPU内部の小プログラムで解釈しますが、その土台は最終的にハードワイヤードな論理に落ちます。
(4) 「意味は配線に宿る/その設計者は人間」という言い方は、ソフトの鶏と卵の終端を指すためのものです。ハードウェアの製造にはハード自身のブートストラップ(道具が道具を作る連鎖)があり、それは本シリーズの射程外の別問題です。最下層の“物理”そのものは、人間が「作った」のではなく、設計して利用したと言うのが正確です。
6032 という機械語の「意味」は、どこにあるか。
第9回で手で入れた 6032 は、ただのビット列。それを「メモリを読む」という動作に変えているのが 命令デコーダ(制御装置)で、中身は 論理ゲート(AND・OR・NOT)── 「オペコード→制御線」という真理値表を、物理的に配線したものだ。数値に意味は無く、意味は機械の配線の側にある。ソフトの意味をどこまで下へたどっても、最後はこのプログラムでない、固定された物理に受け止められる。
マイクロコード(Wilkes, 1951)という「CPU内部の小さなプログラム」を挟む設計もあるが、その土台も結局ハードワイヤードな論理ゲート。そして、どのビット列にどの動作を割り当てるか(命令セット)を設計し配線したのは ── 人間だ。第9回「最初の数語を手で彫った」と、この第10回「意味を与える配線を手で設計した」が、シリーズの二つの種。両方ともプログラムではなく、人間+物理。鶏と卵をさかのぼる旅は、ソフトの外で、確かに底を打った。── 次回、最終回。降りきった底から見上げて、答えの全体像を組み立てます。
bootstrap ── 靴ひもで自分を持ち上げるという不可能事は、最初の一度だけ、人間の手が代わりに持ち上げていた。合言葉の、完全な回収です。
印刷 / PDF 化:⌘+P(Windows は Ctrl+P)。画面では図1のボタンでオペコードを変え、点灯する制御線(=動作)の切り替わりを、図2で二つの制御方式の底が同じ論理ゲートであることを確かめられます。「答えを見る」で解答が開きます。