本物のC

C の基本:プログラムの作成


コンパイル

C の前に:OSとプログラム」で説明した様に、C 言語のソースコードはコンパイルによって CPU が理解できる機械語へと変換されます。

ソースコード
#include <stdio.h> int main(void) { ...
機械語
4C 01 06 00 00 00 00 00 0E 02 00 00 13 00 00 00
00 00 04 01 2E 74 65 78 74 00 00 00 00 00 00 00
00 00 00 00 4C 00 00 00 04 01 00 00 DC 01 00 00
00 00 00 00 03 00 00 00 20 00 30 60 2E 64 61 74
...
コンパイル

これを CPU に読ませれば作ったプログラムを実行できる訳ですが、CPU などの支配権はカーネルが握っているので、その処理はカーネルにお願いする必要があります。

つまり変換された機械語に加え、それを実行する為のカーネル向けの情報(メモリ上にどう配置するか、どこから実行するか等)を纏めたものこそがコンパイラの出力する実行可能ファイル(executable file)です。

実践

次のコードは「hello, world」と表示するだけの簡単なものです。

#include <stdio.h>
int main(void)
{
printf("hello, world\n"); /* 文字の表示 */
return 0;
}

/**/で囲まれた部分はコメント(comment)と言い、コンパイラからは無視されます。//に続けてコメントを書く事もできますが、

printf("hello, world\n"); // 文字の表示

これは正式には C99 からの機能です。(昔からあった書き方らしく C99 以前のコンパイラでも使えますが。)

コメントは罪深くも分かり難いコードを書いてしまった時に書くもので(「礼儀作法:可読性」を参照)、また普通は日本語で書くなんて事もありません。このサイトで日本語のコメントがあったらそれはコードの一部としてではなく、読者への捕捉として書いていると思って下さい。実際のコードに初心者向けの事を書いてもウザがられるだけです。

さて上のコードを hello.c などの名前で保存し、これをコンパイラに渡します。

$ gcc hello.c

gccの場合、何も問題が無ければ無言で終わります。これでソースコードに対してコンパイルが行われ、実行可能ファイルが出力されます。

デフォルトでの出力ファイルは UNIX 系の場合「a.out」、Windows の場合「a.exe」になります。(これは gcc や clang の場合で、msvc では入力ファイル名を受け継ぎます。Windows 版の clang もclang-clとしてフロントエンドを msvc に合わせているので、同じ動作になります。)

$ a.outまたは> a.eveとして実行すれば

hello, world

と表示されるでしょう。