わかるUNIXの歴史第 9 回 / ソフトの底

借りる相手が1台も無い、世界で最初の機械 ── どうやって最初の命令を入れたか

最初の1バイト ── 手で入れる クロス(第8回)で借りる相手すらいない、いちばん最初の機械。そこにはアセンブラも、読み込ませる紙テープも無い。人間が命令表を見て機械語の数値を手で作りトグルスイッチで1語ずつメモリに入れる。合言葉「最初の卵は、手で彫った」が、ほぼ文字どおりの事実になります。

必要な道具:第7・8回(アセンブリ/クロス) 種明かし:bootstrap = 靴ひもで自分を持ち上げる

第8回で、新しい機械は「すでに動く別の機械」を借りて立ち上げると見ました。でもその連鎖をさかのぼると、必ず ── 借りる相手が1台も無い、いちばん最初の機械に着きます。世界初のそのコンピュータには、アセンブルしてくれる別の機械も、できあいの紙テープもありません。ではどうやって、いちばん最初の命令を入れたのか。答えは、これ以上ないほど素朴でした。人間が、手で。 ここが、ソフトウェアの鶏と卵のです。

01まず、人間がアセンブラになる ── ハンドアセンブル

第7回で、アセンブリ(人が読める)を機械語(数値)に変えるのはアセンブラだ、と見ました。そのアセンブラが無いなら ── 人間が自分でその変換をやる。CPU の命令表(マニュアル)を見て、「この命令のオペコードは 6、番地はここ…」と、紙の上で機械語の数値を手計算する。これをハンドアセンブルと言います。第7回の図1(アセンブル)を、機械の代わりに人間が鉛筆でやる、と思ってください。

// 人間がマニュアルを見て、手で数値に翻訳(ハンドアセンブル) 命令: 「メモリを読んで、次へ」 → オペコード表を引く … 6032(8進) // 手で決める → 次の語 … 5357(8進) // 手で決める この数値の列を、これから“手で”機械に入れる

02トグルスイッチで、1語ずつ入れる

手で作った数値を、どうやってメモリへ? 初期の機械(PDP-8、初期の PDP-11、Altair 8800 など)には、正面にトグルスイッチの列(フロントパネル)がありました。使い方はこうです ── スイッチで1語ぶんのビット(0/1)を立て、「DEPOSIT(格納)」を押すと、その1語がメモリに書き込まれ、番地が1つ進む。 これを語の数だけ繰り返す。文字どおり、手でビットを並べて機械に入れるのです。下のフロントパネルを、実際に触ってみてください。

図1:フロントパネル(さわれます)。スイッチをクリックしてビットを立て、DEPOSIT でメモリに1語書き込む。お手本のローダを上から順に入れてみよう(値は8進)
スイッチ=クリックで 0/1 を反転 / 下のボタンで操作
スイッチを立てて DEPOSIT。お手本の最初の値に合わせてみよう。
つなぐ声 ── 消えないメモリ(コアメモリ) 当時の主記憶は磁気コアメモリで、電源を切っても内容が消えませんでした。だから一度手で入れたブートストラップは、電源を落としても残っていることがあった。毎回ゼロから全部トグルし直す、とは限らなかったのです。とはいえ、いちばん最初の1回は ── やはり、誰かが手で入れました。

03全部は入れない ── ブートストラップローダ

もちろん、OS 全部を手でトグルするのは正気の沙汰ではありません。だから入れるのは、ごく短い「ローダ」だけ。その小さなローダの仕事はただ一つ ── 紙テープ(や後のディスク)から、もっと大きなプログラムを読み込んでメモリに入れ、そこへ実行を移すこと。PDP-11 のブートストラップローダは「手でトグルするのでとにかく短く」設計されていました。多くの場合、手で入れた極小ローダ → 紙テープの二段目ローダ → OS と、読み込みが階段状に大きくなります。下の図で、その階段を昇ってください。

図2:ブートストラップの階段。手でトグルするのは最初の数語だけ。その極小ローダが二段目を読み、二段目が OS を読む。上へ行くほど大きく、最初の種は手で彫った数語
今回の急所 ── 合言葉が、文字どおりになる

シリーズの合言葉「最初の卵は、手で彫った」は、ここでほぼ比喩ではなくなります。今あなたが使う OS も、コンパイラも、第0回の自己ホスティングの輪も、さかのぼれば ── 誰かがマニュアルを片手に、スイッチで手入力した数語の上に載っている。巨大なソフトの塔の、いちばん底の礎石は、人間の指でした。

◇ ◇ ◇

04語源 ── 自分の靴ひもで、自分を持ち上げる

bootstrap(ブートストラップ)という言葉は、19世紀の言い回し「自分の靴ひも(bootstrap)を引っぱって自分を持ち上げる」から来ています。物理的には不可能な、ほら話です。何も無い所から何かを立ち上げる、という含意。第0回で「輪は自力では始まらない、外から一度だけ持ち上げる」と言いました ── その“外からの持ち上げ”の物理的な現場が、このフロントパネルでした。そして今、コンピュータの電源を入れることを「ブート(boot)する」と言うのも、この bootstrap が語源です。毎朝あなたが押す電源ボタンは、手でスイッチを叩いた時代の、遠い子孫なのです。

第0回の合言葉、回収

