借りる相手が1台も無い、世界で最初の機械 ── どうやって最初の命令を入れたか
第8回で、新しい機械は「すでに動く別の機械」を借りて立ち上げると見ました。でもその連鎖をさかのぼると、必ず ── 借りる相手が1台も無い、いちばん最初の機械に着きます。世界初のそのコンピュータには、アセンブルしてくれる別の機械も、できあいの紙テープもありません。ではどうやって、いちばん最初の命令を入れたのか。答えは、これ以上ないほど素朴でした。人間が、手で。 ここが、ソフトウェアの鶏と卵の底です。
第7回で、アセンブリ(人が読める)を機械語(数値)に変えるのはアセンブラだ、と見ました。そのアセンブラが無いなら ── 人間が自分でその変換をやる。CPU の命令表(マニュアル)を見て、「この命令のオペコードは 6、番地はここ…」と、紙の上で機械語の数値を手計算する。これをハンドアセンブルと言います。第7回の図1(アセンブル)を、機械の代わりに人間が鉛筆でやる、と思ってください。
手で作った数値を、どうやってメモリへ? 初期の機械(PDP-8、初期の PDP-11、Altair 8800 など)には、正面にトグルスイッチの列(フロントパネル)がありました。使い方はこうです ── スイッチで1語ぶんのビット(0/1)を立て、「DEPOSIT(格納)」を押すと、その1語がメモリに書き込まれ、番地が1つ進む。 これを語の数だけ繰り返す。文字どおり、手でビットを並べて機械に入れるのです。下のフロントパネルを、実際に触ってみてください。
もちろん、OS 全部を手でトグルするのは正気の沙汰ではありません。だから入れるのは、ごく短い「ローダ」だけ。その小さなローダの仕事はただ一つ ── 紙テープ(や後のディスク)から、もっと大きなプログラムを読み込んでメモリに入れ、そこへ実行を移すこと。PDP-11 のブートストラップローダは「手でトグルするのでとにかく短く」設計されていました。多くの場合、手で入れた極小ローダ → 紙テープの二段目ローダ → OS と、読み込みが階段状に大きくなります。下の図で、その階段を昇ってください。
シリーズの合言葉「最初の卵は、手で彫った」は、ここでほぼ比喩ではなくなります。今あなたが使う OS も、コンパイラも、第0回の自己ホスティングの輪も、さかのぼれば ── 誰かがマニュアルを片手に、スイッチで手入力した数語の上に載っている。巨大なソフトの塔の、いちばん底の礎石は、人間の指でした。
bootstrap(ブートストラップ)という言葉は、19世紀の言い回し「自分の靴ひも(bootstrap)を引っぱって自分を持ち上げる」から来ています。物理的には不可能な、ほら話です。何も無い所から何かを立ち上げる、という含意。第0回で「輪は自力では始まらない、外から一度だけ持ち上げる」と言いました ── その“外からの持ち上げ”の物理的な現場が、このフロントパネルでした。そして今、コンピュータの電源を入れることを「ブート(boot)する」と言うのも、この bootstrap が語源です。毎朝あなたが押す電源ボタンは、手でスイッチを叩いた時代の、遠い子孫なのです。
「鶏が先か卵が先か ── 最初の卵は、手で彫った。」
鶏(動くソフト)も卵(そのソースやツール)も、無からは湧かなかった。いちばん最初だけは、人間が手で数語を彫り込み、その極小の種がローダを呼び、ローダが OS を呼び、OS の上でコンパイラが動き、コンパイラが自分を再生産する輪に入った。種が撒かれたあとは、ソフトがソフトを作るループが回り続けている ── これが、鶏と卵の答えの形でした。
(1) タイトルの「1バイト」は象徴で、実際に手で入れる単位は語(word)(機械により18ビットや16ビットなど)です。(2) 毎回すべてを手トグルしたわけではありません ── コアメモリで残ったり、のちの機械はブートストラップを ROM に焼いて手トグルを卒業しました(今の PC の起動もその延長)。「手で入れる」はいちばん最初の一回/新品の立ち上げの話です。
(3) 図1の値やビット数、図の手順は、フロントパネル操作の感じを伝えるための簡略化で、特定機種の厳密な再現ではありません(トグルスイッチでのメモリ格納とブートストラップローダは実在の実務)。(4) そして最大の但し書き ── 手で入れた数値を“意味”に変えるのは、まだ下にいる「機械そのもの」です。スイッチの 0/1 を命令として実行するのは、配線された回路。ソフトの底には着きましたが、その下にハードウェアが残っています ── 最終回・第10回へ。
クロス(第8回)の連鎖をさかのぼると、借りる相手が1台も無い最初の機械に着く。そこには鶏(動くソフト)も卵(ツール)も無い。だから人間が、CPU のマニュアルを見て機械語の数値を手で作り(ハンドアセンブル)、フロントパネルのトグルスイッチで1語ずつメモリに入れた。全部は入れない ── 手で入れるのは極小のブートストラップローダだけで、それが紙テープから二段目を、二段目が OS を読む階段になる。
bootstrap は「靴ひもで自分を持ち上げる」不可能事の名で、その“外からの一度きりの持ち上げ”の現場がこのフロントパネルだった(今の「ブート」の語源)。第0回の合言葉「最初の卵は、手で彫った」は、ここでほぼ文字どおりになる ── 巨大なソフトの塔の礎石は、人間の指。ただし、手で入れた 0/1 を意味(実行)に変えるのは、まだ下にいる機械そのものだ。ソフトの底には着いた。残る問いは一つ ── その機械語を「動作」にするハードウェアは、誰が作ったのか。 最終回、いちばん下の底へ。
6032 という数値を、「メモリを読め」という動作に変えるのは何か。それは、論理ゲートで配線された命令デコーダ── そしてそれを設計したのも、人間です。ソフトの連鎖のいちばん下には、配線された物理と、それを作った手がある。鶏と卵の、最後の底へ。
印刷 / PDF 化:⌘+P(Windows は Ctrl+P)。画面では図1のフロントパネルのスイッチをクリックし DEPOSIT でメモリに書き込めます(お手本のローダを入れてみよう)。図2のスライダーでブートストラップの階段を昇れます。「答えを見る」で解答が開きます。