計算機の歴史を、鶏と卵でさかのぼる読み物シリーズ
Linuxカーネルは、Linux上の gcc / clang でコンパイルする。では最初のLinuxは、何がコンパイルしたのか? この鶏と卵を、C言語とUNIXの歴史をさかのぼって、初代UNIX、そして“最初の1バイト”まで降りていく。すべてのソフトは、自分より前のソフトが作った ── その連鎖の、いちばん下に何があるか。
合言葉:鶏が先か卵が先か ── 最初の卵は、手で彫った。
今のコンパイラは、過去の自分がコンパイルした(自己ホスティング)。ではループはいつ始まった? 最初のLinux(1991)は MINIX 上の gcc で生まれた。ここから階段を降りる全体像。gcc ← gcc ← gcc ← ?
「血統(コードの継承)」と「再実装(思想の継承)」は別の木。Linux は MINIX の子ではなく、産室を借りて育った。Tanenbaum–Torvalds 論争。遺伝子 ≠ 思想
v0.01 は MINIX がないとコンパイルできなかった。Torvalds は gcc と bash を MINIX に移植。v0.11 で初めて Linux が Linux をコンパイルし、自立する。v0.01 → v0.11(自立)
Cコンパイラは C で書かれている。最初はマシンの既存 cc で1回だけ持ち上げ、以後は自分で自分を作る。stage1→stage2→stage3 の3段ブートストラップ。stage2 == stage3 で検算
MINIX(1987) の純正コンパイラは Tanenbaum 製の ACK。EM という中間バイトコードを挟んで移植性を稼ぐ。後年 MINIX 3 は NetBSD 側へ寄っていく。前段 → EM → 後段
Ritchie は B から C へ、コンパイラを少しずつ C で書き直し、ついに C コンパイラが自分自身をコンパイルできる地点まで“育て”た。自己ホスティングの原点。B → NB → C
B は BCPL の子。BCPL は O-code、ACK は EM ── 「中間コード」を挟むと、機種が変わっても後段だけ書き直せばいい。移植とブートストラップの発明。BCPL → O-code → 機械
1969年、Thompson が PDP-7 のアセンブリで最初の Unix を書いた。C はまだ無い。カーネルもシェルもエディタも、機械語に近い言葉で。PDP-7 assembly
最初は別のマシン(GE-635/GECOS)のクロスアセンブラでアセンブルし、結果を紙テープに穴で刻み、物理的に PDP-7 へ運んだ。やがて自己ホスティングへ。別マシン → 紙テープ → PDP-7
アセンブラも無い最初の最初。人間が命令表を見て機械語の数値を手で作り(ハンドアセンブル)、トグルスイッチで1語ずつ入れる。それがブートストラップローダ。手 → スイッチ → メモリ
機械語を“意味”にするのは、論理ゲートで配線された命令デコーダ。それを設計したのも人間。ソフトの連鎖のいちばん下には、配線された物理がある。命令 → 論理ゲート → 物理
Thompson の1984年チューリング賞講演。ソースを消してもコンパイラのバイナリに潜んで生き延びるトロイ。「手で彫った種」を、そもそも信用できるのかという究極の問い。source ≠ trust
Trusting Trust への現代の答え。GNU Mes / stage0 は、信用しなければならない“最初の種”を数百バイトの人間可読なバイナリまで小さくする試み。①と握手。seed → 全ツールチェーン
新しいCPUには、まだ何も動いていない(鶏がいない)。別のマシンでそのCPU向けの卵を焼くのがクロスコンパイル。第8回の紙テープ運搬の、現代版。host ≠ target
コードの血統をめぐる法廷闘争(AT&T vs BSD)と、System V、そして「Unixらしさ」を仕様で固定した POSIX。第1回「二本の木」の深掘り。遺伝子の所有権
Stallman が gcc・bash を書いた動機。ツールチェーンが自由でないと、種を自分で撒けない。Linux が gcc で立ち上がれたのは、この再実装があったから。free toolchain
系譜の最上流。巨大で野心的だった Multics から降りた Thompson と Ritchie が、小さく簡潔な Unix を作った。「小さいことは正しい」という設計思想の源流。大 → 小