再実装の木の若葉・Linux が、どうやって産声をあげたか ── 1991年に密着
gcc で着火した」と言いました。今回はその瞬間を、バージョン番号の解像度で見ます。単体では動けなかった赤ちゃん v0.01 から、Linux が Linux 自身をコンパイルできた v0.11 ── 産室(MINIX)から巣立つまでの4か月。
1991年、フィンランドの学生 Linus Torvalds は、買ったばかりの386 PCで、MINIX を開発環境(第1回でいう産室)として使っていました。そこには GNU の道具 ── C コンパイラ gcc と シェル bash ── が移植されていた。この gcc こそ、最初の Linux をコンパイルした「親」です。でも生まれたての Linux は、まだ自分では自分をコンパイルできない。輪(第0回)は、まだ MINIX におんぶしている状態でした。その赤ちゃんが、どうやって自分の足で立つのか。まずは、いちばん最初の“心臓の鼓動”から。
Linux は「OSを作るぞ」と設計図から始まったわけではありません。最初にあったのは、386の機能を試す2つの小さなプログラムでした。片方はひたすら A を、もう片方はひたすら B を画面に打ち続ける。この2つを、CPUがすばやく切り替えて交互に走らせることに成功したとき ── それが、OSの心臓(タスク切り替え)の最初の鼓動でした。
ここに端末ドライバを足して、自宅から大学のコンピュータへダイヤルアップできるようにし ── と、機能が雪だるま式に増えていく。「OSを作ろう」ではなく「386で遊んでいたら、いつのまにかOSになっていた」。そして1991年8月25日、あの有名な投稿が comp.os.minix に流れます。
gcc・bash)はすでに GNU が作っていた。だから最初の Linux は、GNU の道具でコンパイルされ、のちに GNU の道具と合体して1つのOSになります(“GNU/Linux”)。謙遜のジョークが、実は系譜の正確な自己紹介でした。
最初に公開された v0.01 は、約10,239行。ですがこれは、電源を入れれば動く完成品ではありません。コンパイルするにも、セットアップするにも、MINIX が要る。輪はまだ着火しておらず、産室に完全におんぶした状態です。
・コンパイル:MINIX 上の gcc がやる(Linux 自身にはまだコンパイラが乗らない)。
・準備:MINIX のファイルシステムやツールを使ってディスクを整える。
・つまり Linux を用意するために、まず MINIX が動いていないといけない。第0回の言葉でいえば「輪の外の何か(=MINIX+gcc)が、まだ持ち上げ続けている」段階。
ここからが今回の主役です。下のスライダーで v0.01 → 0.02 → 0.11 → 0.12 と進めてください。MINIX への依存が減り、ある一点で「自分で自分をコンパイルできる」自己ホスティングに切り替わるのが見えます。その瞬間が、産室からの巣立ちです。
v0.01(9月)
MINIX上のgccでコンパイル。単体では実用にならない。おんぶ。
v0.02(10月5日)
Linux 上で bash と gcc が動きだす。道具を自分の上で動かせ始めた。
v0.11(12月19日)── 巣立ち
自己ホスティング達成。Linux 上で Linux をコンパイルできた。輪が回り始めた瞬間。mkfs・fdisk など自前ツールも揃う。
v0.11 の自己ホスティングは、「もう何にも頼らない」という意味ではありません。正しくは ── Linux を作るのに、もう MINIX を持ち出さなくてよくなった(輪を自分で回せるようになった)ということ。コンパイラ自体はいまも GNU の gcc。第0回で見たとおり、自己ホスティングとは「外の着火装置(MINIX)を外せる」ことであって、「1人で無から立つ」ことではありません。
技術的な巣立ちは v0.11 でした。でも Linux を世界に広げたのは、次の v0.12(1992年1月5日、約2万行未満)での一手 ── ライセンスを GPLv2 に変えたことです。それ以前は Torvalds 自作の制限付きライセンスで、商用の再配布を禁じていました。
(1) v0.11 の「自己ホスティング」はカーネルとビルドがLinux上で完結するという意味で、コンパイラは今も GNU の gcc(または clang)です。私たちが日常使う“Linux”は、Linuxカーネル+GNUユーザーランドの合作 ── だから “GNU/Linux” とも呼ばれます(第1回「こずえで葉を交換」)。完全な単独自立ではありません。
(2) v0.01 が「動かない」は言い過ぎで、正確には最小限は動くが、準備も改造も MINIX 前提で実用にならないという意味です。(3) 日付は資料により幅があります(v0.01 は1991年9月中旬、通説では9月17日公開)。(4) 「AAAA/BBBB」の逸話は Torvalds 自伝『Just for Fun』などで広く語られる有名なエピソードで、細部の脚色はあり得ます。
Linux は設計図ではなく、386上のタスク切り替え(AAAA/BBBB)という心臓の鼓動から始まった。開発環境は MINIX(産室)で、そこに移植された GNU の gcc が最初の Linux をコンパイルした。v0.01(1991年9月・約1万行)はコンパイルもセットアップも MINIX が要る“おんぶ”状態 ── 輪はまだ外(MINIX)が回していた。
v0.02(10月)で Linux 上でも bash・gcc が動きだし、v0.11(12月19日)で自己ホスティング達成=Linux が Linux をコンパイルし、産室から巣立った。ここでいう自立は「依存ゼロ」ではなく「外の着火装置を外せた(輪を自分で回せる)」こと。翌月の v0.12 は GPLv2 という二段目のロケットで、Linux を世界の共同開発へ押し上げた。── では、その最初の親 gcc は、いったい何がコンパイルしたのか? 階段を、もう一段下へ。
gcc ── その gcc 自身も C で書かれたプログラムです。ではコンパイラがまだ無い所で、最初の gcc は何が作ったのか。答えは「そのマシンの既存の cc で1回だけ持ち上げ、あとは自分で自分を作る」。3段ブートストラップという、輪の“正しい回し方”を見ます。
印刷 / PDF 化:⌘+P(Windows は Ctrl+P)。画面では図1の「▶ 走らせる」でタスク切り替えを、図2のスライダーで v0.01→0.12 の巣立ちを追えます。「答えを見る」で解答が開きます。