コンパイラとランタイム (概略)


この章では、 C 言語を対象に、 C のソースコードがどのような過程を経てコンパイルされ、実行されるようになるか見ていきます。 利用する言語処理系は、gcc (GNU C Compiler 改め GNU Compiler Collections)です。

この回は、皆さんに情報に触れてもらうのが主旨ですから、 練習問題などはありません。 内容も、詳しい話は全部忘れてもらってもかまいません。

とはいえ、単にファイルを眺めるだけでなく、すこしは実際にコンパイラを動かして試したりして、 馴染んでおいてください。 内容的には、知っている人なら知っているといった話ですから。


C 言語が実行ファイルになるまでの基本的な流れは、授業の方でもならったように
C 言語ソースコード (with マクロ)
↓ マクロ展開
C 言語 (マクロ展開済)
↓ コンパイル
アセンブリコード
↓ アセンブル
オブジェクトコード
↓ リンク
実行コード
となっています。 例えば、gcc というコンパイラは、 マクロ展開からリンクに至る一連の操作をこなしてくれているわけです。 これらコンパイラは、プログラムが実行される以前の段階(一部ロード時)に機能しているわけです。

一方で、C 言語を形作るもう一つの部分として標準ライブラリ などの実行時(ランタイム)システムが存在します。 例えば、printfmalloc といった機能を実現している部分です。 文字通り、プログラム実行中に機能する部分です。

ということで、これらの部分がどのようになっているのか、すこし見ていきましょう。 準備に使うのは、お馴染の hello world です。 話の都合で、macro を多用しています。

#include <stdio.h>
#define MAIN_RVAL 0

int main() {
    printf("hello, world\n");
    return MAIN_RVAL;
}
普段は、以下のように使っているわけです。ちなみに、 コンパイラの各ステップがどのように動いているか知りたければ、 -v option をつけるとよいでしょう()。
kamada@cygwin% gcc -o hello hello.c
kamada@cygwin% ./hello.exe
hello, world

2001.9.25/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp