第8回「紙テープで運ぶ」の、いまの姿 ── 鶏なしで、卵を作る
第8回で、生まれる前の PDP-7 は自分ではプログラムを作れず、GE-635 で作って紙テープで運んだ、と見ました。「よそで作って運ぶ」── この技は、今も現役どころか、あらゆる新機種の立ち上げの土台です。新しい CPU、スマホ、組込みマイコン ── どれも最初は「鶏がいない」状態から、手元の別の機械(PC)で、その機種向けの卵を焼くことで立ち上がります。これがクロスコンパイル。鶏と卵を、機械をずらして解く技です。
クロスを正確に語るには、三つの役割を分けます(GNU の用語)。
build:コンパイラ自体をビルドする機械。
host:そのコンパイラが動く機械。
target:そのコンパイラが吐くコードが動く機械(クロスコンパイラを作るときだけ問題になる)。
この三つがどう一致・相違するかで、名前が変わります。下の図で切り替えてください。
新しい CPU を作ったとき、その target にはまだ何も動いていません。OS も、コンパイラも、アセンブラも無い。第8回の生まれる前の PDP-7 と同じ ── native(target 上で target 向けを作る)は、そもそも不可能。だから、すでに動く build 機(手元の PC)で、target 向けのコンパイラや OS を焼く。x86 の PC で ARM や RISC-V 向けを、あるいは OS すら載らない組込みマイコン向けを ── みなこの方式です。
もう一段ひねると、build・host・target が三つとも違うこともあります。これを Canadian Cross と呼びます。たとえば ── 速い Linux 機(build)で、Windows 上で動き(host)、ARM 向けコードを吐く(target)コンパイラを作る。ユーザは Windows で使い、成果物は ARM で走る、という具合。
クロスの本質は、第8回とまったく同じ ── 「target で target を作らなくていい。すでに動く build 機を借りればいい」。鶏がいない新機種でも、よその鶏から卵を得る。これは第3回「既存 cc を借りて着火」、第6回「O-code を運ぶ」、第8回「紙テープで運ぶ」と一本の同じ骨格。役割(build/host/target)をずらすことで、この機械の中では解けない鶏と卵を、別の(既に動く)機械へ移して解くのです。
クロスは立ち上げの手段であって、ゴールではありません。build 機で焼いたツールチェーンと OS を target に載せて起動できたら、やがて target 自身が、target 向けをビルドできるようになる ── native な自己ホスティング。これは第2回の Linux v0.11(MINIX という産室を出て自立)や、第8回の PDP-7(GECOS を卒業)と、まったく同じ筋書きです。下の図で、新アーキが「鶏なし」から「自立」まで立ち上がる流れを追ってください。
(1) クロスは鶏と卵を解決しません。第8回と同じく、この機械の中で解くのをやめ別の(既に動く)機械へ移すだけ。連鎖は有限で、さかのぼれば最初の機械(第9・10回)に底を打ちます。(2) 実務のクロスは地味に大変です ── target 用のヘッダやライブラリ(sysroot)を揃える、libc をどう用意するか、実機が無ければ QEMU などのエミュレータでテストする、など。
(3) build/host/target は GNU の用語で、他の文脈(例:Rust など)では呼び方や区分が少し違うことがあります。(4) 「Canadian Cross」の由来は広く語られる逸話で、細部には諸説あります。要点は「三つの機械が全部違いうる」という構造です。
第8回「よそで作って運ぶ」の現代版がクロスコンパイル。三つの役割 ── build(ビルドする機械)・host(コンパイラが動く機械)・target(吐くコードが動く機械)── の一致/相違で、native(全部同じ)・cross(target だけ違う)・Canadian Cross(三つとも違う)が決まる。新しい CPU は最初 target に何も無い(鶏なし)ので native は不可能。だから既に動く build 機で、target 向けを焼く。
急所は第8回と同一 ── 「target で target を作らなくていい、動く build 機を借りればいい」。第3回(既存 cc)・第6回(O-code 運搬)・第8回(紙テープ)と一本の骨格で、鶏と卵を役割をずらして別の機械へ移して解く。そして立ち上げた target は、やがて native な自己ホスティングへ ── 第2回 Linux v0.11、第8回 PDP-7 の GECOS 卒業と同じ筋書き。クロスは鶏と卵を消しはしないが、有限の連鎖で、いつも「既に動く機械」から新機種を産み落とす技だった。
印刷 / PDF 化:⌘+P(Windows は Ctrl+P)。画面では図1のボタンで native / cross / Canadian Cross を切り替え、図2のスライダーで新アーキの立ち上げを追えます。「答えを見る」で解答が開きます。