私たちが書くプログラムは、英単語と記号でできた文章です。ところが機械が理解できるのは0と1の並びだけ。この2つの間には、翻訳者が必要です。
人間が読み書きするために文字で書かれたプログラムをソースコードと呼びます。例えばC言語ではこう書きます。
#include <stdio.h>
int main(void) {
printf("こんにちは\n");
return 0;
}これを実行するには、CPUが直接読める形——機械語に翻訳しなければなりません。機械語は 10110000 01100001 のような数値の列で、人間が読むようには作られていません。この翻訳をしてくれる道具がコンパイラ、翻訳という作業そのものがコンパイルです。
翻訳は1回、実行は何度でも
コンパイルすると、機械語が詰まった「実行ファイル」ができあがります。以後はそのファイルを起動するだけで、翻訳をやり直す必要はありません。だからC言語のプログラムは動作が速く、ソースコードを渡さずに配布できます。
世の中には別のやり方もあります。Pythonなどは、実行のたびに1行ずつその場で翻訳しながら進みます(同時通訳型)。手軽ですが、毎回通訳の手間がかかる分だけ遅くなります。C言語は「先に全部訳しておく」方式だ、と覚えてください。
もう一つ、翻訳ならではの制約があります。翻訳先は機械の種類ごとに違うという点です。WindowsのパソコンとスマートフォンではCPUの言葉が違うので、同じソースコードから作った実行ファイルでも、そのままでは動きません。動かしたい相手ごとに翻訳し直す必要があります。逆に言えば、ソースコードさえあればどの機械向けにも作り直せるということでもあります。Cのプログラムが半世紀にわたって生き延びてきた理由の一つが、ここにあります。
旅は4つの駅を通る
コンパイルは、実は4つの工程をまとめた呼び名です。名前だけ先に見ておきましょう。
- 前処理 —
#includeなどの下ごしらえをする - コンパイル(狭い意味) — アセンブリという機械語に近い言葉へ訳す
- アセンブル — アセンブリを機械語(0と1)に変換する
- リンク —
printfなどの部品と結合して、実行ファイルを完成させる
今すぐ覚える必要はありません。第3部で自分の手で確認します。ここでは「1つのボタンに見えて、中では4人がバケツリレーをしている」というイメージだけ持っておけば十分です。
エラーは翻訳者からの質問状
書き方が間違っていると、コンパイラは翻訳をやめてエラーメッセージを出します。初心者はここでへこみますが、見方を変えてください。実行する前に間違いを見つけてもらえたということです。動かしてから壊れるより、はるかに親切な世界です。エラーの読み方は第3トラックで扱います。