第0回の宿題 ── 「Linux は MINIX の子か?」に、はっきり答える
第0回で、鶏と卵の輪を「何が何をコンパイルしたか」でさかのぼりました。でもUNIXの歴史にはもう一本、まったく別の系図があります ── 誰の“ソースコード”を受け継いだかという血統です。初学者が必ずやる誤解「Linux は MINIX の子」「MINIX は BSD の子」は、この血統の木と、思想だけを受け継ぐ再実装の木を、一本に混ぜてしまうことから起きます。今回は二本の木をていねいに描き分け、最後に Tanenbaum–Torvalds 論争を、その二本の木で読み解きます。
ソフトが別のソフトから何かを「受け継ぐ」とき、受け継ぐ中身は大きく二つに分かれます。
① コードの血統(遺伝子):実際のソースコードの行を受け継ぐ。親のコードをコピーし、改変して育てる。だから著作権・ライセンスが付いて回る。
② 思想の再実装(設計・API):コードは1行ももらわず、「どう振る舞うか(システムコール・設計思想)」だけを真似て、白紙から書き直す。互換はあっても、遺伝子は無関係。
この二つは直交します。あるソフトが別のソフトと「そっくりに振る舞う」からといって、コードを受け継いでいるとは限らない。逆に、見た目が違っても中身のコードは親ゆずり、ということもある。UNIX一族は、この二本の木がからみ合って森になっています。
まず実コードが流れる本流。1969年、ベル研の AT&T UNIX が源です(その手前の Multics は“反面教師”としての思想的影響で、コードは受け継いでいません ── これは番外編で)。AT&T UNIX のソースコードは、ライセンスされて各所へ渡り、改変されて子孫を残します。
AT&T UNIX(1969) → 二つの大きな枝:
枝A:バークレー系(BSD)
大学(UCバークレーCSRG)がAT&Tのソースライセンスを得て改変 → BSD(1978〜)→ 386BSD(1992) → NetBSD / FreeBSD(1993)、のちに OpenBSD。
枝B:AT&T商用系
System III → System V(1983) → 各社の商用UNIX(Solaris など)。
この木が「本当にコードを受け継いでいる」ことの、いちばん強い証拠は ── 裁判になったことです。1992年、AT&T(USL)が「BSDに我々のUNIXコードが入っている」とバークレーを提訴(USL v. BSDi)。1994年の和解で、BSDの18,000ファイル中、削除は3・修正は70だけと判明しました。逆に言えば、コードの出どころを1行単位で法廷が追えるほど、この木には実物のコードが流れているのです。
もう一本は、コードを1行も受け継がない木です。「UNIXのように振る舞うが、中身は白紙から書いた」もの ── Unix風(Unix-like)と呼ばれる一族。
MINIX(1987, Tanenbaum):教育用に、UNIX V7 と互換に振る舞うOSを白紙から記述。AT&Tのコードは入れない(授業で配れるように)。
GNU(1983, Stallman):“GNU's Not Unix”。UNIXのユーザーランド(gcc・bash など)を、自由に使えるよう白紙から作り直す。
Linux(1991, Torvalds):カーネルを白紙から記述。MINIX の上で開発し影響も受けたが、MINIX のコードは受け継いでいない。
「白紙から書く」は例外的な離れ業に聞こえますが、そうではありません。のちに Tanenbaum 自身が挙げたように、OSをゼロから書いた人は歴史上たくさんいます ── 自分(MINIX)、Thompson(UNIX)、Holt(Tunis)、Comer(Xinu)、Williams(Coherent)…。再実装は、UNIX文化の“ふつうの営み”なのです。
では二本を同じ絵に置いてみましょう。下の図は、横軸が年、上半分が血統の木(実線=コードが流れる)、下半分が再実装の木(点線=思想だけ)です。ボタンで木を切り替えて、Linux・MINIX が点線の側に、NetBSD・FreeBSD が実線の側にぶら下がっていることを確かめてください。
Linux は MINIX の点線の先にいます。つまり思想(Unixらしさ)は受け継いだが、コード(遺伝子)は受け継いでいない。第0回で見た「MINIX の上で開発した(産室を借りた)」ことと、「MINIX の子ではない(血縁は無い)」ことは、両立します。産室と血統は別の話だからです。
1992年1月29日、Tanenbaum が comp.os.minix に「LINUX is obsolete(Linuxは時代遅れ)」と投稿し、有名な論争が始まりました。ここで大事なのは ── これはコードの盗用をめぐる争いでは、まったくないということです。争点は設計思想でした。
Tanenbaum:カーネルは小さく分割すべき(マイクロカーネル)。Linux のようなモノリシック(全部入り)は「1970年代への逆戻り」。しかも386に密結合で、将来性がない。
Torvalds:モノリシックは実用上まっとうな設計判断だ。「linux は minix より(APIの意味で)ポータブルだ」。── のちに Linux は ARM・POWER・SPARC など多数へ移植され、Tanenbaum の「386は廃れる」予測は外れました。
つまり二人は「どう作るのが良い設計か」を議論していたのであって、「誰のコードか」を争っていたわけではありません。下の図で、論争の“本当の中身”=二つのカーネル設計を切り替えて見てください。
根は別々の二本の木ですが、てっぺん(こずえ)では葉をやりとりします。ここが面白いところ。
・GNU + Linux:再実装の木の二枚の葉(GNUのユーザーランド+Linuxのカーネル)が合体して、私たちが日常「Linux」と呼ぶOSになる(だから “GNU/Linux” とも)。
・MINIX 3 ← NetBSD:後年の MINIX 3 は、血統の木側の NetBSD のユーザーランドを取り込みました。第0回で触れた「矢印は逆・ずっと後」の正体がこれ。再実装の木が、血統の木から葉を借りたのです。
だから「二本の木」は、根では厳密に分かれているのに、こずえでは互いの葉を貸し借りする。この根は別・こずえで交わる像を持てば、UNIX一族の“ごちゃっとした森”がすっきり見えます。
二本の木は、話を整理するための模型です。現実はもっと連続的です。(1) 血統の木も“純血”ではない ── BSD は初期に AT&T コードを含み、裁判を経て徐々に除去して 4.4BSD-Lite で“実質フリー”になりました。血統は抜いたり足したりされます。(2) 「思想の継承」も程度問題で、POSIX のようにわざと互換をとる標準もあります(番外編で)。(3) Multics→UNIX を「思想」に入れましたが、これは影響であって、はっきりした継承関係ではありません。
要は、「コードが流れたか(遺伝子)」と「振る舞いが似ているか(思想)」を分けて問うという視点が本体で、木の形そのものは目安だと思ってください。
UNIX一族には二本の木がある。血統の木は実コードが流れる本流で、AT&T UNIX → BSD → NetBSD/FreeBSD、および → System V。コードの出どころは、USL v. BSDi 裁判が1行単位で追えたほど実在する。もう一本の再実装の木は、思想・APIだけを受け継ぎコードは白紙から書く ── MINIX・GNU・Linux。両者は直交し、「似て振る舞う」ことと「コードを継ぐ」ことは別問題だ。
だから「Linux は MINIX の子」は不正確 ── Linux は MINIX の点線(思想)の先にいて、遺伝子は継いでいない。1992年の論争も、二本の木で読めば設計(マイクロ vs モノリシック)の議論であって盗用の争いではなく、2004年の「コピー説」は、MINIX の作者本人にまで否定された。根は別々でも、GNU⊕Linux や MINIX 3←NetBSD のように、こずえでは葉を交換する。── 遺伝子か、思想か。この一問を分けて問うのが、系譜を読む鍵だ。
印刷 / PDF 化:⌘+P(Windows は Ctrl+P)。画面では図1のボタンで二本の木を切り替え、図2で論争の争点(カーネル設計)を切り替えられます。「答えを見る」で解答が開きます。