わかるUNIXの歴史第 10 回 / 底 ── ソフトではないもの

手で入れた 6032 を「動作」に変えるのは、何か

底 ── ハードウェアという本当の種 第9回で、人間が手で 6032 という数値をメモリに入れました。でも数値は、それだけでは何も起きません。「メモリを読め」という動作に変えるのは何か ── それは論理ゲートで配線された命令デコーダ。そしてそれを設計したのも、人間です。

必要な道具:第9回(手で入れた数値) 種明かし:意味は「配線された真理値表」に宿る

私たちは長い階段を降りてきました ── Linux を gcc が、gcc を既存 cc が、C を B が、アセンブラをクロスが、そして最初の数語を人間の手が。第9回で「ソフトの底」に着いたはずでした。でも、まだ一段残っています。手で入れた 6032 は、ただのビットの並び。これを「メモリを読む」という現実の動作に変えているものが、必ず要る。それが今回の主役 ── ハードウェアです。ここから下は、もうプログラムではありません。配線された物理と、それを設計した人間の手だけ。鶏と卵の、いちばん底です。

016032 は、それだけでは何も意味しない

第7回で見たとおり、機械語はただの数値です。6032 という並びが「メモリを読め」を意味するのは、そう解釈するように作られた機械の中でだけ。同じビット列も、別の設計の機械に入れれば、まったく違う動作になる(あるいは何も起きない)。数値そのものに意味は無い。意味は、それを受け取る機械の側にある。

02意味を与えるもの ── 命令デコーダ

CPU の中で、命令の数値(オペコード)を受け取り、「どの動作をせよ」という制御信号に変える部品を 命令デコーダ(制御装置)と呼びます。オペコードのビットの並びに応じて、加算器を動かす線、メモリを読む線、レジスタに書く線…のどれを点灯させるかが決まる。下の図で、オペコードを変えて、点灯する制御線=実行される動作が切り替わる様子を見てください。

図1:命令デコーダ。オペコード(数ビット)を選ぶと、配線された回路がそれに対応する制御線を1本点灯させる ── これが「数値→動作」の翻訳。意味は、この配線に宿る
オペコードを選ぶ:

03その下 ── 論理ゲートと、真理値表

命令デコーダの中身は、論理ゲート(AND・OR・NOT)の集まりです。AND・OR・NOT を組み合わせれば、どんな真理値表(入力の各パターンに、出力をこう割り当てる、という表)でも作れます。デコーダとは、「このオペコードのときは、この制御線を点灯」という真理値表を、ゲートで物理的に実現したものにほかなりません。そしてゲートは、トランジスタというスイッチの集まりです。

今回の急所 ── ソフトの意味は「配線された表」で底を打つ

プログラムの意味をどこまでも下へたどると、最後は 「オペコード → 制御線」という表を、論理ゲートで配線したものに行き着きます。これはもうプログラムではありません。書き換え可能なソフトではなく、固定された物理。ソフトの鶏と卵は、ここでソフトでないものに受け止められて、止まります。

◇ ◇ ◇

04寄り道 ── デコーダの中に、小さなプログラムがいることも

ただし、一段だけ寄り道があります。CPU によっては、命令の解釈をマイクロコードというCPU内部の小さなプログラムで行います(Maurice Wilkes が1951年に提唱)。この場合、機械語はいったんマイクロコードという「小さなインタプリタ」に渡され、より細かいマイクロ命令の列に分解される。── まるでミニチュアの鶏と卵です。でも安心してください。そのマイクロコードを実行する土台は、結局ハードワイヤード(べた配線)な論理ゲート。下の図で、両方式を切り替えて、どちらも最後は論理ゲートで底を打つことを確かめてください。

図2:ハードワイヤード vs マイクロプログラム。マイクロコード方式は「小さなプログラム」を挟むが、それを動かす土台は結局べた配線の論理ゲート。ここから下はソフトではない

05その配線は、誰が作ったのか ── 人間

では、その真理値表を決め、ゲートに落とし、チップに焼いたのは誰か。── 人間です。 どのビット列にどの動作を割り当てるか(命令セット)を設計し、それを論理回路にし、配線した。第9回で「最初の数語を手で彫った」のと、ここで「意味を与える配線を手で設計した」のは、シリーズの二つの種です。両方とも ── プログラムではなく、人間+物理。鶏と卵をさかのぼる旅は、ソフトの外(人間の設計と、配線された物理)で、ちゃんと底を打ちます

さらに下は、ソフトの問いではない

ゲートはトランジスタ、トランジスタはシリコン、シリコンは物理法則に従う電子 ── と、まだ下に世界は続きます。でもそれは物理と製造の話で、「何がコンパイルしたか」というソフトの鶏と卵ではありません。もちろんハードにも独自のブートストラップがあります(チップの設計に使う道具も、また別のチップ…)。でもそれは別の鎖。私たちのたどってきたソフトの鎖は、ここ ── 人間が設計し配線した論理ゲート ── で、確かに終わりました。

