のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

コンパイラの基本的な実行の流れ

Sponsored Links

皆さんこんにちは
お元気ですか?私はげんきです。

さて、今日はコンパイラの一連の流れについてご紹介します。

コンパイラは4つの段階に処理が別れており、これらが終了すると実行プログラムを生成します
前処理→コンパイル→アゼンブル→リンクの順番です。

コンパイルの処理について

前処理

コメントの除去やプリプロセッサの置換+includeのファイルを含むような作業を行う。

前処理の前

#include<iostream>
#define 100

using namespace std;
int main(void){
   //足す
  cout << 100 + define << endl;
}

前処理の後

[iostream]のファイル

using namespace std;
int main(void){
  cout << 100 + 100 << endl;
}

因みに以下のコマンドを打つと実際に動作するコードを確認することができます。

g++ -E temp.cpp

コンパイル

アゼンブリ言語で表現されているアゼンブラプログラムを生成する。
Cppで記載されている内容→アゼンブラプログラムを生成

以下のコマンドでアゼンブラのコードを確認することができます。

g++ -S temp.cpp

アゼンブル

アゼンブラプログラムを読み込んで、オブジェクトファイル(機械語で表現されたファイル)を生成する。
アゼンブラプログラム→オブジェクトファイル

g++ -c temp.cpp

リンク

オブジェクトファイル同士を結合させて実行ファイルを生成する。
実体のないオブジェクトファイルを生成した場合、ここでリンクさせることによって別のオブジェクトファイルから実体を呼び出し、実行ファイルを生成します。

コマンドは以下のようなイメージで

gcc test.o -o test

つまり、オブジェクト+オブジェクト+オブジェクト+オブジェクト=実行ファイル
のようなことを行っています。

このように4つの処理を得て、プログラムはコンパイルされますが…
実際の使い方は次のお話