トラック1・📜プログラムとは何か

ソースコードから機械語へ——コンパイルの旅

読む目安 約12分・ゴール:ソースコード・コンパイラ・機械語の関係と、コンパイルという工程の役割を説明できる

アプリでこのトピックを学ぶ(無料・登録不要)

このトピックの要点

私たちが書くプログラムは、英単語と記号でできた文章です。ところが機械が理解できるのは0と1の並びだけ。この2つの間には、翻訳者が必要です。

人間が読み書きするために文字で書かれたプログラムをソースコードと呼びます。例えばC言語ではこう書きます。

#include <stdio.h>

int main(void) {
    printf("こんにちは\n");
    return 0;
}

これを実行するには、CPUが直接読める形——機械語に翻訳しなければなりません。機械語は 10110000 01100001 のような数値の列で、人間が読むようには作られていません。この翻訳をしてくれる道具がコンパイラ、翻訳という作業そのものがコンパイルです。

翻訳は1回、実行は何度でも

コンパイルすると、機械語が詰まった「実行ファイル」ができあがります。以後はそのファイルを起動するだけで、翻訳をやり直す必要はありません。だからC言語のプログラムは動作が速く、ソースコードを渡さずに配布できます。

世の中には別のやり方もあります。Pythonなどは、実行のたびに1行ずつその場で翻訳しながら進みます(同時通訳型)。手軽ですが、毎回通訳の手間がかかる分だけ遅くなります。C言語は「先に全部訳しておく」方式だ、と覚えてください。

ビット翻訳ずみの台本を読むか、通訳さんを連れて歩くか。Cは前者だよ。

もう一つ、翻訳ならではの制約があります。翻訳先は機械の種類ごとに違うという点です。WindowsのパソコンとスマートフォンではCPUの言葉が違うので、同じソースコードから作った実行ファイルでも、そのままでは動きません。動かしたい相手ごとに翻訳し直す必要があります。逆に言えば、ソースコードさえあればどの機械向けにも作り直せるということでもあります。Cのプログラムが半世紀にわたって生き延びてきた理由の一つが、ここにあります。

旅は4つの駅を通る

コンパイルは、実は4つの工程をまとめた呼び名です。名前だけ先に見ておきましょう。

  1. 前処理 — #include などの下ごしらえをする
  2. コンパイル(狭い意味) — アセンブリという機械語に近い言葉へ訳す
  3. アセンブル — アセンブリを機械語(0と1)に変換する
  4. リンク — printf などの部品と結合して、実行ファイルを完成させる

今すぐ覚える必要はありません。第3部で自分の手で確認します。ここでは「1つのボタンに見えて、中では4人がバケツリレーをしている」というイメージだけ持っておけば十分です。

エラーは翻訳者からの質問状

書き方が間違っていると、コンパイラは翻訳をやめてエラーメッセージを出します。初心者はここでへこみますが、見方を変えてください。実行する前に間違いを見つけてもらえたということです。動かしてから壊れるより、はるかに親切な世界です。エラーの読み方は第3トラックで扱います。

アプリでこのトピックを学ぶ(無料・登録不要)

確認問題

確認問題 1

人間が書いたソースコードを、CPUが実行できる機械語に翻訳する道具を何と呼ぶでしょう。

  1. エディタ
  2. ブラウザ
  3. デバッガ
  4. コンパイラ
答えを見る

正解:D(コンパイラ)

翻訳してくれる道具がコンパイラ、その翻訳作業がコンパイルです。エディタは文字を書くための道具、ブラウザはWebページを見る道具、デバッガはバグを調べる道具で、どれも翻訳はしません。

確認問題 2

人間が読み書きする文字のプログラムを ____ と呼びます。これをコンパイラが翻訳すると、CPUが直接読める機械語(実行ファイル)ができあがります。

  1. ソースコード
  2. 機械語
  3. アセンブラ
  4. 実行ファイル
答えを見る

正解:A(ソースコード)

文字で書かれた、人間が読み書きするためのプログラムがソースコードです。機械語は翻訳された結果、実行ファイルは機械語が詰まったファイル、アセンブラはアセンブリ言語を機械語に変換する道具の名前で、いずれも「人間が書く元の文章」ではありません。

「プログラムとは何か」の目次

  1. コンピュータは何をする機械か
  2. プログラムとは「手順書」である
  3. ソースコードから機械語へ——コンパイルの旅
  4. CPUとメモリの模式図
  5. 命令実行サイクル(Fetch-Decode-Execute)
  6. プログラミング言語の地図とCの位置
  7. なぜ最初にC言語なのか
  8. 0と1ですべてを表す——2進数の入口

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版の販売ページは準備中です。

ほかのトラック

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版