コンパイラをコンパイルする際の不思議

12月 23, 2017

コンパイラとは、テキストで書かれたソースファイルを解析し、実行できるバイナリコードに変換してくれるソフトです。ある意味、このソフトが、全てのプログラムを生み出す源と言っても良い。

Linuxだろうが、Windowsだろうが、MacOSだろうが、iOSだろうが、これは揺るがない事実です。全てのプログラムはコンパイラから産み出される。OSすらコンパイラでビルドされるのです。

さて、じゃあコンパイラって何だ?

このコンパイラもソフトウェアです。テキストを読み込んで、バイナリに変換する、コードジェネレーターソフトと言いかえればいい。

このコンパイラのアップデートってどうするんだ?

簡単です。コンパイラのソースを、コンパイルするんです。拍子抜けする程単純な事実。さて、ここで面白い事がわかります。

  • 新しいコンパイラは、古いコンパイラでコンパイルする
  • 出来たコンパイラは新しいコンパイラ

つまり、新しいコンパイラは、古いコンパイラで作られたバイナリなわけです。

新しいコンパイラでコンパイルしたほうが、より質のいいバイナリが出来るのでは?

そうなんです。さて、gccのビルドは、どのように進むかというと…

  1. まず古いコンパイラで、C/C++のミニマムコンパイラ(xgcc)を生成する
  2. 出来たミニマムコンパイラ(xgcc)で、再度全ソースをフルビルドする

これで、ビルドが完了します。つまり

GCCは、GCC自身の最新版が、最高である

と自負しているとも言えます。

さて、同じくコンパイラの派生として、LLVMというソフトもあります。こちらは、GCCと置き換わるものとして、BSD等を中心にデフォルトコンパイラの地位を狙っています。このLLVMのC言語フロントエンドが、clangというソフト。このLLVM+clangは、何でコンパイルされるかというと

GCCでコンパイルされる

そのあと、同じコンパイラをclangでコンパイルすればいいんじゃん?って思うけどそれはしないんだよね。これって

LLVMは、実は自分とこの生成バイナリを信用していない

ってことではないんだろうか…この辺、考え方に違いがあり、とても興味深い。

また…最新コンパイラをコンパイルするためには、前のバージョンのコンパイラが必要であるということは…その前バージョンは更にその前バージョンが必要で…と遡っていくと。もしも何らかの要因で、過去のコンパイラが全て消去され、最新版のソースだけが残ったとしても。

最新コンパイラをビルドすることは不可能

実は、16進コードでマシン語でコードした、アセンブラを作り、アセンブラでコンパイラを作り…最終的に最新バージョンのソースをビルド可能なコンパイラを作らないとビルドできないという、気が遠くなるほどの過去の遺産の上に構築された、壮大なシステムであるということに気付かされるのです。
今最新のソフトとはいえ、過去の成果がなければ今がないということを、改めて考えさせられる作業でもあったりします。

まぁ、こんな事を考えてGCCビルドする奴なんてほとんど居るまいが(笑)

posted in Gentoo Linux, コンピュータ by maruo

Follow comments via the RSS Feed | Leave a comment | Trackback URL

Leave Your Comment

 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org
ページ内検索

ログイン

ユーザー名:


パスワード:





パスワード紛失

メインメニュー

サブメニュー
自宅鯖計画

Gentoo Linuxな生活

玄箱HGにGentoo格闘記

航空ショーへ行こう

モータースポーツな世界

奥深き写真の世界への誘い

我思う ゆえに我あり



携帯用QRコード