コンピレーションとは何ですか?
コンパイルは、ソースコードをオブジェクトコードに変換するプロセスです。これはコンパイラの助けを借りて行われます。コンパイラはソース コードに構文的または構造的なエラーがないかチェックし、ソース コードにエラーがない場合は、オブジェクト コードを生成します。
C コンパイル プロセスは、入力として受け取ったソース コードをオブジェクト コードまたはマシン コードに変換します。コンパイルのプロセスは、前処理、コンパイル、アセンブル、リンクの 4 つのステップに分けることができます。
プリプロセッサはソース コードを入力として受け取り、ソース コードからすべてのコメントを削除します。プリプロセッサはプリプロセッサ ディレクティブを受け取り、それを解釈します。たとえば、次の場合 、 ディレクティブがプログラム内で使用可能な場合、プリプロセッサはディレクティブを解釈し、このディレクティブを 'stdio.h' ファイル。
プログラムが実行可能形式に変換される前に通過するフェーズは次のとおりです。
プリプロセッサ
ソースコードはテキストエディタで書かれたコードであり、ソースコードファイルには拡張子「.c」が付けられます。このソース コードはまずプリプロセッサに渡され、次にプリプロセッサがこのコードを展開します。コードを展開した後、展開されたコードはコンパイラに渡されます。
コンパイラ
プリプロセッサによって展開されたコードはコンパイラに渡されます。コンパイラはこのコードをアセンブリ コードに変換します。あるいは、C コンパイラが前処理されたコードをアセンブリ コードに変換するとも言えます。
アセンブラ
アセンブリコードは、アセンブラを使用してオブジェクトコードに変換されます。アセンブラが生成するオブジェクトファイルの名前はソースファイルと同じになります。オブジェクトファイルの拡張子は、DOS では「.obj」、UNIX では「o」です。ソースファイルの名前が 'こんにちはC'、 この場合、オブジェクト ファイルの名前は「hello.obj」になります。
リンカ
主に、C で書かれたすべてのプログラムはライブラリ関数を使用します。これらのライブラリ関数は事前にコンパイルされており、これらのライブラリ ファイルのオブジェクト コードは「.lib」(または「.a」)拡張子を付けて保存されます。リンカーの主な働きは、ライブラリ ファイルのオブジェクト コードをプログラムのオブジェクト コードと結合することです。プログラムが他のファイルで定義された関数を参照する場合に状況が発生することがあります。この場合、リンカーは非常に重要な役割を果たします。これらのファイルのオブジェクト コードをプログラムにリンクします。したがって、リンカの仕事は、プログラムのオブジェクト コードをライブラリ ファイルや他のファイルのオブジェクト コードにリンクすることであると結論付けられます。リンカーの出力は実行可能ファイルです。実行可能ファイルの名前はソース ファイルと同じですが、拡張子のみが異なります。 DOS では、実行可能ファイルの拡張子は「.exe」ですが、UNIX では、実行可能ファイルの名前は「a.out」となります。たとえば、プログラムで printf() 関数を使用している場合、リンカーは関連するコードを出力ファイルに追加します。
例を通して理解しましょう。
こんにちはC
#include int main() { printf('Hello javaTpoint'); return 0; }
ここで、上記のプログラムのフロー図を作成します。
上記のフロー図では、プログラムを実行するために次の手順が実行されます。
- まず、入力ファイル、つまり、 こんにちはC、 はプリプロセッサに渡され、プリプロセッサはソース コードを展開されたソース コードに変換します。展開されたソースコードの拡張子は次のようになります。 こんにちは。
- 展開されたソースコードはコンパイラに渡され、コンパイラはこの展開されたソースコードをアセンブリコードに変換する。アセンブリコードの拡張子は次のようになります。 こんにちは。
- このアセンブリ コードはアセンブラに送信され、アセンブラはアセンブリ コードをオブジェクト コードに変換します。
- オブジェクトコードの作成後、リンカは実行可能ファイルを作成します。次に、ローダーは実行用の実行可能ファイルをロードします。