なんとな~くしあわせ?の日記

JavaとかAWSの設定とかをメモする技術ブログ

コンパイラ自身をどうコンパイルするかという問題

スラッシュドット・ジャパンでこんな記事が紹介されていた
GCC、CからC++への移行が完了 | スラッシュドット・ジャパン デベロッパー

これからのgccC++コンパイラーのみでビルド可能となる、らしい。

というか今までさして疑問にも思わずgccのバイナリをどっかから落としてきてコンパイルに使っていたわけだが、まったくコンパイラがない状態でどのようにコンパイラをコンパイルすればよいのだろうか?(わかりにくい文章)

この、「コンパイラ自体をどうコンパイルすればよいか」という問題はブートストラップ問題 - Wikipediaとして知られているようだ。

ブートストラップ問題を解決する手段は以下、引用


gccに関しては以前のバージョンのgccが存在しているので、それを使って新しいバージョンのgccを書いてコンパイルすればOKなわけだ。昔みたいにOSとコンパイラがたくさんあった場合、別のコンパイラコンパイラのソースをコンパイルして配布すればよかった。(昔はコンパイラgcc, bcc, msvc, llvmだけじゃなかった。最近知ったのだけでもLSI C-86, WATCOM C/C++, emx+gcc, IBM VAC++とかある)
しかしそもそも、K&RC言語を開発した当初はどうやってコードを機械語に変換してたんだろう。

StackOverflow様に聞いてみたらこんな感じ
c++ - How are gcc/g++ bootstrapped? - Stack Overflow

The oldest version of GCC was compiled using another C compiler, since there were others when it was written. The very first C compiler ever (ca. 1973, IIRC) was implemented in PDP-11 assembly.
「最も古いGCCは、新しいバージョンのGCCが作られるまで他のCコンパイラを使ってコンパイルされていた。最初期のCコンパイラ(自分の記憶が正しければ1973年ごろ)はPDP-11のアセンブラ言語で実装されている。」

When you compile GCC or any other self-hosting compiler, the full order of building is:

1. Build new version of GCC with existing C compiler
2. re-build new version of GCC with the one you just built
3. (optional) repeat step 2 for verification purposes.
「もしあなたがGCCや他の独自のコンパイラをコンパイルする場合、ビルドのすべての手順は以下となる:

1. 新しいバージョンのGCCを既存のCコンパイラでビルドする
2. 新しいバージョンのGCCをそれ自身で再ビルドする
3.(任意)手順2を確認目的で繰り返す」

This process is called bootstrapping. It tests the compiler's capability of compiling itself and makes sure that the resulting compiler is built with all the optimizations that it itself implements.
「この過程はブートストラップと呼ばれている。それはコンパイラが自身をコンパイルできる性能があるかどうか試験する。そしてその成果物としてのコンパイラが、それ自身の実装において全て最適化されてビルドされているか確かめる。」 

EDIT: Drew Dormann, in the comments, points to Bjarne Stroustrup's account of the earliest implementation of C++. It was implemented in C++ but translated by Stroustrup calls a "preprocessor" from C++ to C; not a full compiler by his definition, but still C++ was bootstrapped in C.
「追記:Drew Dormann氏がコメント欄でビャーネ・ストラウストラップの初期のC++実装に関する記述について指摘している。それ(C++コンパイラ)は確かにC++で実装されたが、ストラウストラップが言うところのC++のコードをCに変換する"プリプロセッサ"というべきもので、彼が定義するところの本当のコンパイラではなかった。それ故に未だにC++はCによってブートストラップされていると言えるのだ。」


感想
・世界中のすべてのコンパイラのソースとバイナリが無くなったら、まず我々はアセンブラでCコンパイラを作るとこから始めるわけですか…まあそんなことはありえないから、性能やメンテナンス性で優れるC++に移行しようという認識であってるのかな