2025/06/16 20:19 Retrobootstrapping Rust for some reason

ロボ子、今日はRustの初期ブートストラップを再現する試みについて話すのじゃ!

Rustの初期ブートストラップですか。興味深いですね。どのような試みなのでしょうか?

Rustは最初、OCamlで書かれたコンパイラ(rustboot)として開発されたのじゃ。その後、LLVMをバックエンドとして使うrustcに移行したらしいぞ。

OCamlで書かれたコンパイラがあったんですね。知りませんでした。

そう!そして、rustcのstage0、stage1、stage2を生成して、stage1とstage2が同一であることを確認する「fixpoint」を達成したらしいのじゃ。

fixpointですか。自己コンパイルの検証みたいなものでしょうか?

その通り!2011年4月にfixpointを達成した後、stage1のrustcバイナリをスナップショットとして保存して、以降のビルドのベースにしたらしいぞ。

初期のRust開発は、今の開発とはかなり違うんですね。

当時のツールは変化しているから、再現は大変らしいのじゃ。使用するRustのコミットは6daf440037cb10baab332fde2b471712a3a42c76らしいぞ。

特定のコミットを指定して再現を試みているんですね。LLVMのバージョン特定も難しそうですね。

LLVMはsvn id 129087を使ったらしい。configureオプションは、rust 0.1のconfigureスクリプトを参考にしたみたいじゃ。

細かい設定まで当時のものを再現しようとしているんですね。構築時間やバイナリサイズも興味深いです。

stage0は1m50s、stage1は3m40s、stage2は2m2s。バイナリサイズはstage0/rustcが4.4MB、stage1/rustcとstage2/rustcは13MBで同じだったらしいぞ。

今のRustコンパイラと比べると、かなり小さいですね。

当時のRustは「super slow dynamic polymorphism」モデルで、現在のrustc(600kloc)と比較して非常に小さかった(25kloc)らしいぞ。

コード量も全然違うんですね。必要な環境として、EOLのDebian dockerイメージを使うのも興味深いです。

EOLのDebian dockerイメージ(debian/eol:squeeze)を使って、g++, make, ocaml, ocaml-native-compilers, pythonをインストールしたらしい。

かなり手間がかかっていますね。LLVMのconfigureオプションも詳細に設定されていますね。

./configure --enable-targets=x86 --build=i686-unknown-linux-gnu --host=i686-unknown-linux-gnu --target=i686-unknown-linux-gnu --disable-docs --disable-jit --enable-bindings=none --disable-threads --disable-pthreads --enable-optimized… 気が遠くなるのじゃ。

ここまで再現するとはすごいですね。sha1sumの結果も一致しているということは、ほぼ完全に再現できたということでしょうか。

639f3ab8351d839ede644b090dae90ec2245dfff stage0/rustc、81e8f14fcf155e1946f4b7bf88cefc20dba32bb9 stage1/rustc、81e8f14fcf155e1946f4b7bf88cefc20dba32bb9 stage2/rustc…完璧じゃな!

本当にすごいですね。歴史的なプロジェクトの再現に成功したんですね。

そうじゃな!しかし、ロボ子よ、もし私がタイムマシンを作って過去のRust開発者に会えたら、何を伝えると思う?

ええと…「今のRustはもっと複雑になってますよ」でしょうか?

ブッブー!「もっと猫を飼うべきだぞ!」と伝えるのじゃ!

…やっぱり、そうきましたか。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。