第0回で出した問い ── その答えの、全体像を組み立てる
gcc が、gcc は既存 cc が、C は B が、アセンブラはクロスが、最初のバイトは人間の手が、その意味は配線が。── 降りきった底から見上げると、鶏と卵の答えが一枚の絵になります。
第0回で、私たちは問いを立てました ── 「Linux は Linux 上の gcc でコンパイルする。では最初の Linux は、何がコンパイルしたのか?」。以来、その輪の外へ、下へ、一段ずつ降りてきました。MINIX 上の gcc、既存の cc、B から育った C、O-code、PDP-7 のアセンブリ、GE-635 のクロスアセンブラと紙テープ、トグルスイッチで手入力した数語、そして意味を与える配線されたデコーダ。長い階段でした。もう底です。今回は登り返して、鶏と卵の答えを、はっきり言葉にします。
まず全体を一望します。第0回で予告した階段を、私たちは実際に降りきりました。下の図で、いちばん下の種に火を入れてください。火が下から上へ順に灯り、いちばん上で ── 第0回の自己ホスティングの輪が、回り始めます。
鶏と卵は、素朴には無限にさかのぼるように見えます。でも実際は違いました。連鎖は有限で、ソフトでない二つの種に受け止められて、止まる。
種①:最初のバイト(第9回)── 人間が命令表を見て機械語を手で作り、トグルスイッチで入れた数語。
種②:意味を与える機械(第10回)── そのバイトを動作に変える、人間が設計・配線した論理ゲート。
どちらもプログラムではありません。人間+物理です。鶏(動くソフト)と卵(そのソース)が互いを必要とする輪は、この二つの種によって外から一度だけ着火された。以後は ── soft が soft を作るループが、自分で回り続けています。
種①②にも「では人間は? 物理は?」と問えます。でもそれはもう“何がコンパイルしたか”という問いではありません。人間の意図と、物理法則の話 ── ソフトの鶏と卵とは別の鎖です。私たちが追ってきた「何が何をコンパイルしたか」の鎖は、ソフトでないもの(手と配線)に着いた時点で、正しく終わっている。無限後退ではなく、着地でした。
そして、ここがいちばん美しいところ。種に火が入ったのは、一度きりでした。あとは自己ホスティングの輪が回り続けている ── C が C を、gcc が gcc を、Linux が Linux を作り、その上でまた次の gcc が…。だから今のあなたは、もう手でスイッチを叩かなくていい。半世紀前に一度撒かれた種から伸びたループが、一度も止まらずに、今あなたの手元まで回ってきているのです。下の年表で、その一本道をたどってください。
bootstrap は「自分の靴ひもを引っぱって自分を持ち上げる」という、物理的に不可能なほら話でした(第9回)。ソフトウェアは、まさにそれをやっているように見える ── コンパイラがコンパイラを作り、OS が OS を作る。でも謎は解けました。最初の一度だけ、外にいる人間の手が、代わりに持ち上げたのです。いったん少しでも持ち上がれば、あとは「1つ前の自分」を足場にして、自分で自分を持ち上げられる。自己ホスティングとは、前の自分の肩に乗ること。靴ひもの謎の答えは ── 最初の一歩だけ、他人(人間)の手を借りた、でした。
鶏が先か、卵が先か。
── 最初の卵は、手で彫った。
そして彫られた種のあとは、ソフトがソフトを作るループが、一度も止まらずに回り続けている。
gcc と打つときあなたが端末で gcc と打ち、Linux をビルドするとき ── その一行は、切れ目のない鎖でつながっています。前の gcc、そのまた前の gcc、…、Ritchie が B から育てた C、Thompson が紙テープで運んだアセンブラ、誰かがコンソールでスイッチを叩いた数語、そして技術者たちが配線した論理ゲートへ。その鎖は、一度も切れていない。あなたのビルドは、半世紀前に手で撒かれた種から、今も伸び続けている枝の先端です。── これが「わかるUNIXの歴史」の、答えでした。
(1) 「二つの種で底を打つ」はソフトウェアの鶏と卵(何が何をコンパイルしたか)に対する答えです。ハードウェアの製造・設計そのものには、別のブートストラップ(チップを設計する道具も、また別のチップやソフト…)があり、それはそれで豊かな別の物語です ── 本シリーズの射程の外に、まだ続いています。
(2) 歴史の細部(年号・人物・経緯)は資料により幅があり、各回の脚注で出典の取れる範囲に留めました。(3) 「手で彫った」「種」「火」は理解のための言い回しですが、初期のハンドアセンブルとスイッチ入力(第9回)、命令セットの人手設計(第10回)という事実に裏打ちされています。(4) このシリーズは、コンパイラ・OS・自己ホスティングという枠組みが有効に働いていることを前提に、その“出発点”だけを問い直したものです。
「最初の Linux は何がコンパイルしたのか」から始めて、私たちは輪の外へ、下へ降り続けた ── MINIX 上の gcc、既存 cc、B から育った C、O-code、PDP-7 のアセンブリ、GE-635 のクロスアセンブラと紙テープ、手でトグルした数語、配線された命令デコーダ。鶏と卵は無限後退ではなく、ソフトでない二つの種── ①手で入れた最初のバイト、②手で配線した意味を与える機械 ── で底を打った。両方とも人間+物理だった。
種に火が入ったのは一度きり。あとは自己ホスティングのループが、半世紀、一度も止まらずに回り続け、今あなたの gcc まで届いている。bootstrap=靴ひもで自分を持ち上げる不可能事の答えは、「最初の一歩だけ、人間の手が持ち上げた」。第1回の二本の木(血統と再実装)も、根の下では同じ物理の大地に立っていた。── 鶏が先か、卵が先か。最初の卵は、手で彫った。 彫られた種のあとは、ソフトがソフトを作るループが回り続けている。これが、このシリーズの答えです。読んでくださって、ありがとう。
印刷 / PDF 化:⌘+P(Windows は Ctrl+P)。画面では図1の「▶ 種に火を入れる」で全体の点火を、図2のスライダーで年表をたどれます。「答えを見る」で解答が開きます。目次に戻って、気になる回をもう一度どうぞ。