「鶏が先か卵が先か ── 最初の卵は、手で彫った。」
鶏(動くソフト)も卵(そのソースやツール)も、無からは湧かなかった。いちばん最初だけは、人間が手で数語を彫り込み、その極小の種がローダを呼び、ローダが OS を呼び、OS の上でコンパイラが動き、コンパイラが自分を再生産する輪に入った。種が撒かれたあとは、ソフトがソフトを作るループが回り続けている ── これが、鶏と卵の答えの形でした。

正直な線 ── 「1バイト」「手で」の、ていねいな線引き

(1) タイトルの「1バイト」は象徴で、実際に手で入れる単位は語(word)(機械により18ビットや16ビットなど)です。(2) 毎回すべてを手トグルしたわけではありません ── コアメモリで残ったり、のちの機械はブートストラップを ROM に焼いて手トグルを卒業しました(今の PC の起動もその延長)。「手で入れる」はいちばん最初の一回/新品の立ち上げの話です。

(3) 図1の値やビット数、図の手順は、フロントパネル操作の感じを伝えるための簡略化で、特定機種の厳密な再現ではありません(トグルスイッチでのメモリ格納とブートストラップローダは実在の実務)。(4) そして最大の但し書き ── 手で入れた数値を“意味”に変えるのは、まだ下にいる「機械そのもの」です。スイッチの 0/1 を命令として実行するのは、配線された回路。ソフトの底には着きましたが、その下にハードウェアが残っています ── 最終回・第10回へ。

練習問題(今回の話だけで解けます)
  1. ハンドアセンブルとは何か。第7回のアセンブラと対比して一文で。
    答えを見る
    アセンブラ(プログラム)がやる「アセンブリ→機械語の数値」への変換を、人間がマニュアルを見て手で行うこと。人間が自分でアセンブラの役をする。
  2. フロントパネルで1語をメモリに入れる操作を、簡単に述べよ。
    答えを見る
    トグルスイッチで1語ぶんのビット(0/1)を設定し、DEPOSIT を押して現在番地に書き込む。番地が1つ進むので、語の数だけ繰り返す。
  3. なぜ OS を全部手で入れず、短いローダだけ入れるのか。
    答えを見る
    全部を手トグルするのは非現実的だから。極小のローダを手で入れ、それに紙テープ等から大きなプログラム(二段目ローダやOS)を読み込ませる。読み込みが階段状に大きくなる。
  4. 「bootstrap」「boot」の語源と、第0回の合言葉との関係は。
    答えを見る
    bootstrap=自分の靴ひもで自分を持ち上げる(不可能事)で、何も無い所から立ち上げる含意。第0回「輪は外から一度だけ持ち上げる」の物理的現場がフロントパネル。今の「ブート(起動)」もこの語源。合言葉「最初の卵は手で彫った」がここで文字どおりになる。

まとめソフトの底は、人間の指だった

クロス(第8回)の連鎖をさかのぼると、借りる相手が1台も無い最初の機械に着く。そこには鶏(動くソフト)も卵(ツール)も無い。だから人間が、CPU のマニュアルを見て機械語の数値を手で作り(ハンドアセンブル)、フロントパネルのトグルスイッチで1語ずつメモリに入れた。全部は入れない ── 手で入れるのは極小のブートストラップローダだけで、それが紙テープから二段目を、二段目が OS を読む階段になる。

bootstrap は「靴ひもで自分を持ち上げる」不可能事の名で、その“外からの一度きりの持ち上げ”の現場がこのフロントパネルだった(今の「ブート」の語源)。第0回の合言葉「最初の卵は、手で彫った」は、ここでほぼ文字どおりになる ── 巨大なソフトの塔の礎石は、人間の指。ただし、手で入れた 0/1 を意味(実行)に変えるのは、まだ下にいる機械そのものだ。ソフトの底には着いた。残る問いは一つ ── その機械語を「動作」にするハードウェアは、誰が作ったのか。 最終回、いちばん下の底へ。

この文書は「わかるUNIXの歴史」シリーズ第9回です。史実:初期の計算機(IBM 650、DEC PDP-5〜PDP-8、初期の PDP-11、Altair 8800 など)はフロントパネルのトグルスイッチ列を備え、operator が起動命令を手動でメモリに入れてから CPU に制御を渡した。主記憶の磁気コアメモリは電源を切っても内容を保持したため、入力済みのブートストラップが残ることがあった。ブートストラップローダは手動トグルのため極力短く設計され、紙テープ読取機から二段目ローダ(チェックサム付き Binary Loader 等)や OS を読み込んだ。ハンドアセンブルは、アセンブラを用いずに人間がマニウアルから機械語を手作業で求めること。「bootstrap」は19世紀の「自分の靴ひもで自分を持ち上げる」に由来し、現在の「boot(起動)」の語源。図・数値・ビット数は操作の概念を伝えるための簡略化で、特定機種の厳密な再現ではない。手入力された機械語を実行(意味)に変えるのはハードウェア(命令デコーダ等)であり、次回第10回で扱う。 ── 印刷する場合はブラウザの「印刷」から「PDF に保存」を(印刷版では図の操作・解答は静止/非表示になります)。

印刷 / PDF 化:⌘+P(Windows は Ctrl+P)。画面では図1のフロントパネルのスイッチをクリックし DEPOSIT でメモリに書き込めます(お手本のローダを入れてみよう)。図2のスライダーでブートストラップの階段を昇れます。「答えを見る」で解答が開きます。