記事には広告を含む場合があります。

C言語入門講座

【C/C++】プログラム生成の流れを解説!コンパイルの仕組みとは?

おゆ

組み込み系プログラマとして5年働いていた元エンジニアです。得意言語はC言語とC++。本サイトでは学生および新人組み込み系プログラマに向けてプログラミング知識をわかりやすく解説しています。

プログラムを作るにはソースコードを書いた後、ビルド(コンパイルと呼ぶこともある)しますよね。

ビルドするとソースファイルを元にして実行ファイルが得られます。

でも具体的に何をしているのか知らない方も多いのではないでしょうか。

この記事ではビルドとは何かと、ビルド中に行われている3つの処理について解説します。

ビルドとはソースコードから実行ファイルを作ること

簡単に言うとビルドとは私たちが書いたコードを機械が理解できる言語に翻訳して1つの実行ファイルにまとめることを指します。
プログラム生成の流れ

ソースコードはC言語など人間が理解できる言語で書かれていますが、そのままではコンピュータには理解できません。

そこでビルドをしてコンピュータが理解できる言語で書かれた実行ファイルを作るのです。

ビルドは以下の3つの処理からなります。

  • プリプロセス
  • コンパイル
  • リンク

ビルドのメインの処理はコンパイルなので、ビルドをコンパイルと呼ぶこともあります。

以下ではビルドの3つの処理について解説します。

プリプロセスとはコンパイル前の事前準備

プリプロセスとはその名の通りコンパイルの前に行う処理のことです。

プリプロセスを行うツールをプリプロセッサと呼びます。

プリプロセッサはコンパイラ(コンパイルを行うソフトウェア)の中に組み込まれています。

実はプログラムの先頭に書く「#include <stdio.h>」はプリプロセッサが実行する命令(プリプロセッサ命令)です。

他にもプリプロセスでは以下の処理が行われます。

プリプロセスで行う処理

  • インクルード命令(#include)
  • マクロ(#define、#ifdefなど)
  • コメントの削除
参考【C/C++】define(マクロ)による置き換え方法・関数との違いを解説

マクロには数字・文字列・式などを簡単な文字列に置き換えたり、関数の外に条件分岐を書けたりといった機能があります。 特に大きなプログラムを作る際にはよく使われます。 define(マクロ)とは何かわかり ...

続きを見る

ヘッダファイルの内容はインクルードされた位置にそのまま書き写されます。

おゆ
ヘッダファイルの中身をそのままソースファイルにコピペします。

マクロもプリプロセスで実行されます。

コメントはプログラムを作る上で必要ないので、プリプロセッサによって削除されます。

コンパイルとはソースコードを機械語に翻訳する処理

私たちが作成したソースファイル(拡張子.c、.cpp)やヘッダファイル(拡張子.h)はプリプロセッサによって前処理された後、コンパイルされます。

コンパイルを行ってくれるソフトウェアをコンパラといいます。

コンパイルで行う処理

  • ソースコードの文法チェック
  • ソースコードをコンピュータが理解できるように翻訳
  • オブジェクトファイルの作成

まずソースコードがC言語やC++の文法的に正しく書かれているか隅々までチェックします。

誤りがある場合はエラー(error)やワーニング(warning)を出し、どこがどう間違っているのか指摘してくれます。

おゆ
ワーニングを放置してもコンパイルは通りますが、将来的に不具合に繋がる可能性が高いです。ワーニングもエラー同様、ゼロを目指しましょう。

文法チェックが終わったらソースコードの翻訳を行います。

ソースコードは人間が理解できる言語で書かれていますが、コンピュータが理解できません。

そこでコンピュータが理解できるように翻訳する必要があるのです。

こうして翻訳されたソースコードはオブジェクトファイル(拡張子.o)に保存されます。

おゆ
普段はオブジェクトファイルの存在を意識することはあまりないかもしれませんが、ビルド時に毎回生成されています。

1つのソースファイルに対して対応するオブジェクトファイルが1つ作成されます。

コンパイラはコンピュータの種類によって異なります。例えばWindowsとMacでは異なるコンパイラを使います。これはコンピュータによって使う言語が異なるためです。お使いのコンピュータに合ったコンパイラを使いましょう。

リンクとは複数のオブジェクトファイルを1つにまとめる処理

最後にリンクを行うことでコンパイルで作成したオブジェクトファイルを統合し、1つの実行ファイル(拡張子.exe)を作ります。

リンクを行ってくれるソフトウェアのことをリンカといいます。

リンクで行う処理

  • オブジェクトファイルの統合

関数の呼び出し部分と定義部分はリンク時に関連付けられます。

また、変数や関数などをメモリ上でどのように配置するかも決めています。

リンクがうまくいかないときはエラーやワーニングが出ます。

ここまで終わってようやく実行ファイルができあがります。

C言語で行き詰まったら…

C言語・C++がわからない時に質問できるサイト・サービス5選

C言語を独学で勉強しているけど内容がイマイチわからない。もはや何がわからないのかもわからない。 C++のエラーが解決できない。ググってもわからない。わかる人に解説してほしい。 こんなお悩みにお答えしま ...

続きを見る

ブログランキング参加中。クリックしてもらえると励みになります。

ブログランキング・にほんブログ村へ

-C言語入門講座