正直な線 ── 図は理想化、底は物理

(1) 図1の「オペコード2ビット→4動作」は説明用の最小モデルで、実際の命令セットははるかに多く、複雑です。(2) 現代の CPU は、パイプライン・投機実行・マイクロオペレーションのキャッシュなど桁違いに込み入っていて、「デコーダ=単純な真理値表」はあくまで骨格の話です。(3) マイクロコード(Wilkes, 1951)は実在の技術で、機械語をCPU内部の小プログラムで解釈しますが、その土台は最終的にハードワイヤードな論理に落ちます。

(4) 「意味は配線に宿る/その設計者は人間」という言い方は、ソフトの鶏と卵の終端を指すためのものです。ハードウェアの製造にはハード自身のブートストラップ(道具が道具を作る連鎖)があり、それは本シリーズの射程外の別問題です。最下層の“物理”そのものは、人間が「作った」のではなく、設計して利用したと言うのが正確です。

練習問題(今回の話だけで解けます)
  1. 6032 という機械語の「意味」は、どこにあるか。
    答えを見る
    数値そのものではなく、それを受け取る機械(命令デコーダ)の側にある。同じビット列も、別設計の機械では別の動作になる。意味は配線に宿る。
  2. 命令デコーダの中身を、真理値表という言葉で説明せよ。
    答えを見る
    「このオペコードのときは、この制御線を点灯」という真理値表を、AND・OR・NOT の論理ゲートで物理的に実現したもの。
  3. マイクロコード方式でも、鶏と卵が“無限後退”しないのはなぜか。
    答えを見る
    マイクロコードは小さなプログラムだが、それを実行する土台は結局ハードワイヤードな論理ゲート(べた配線)で、そこで底を打つから。
  4. このシリーズの「二つの種」とは何か。共通点は。
    答えを見る
    ①第9回:人間が手で入れた最初の数語。②第10回:人間が設計・配線した、意味を与える論理ゲート。共通点は、どちらもプログラムではなく「人間+物理」であること。

まとめソフトの鎖は、配線された物理で底を打つ

第9回で手で入れた 6032 は、ただのビット列。それを「メモリを読む」という動作に変えているのが 命令デコーダ(制御装置)で、中身は 論理ゲート(AND・OR・NOT)── 「オペコード→制御線」という真理値表を、物理的に配線したものだ。数値に意味は無く、意味は機械の配線の側にある。ソフトの意味をどこまで下へたどっても、最後はこのプログラムでない、固定された物理に受け止められる。

マイクロコード(Wilkes, 1951)という「CPU内部の小さなプログラム」を挟む設計もあるが、その土台も結局ハードワイヤードな論理ゲート。そして、どのビット列にどの動作を割り当てるか(命令セット)を設計し配線したのは ── 人間だ。第9回「最初の数語を手で彫った」と、この第10回「意味を与える配線を手で設計した」が、シリーズの二つの種。両方ともプログラムではなく、人間+物理。鶏と卵をさかのぼる旅は、ソフトの外で、確かに底を打った。── 次回、最終回。降りきった底から見上げて、答えの全体像を組み立てます。

この文書は「わかるUNIXの歴史」シリーズ第10回です。史実・技術:CPU の制御装置(命令デコーダ)は命令のオペコードをデコードし、データパス(ALU・レジスタ・メモリ等)を動かす制御信号を生成する。ハードワイヤード制御では、制御信号は論理ゲート・フリップフロップ・デコーダから成る固定回路で生成され、各命令の動作が配線として物理的に作り込まれる。マイクロプログラム制御では、制御信号列(マイクロコード)を制御ストアに置き、小さなインタプリタのように命令を解釈する(Maurice Wilkes が1951年の論文「The Best Way to Design an Automatic Calculating Machine」で提唱)。いずれの方式も最終的にはハードワイヤードな論理ゲートに帰着する。論理ゲート(AND・OR・NOT、機能的完全性)は任意の真理値表を実現でき、デコーダは「オペコード→制御線」の対応表を回路化したものと言える。図は説明のための最小モデルで、実際の命令セットや現代 CPU(パイプライン、マイクロオペレーション等)は遥かに複雑。ハードウェアの製造・設計自体にも別のブートストラップ(EDA など道具の連鎖)があるが、本シリーズが追う「ソフトウェアの鶏と卵」とは別の問題である。 ── 印刷する場合はブラウザの「印刷」から「PDF に保存」を(印刷版では図の操作・解答は静止/非表示になります)。

印刷 / PDF 化:⌘+P(Windows は Ctrl+P)。画面では図1のボタンでオペコードを変え、点灯する制御線(=動作)の切り替わりを、図2で二つの制御方式の底が同じ論理ゲートであることを確かめられます。「答えを見る」で解答が開きます。