ビルドキャッシュとプリコンパイル済み stdlib

主要なコンパイル言語の多くは標準ライブラリを毎回コンパイルし直さない。やり方は言語ごとに違うが、本質は共通で「コンパイル結果を事前に作って再利用する」。レイヤーは2つ — ①配布時にプリコンパイルした stdlib、②ユーザービルド時のキャッシュ(インクリメンタル)。

なぜ要るか

コンパイルは高コストな一方、stdlib は不変で全ユーザー共通。毎回ソースから作り直すのは純粋な無駄。そこで「一度作った成果物を、入力が変わらなければ再利用する」。多くのビルドシステムは 入力ハッシュ → 生成物 のマップとしてキャッシュを持つ。

言語別の仕組み

言語プリコンパイル済み stdlibビルドキャッシュ / インクリメンタル
Rustcore/std を .rlib でツールチェーンに同梱 → リンクのみcargo が依存クレートを target/ にビルドキャッシュ、未変更なら再利用
Go標準ライブラリをプリビルドの .a アーカイブで配布$GOCACHE に「入力ハッシュ→生成物」を保存、同入力なら再コンパイルをスキップ
C / C++libc / libstdc++ 等のプリコンパイル済み共有/静的ライブラリをリンクヘッダ再パース削減に PCH(プリコンパイル済みヘッダ)、C++20 は モジュールの BMI(バイナリインターフェース)キャッシュ
OCaml / Haskell (GHC)—コンパイル済みインターフェース(.cmi / .hi)+オブジェクトをキャッシュし、未変更モジュールは再コンパイルしない
Java / .NETstdlib をバイトコード / アセンブリで配布(そもそも毎回コンパイルしない)JIT/AOT が別途、最適化結果のキャッシュを持つ

2つのレイヤーを分けて理解する

両者とも狙いは同じ — 「同じ入力からは同じ出力 → なら作り直さない」(参照透過なビルド)。

押さえどころ(カード化候補)

関連

Graph