c言語のソースコードが実行可能になるまでの流れ

プリプロセス

概要

コンパイル処理において、プリプロセッサ (preprocessor) とは、コンパイラソースコードコンパイルする前に、一旦ソースコードに前処理を施すためのプログラムである。プリプロセッサによって実行される命令は「プリプロセッサ指令」(プリプロセッサディレクティブ)などと呼ばれ、処理自体は「プリプロセス」(preprocess) と呼ばれる。

プリプロセッサは、その名の通り、コンパイラによるソースコードの字句解析や、構文解析、バイナリコード生成などよりも前に実行される。プリプロセッサでは、主に次のような処理が行われる。

ソースコード中にヘッダやソースファイルを取り込む
ソースコード中に書かれたマクロを置き換える
コンパイル対象となるソースとそうでない部分を指定する
処理系ごとの動作を指定する

プリプロセッサとは、ソースコード自身やコンパイルの過程に対して、ソースコードの中から指示を与えるためのものと言える。

ヘッダ取り込み

標準ライブラリの機能を使うとき、プログラムの先頭で「#include 」のように書く。これはプリプロセッサの機能で、ヘッダを取り込むためのものである。

プログラムの規模が大きくなると、その一部の機能をある程度の単位でまとめるのがプログラミングの定石である。Cでは、機能を提供する側がその仕様(関数のプロトタイプ宣言やマクロによる定数定義など)をヘッダとしてまとめ、機能を使う側がそれを取り込んで(インクルードして)使用する。

標準ライブラリで提供されているヘッダを使用する場合は「#include 」と書き、自作プログラムのヘッダを使用する場合は「#include "header.h"」と書く。

マクロ置き換え

マクロ置き換えの機能を使うと、プログラム中で定義したマクロを、プリプロセッサで置き換えることができる。C言語におけるマクロとは、プログラム中の文字列をあらかじめ定義した規則にしたがって置換する機能のことを指す。マクロは、#defineというプリプロセッサ指令により定義する。マクロの有効範囲は、1つのコンパイル単位となる。1つのコンパイル単位とは、#include でインクルードしたファイルが展開された後の1つのファイルである。

コンパイル

概要

C言語で書かれたソースプログラムは、計算機は直接には解釈・実行できないので計算機が実行できる形式(機械語、または実行可能形式とかバイナリプログラムと呼ばれる)に変換したものを作成する作業を行う。この変換を行ってくれるソフトウェアをコンパイラと呼び、コマンドとしてUNIX標準ではccが用意されている。コンパイルされた結果、アセンブリ言語で書かれたプログラムとなる。

アセンブリ言語とは、0と1で構成される機械語を、人間に理解できるように英数字で表現した言語のこと。原則として機械語の1つの命令に付き、1つの文字列(ニーモニック)が割り当てられているため、それらを利用することでプログラミングする。C言語などの高級言語に対して低級言語と呼ばれ、ソースコードは記述しにくいが、サイズが小さく、実行ファイルの実行速度も速い。


アセンブル

概要

アセンブリ言語で書かれたプログラムは、アセンブラ(assembler)によって 機械語(マシンコード)で表現されたプログラムに変換される。 このプログラムのことを、オブジェクトプログラム(object program)という。

リンク

概要

(複数の)オブジェクトプログラムは、リンケージエディタ(linkage editor)に よって連結編集され、1つの実行可能なプログラムにまとめられる。 最終的に出来上がったプログラムのことを、実行形式(executable)という。 連結編集のことはリンク(link)ともいい、リンケージエディタのことを リンカ(linker)ということもある。



参考
プリプロセッサでプログラムの質を向上させよう (1/4):目指せ! Cプログラマ(16) - @IT
ハローワールド徹底解説 - Qiita