コンパイルプロセス

3404 ワード

プログラム実行の最後
1.コンパイラは、プログラムを構成する各ソースコード(.c)ファイルをコンパイラcomplierを介してターゲットコード(Windows->obj;クラスUnix->.o)にそれぞれコンパイルし、リンクlinkerによってヘッダファイル(ユーザカスタムヘッダファイル.hまたは.hppとリファレンスライブラリのヘッダファイル.h)とすべてのターゲットコードを含む単一の実行可能ファイルを生成する(.exe).exeファイルを実行する場合、オペレーティングシステムによりファイル内容をメモリにロードし、前処理pressingコンパイルcompilationアセンブリassemblyリンクlinking GCCコマンドオプション:ESCファイル接尾辞:ISOコンパイルプロセスは前処理段階、解析ソースコード、生成ターゲット世代コードに分けられる.一、前処理段階前コンパイル:gcc-E test.c-o test.i
includeヘッダファイルの含む
すべての#defineを削除し、マクロの置換クリアコメント(スペースに置換)を完了すべての条件コンパイル命令を処理すべて行番号とファイル名識別を追加#pragmaコンパイラ命令を保持してコンパイラに使用する..i(.ii C+)ファイルの生成を終了する.ps:複数回のコンパイルを防止する:
1.pragma once
pragma onceは、同じファイルが複数回includeされることを防止するために使用され、#pragma onceはコンパイル関連であり、ここで同じファイルは物理ファイルを指す.
弊害:あるヘッダファイルに複数のコピーがある場合、これらのファイルは論理的に同じですが、物理的には違います.そのため、これらのファイルを含むと、すべてが含まれていることに気づき、コンパイルエラーになります.2.マクロ
define HEAD_H
endif
……(ヘッダファイル内容)
ifndef HEAD_H
原理:条件コンパイルの弊害:
ifndefが最も初期に使用した方法は,言語に基づくマクロ定義名が衝突できないことを前提としている.#ifndefの後ろのマクロ名とプログラム内の他のマクロ名が「衝突」した場合、エラーが発生します.
エラーが発生しない場合の両者の違い:物理的に同じファイルがネストされている場合、第1の方法で前処理すると、そのファイルが開くたびに判断されますが、第2の方法では判断されませんので、この#pragma onceはより速くなります.ANSI規格Cでは、LINEがコンパイル中のファイルを示す行番号FILEがコンパイル中のファイルの名前DATEがコンパイル時刻を示す日付文字列、例えば「25 Dec 2007」TIMEがコンパイル時刻を示す時間文字列、例えば、「12:30:55」stdCは、ファイルが標準Cプログラムとして定義されているかどうかを判断する.コンパイラが標準でない場合、上記のマクロの一部のみがサポートされるか、まったくサポートされていない可能性がある.もちろん、コンパイラは、他の定義済みマクロ名も提供する可能性があります.注意:C標準マクロ名の表記は、識別子と両側の2本の下線で構成されています.二、コンパイル:gcc-S test.i -o test.s
                      ,    ,    ,    ,                     。

1.文法分析:
ソースコードはスキャナscannerに入力され、scannerは有限状態機に類似したアルゴリズムによってソースコードの文字を一連の記号に分割する.文法解析で生成された記号は、キーワード識別子の字面量(数字文字列)と特殊記号(+-=)に分けられます.識別記号とともに、スキャナはシンボルをシンボルテーブルに格納し、デジタル文字列定数をファイルテーブルに格納する後のステップで使用します.2.文法解析
grammer parser構文解析器:式レベルの解析構文解析ツールを完了し、ユーザーが指定した言語規則に基づいて構文ツリー(式をノードとするツリー)を構築します.3.意味解析:
semantic Analyzerの意味解析器は文法ツリーをさらに改善した.4.中間言語生成:(プラットフォーム間で実現)
                                          ,                   ,                 ,                               。

5.ターゲットコードの生成と最適化:
                                 ,                      。                    ,            ,             ,   ,               。

これらのスキャン構文解析による意味解析ソースコード最適化ソースコード生成とターゲットコード最適化.のソースコードは最終的にターゲットコードにコンパイルされます.しかし、変数のアドレスはまだ決定されていません.変数の定義が変数に対する操作ソースコードと同じコンパイルユニット内にある場合、コンパイラは変数に空間を割り当てることができます.三、アセンブリ:gcc-O test.s -o test.o
アセンブリ命令とバイナリ命令(マシン命令)テーブルを照合し、アセンブリ命令をバイナリ命令に変換し、ほぼ1つの命令をバイナリ命令に変換する.終了時に.oターゲットファイル4、リンク(ターゲットファイルライブラリリンク)を生成する
ライブラリとヘッダファイルの2つのもの.ライブラリは、ターゲットファイルのパッケージのセットです.つまり、一般的なコードがターゲットファイルにコンパイルされてパッケージ化されます.一般的なライブラリはランタイムライブラリruntime library CRT 1です.アドレスと空間の割り当て:コンパイル後の変数、関数のアドレスは決定されず、リンクプロセスは決定されます.2.符号決定:異なるモジュールには同じ変数名または関数名がある可能性があり、リンクは呼び出しがどれであるかを判断する.再配置:コンパイラはターゲットファイルをコンパイルする時、偽の変数の正確なターゲットアドレスを設けて知らないで、コンパイラは彼に0をあげます.リンクすると、このアドレスが修正されます.
クラスUnixシステムで:gcc program.cソースファイルを含むcプログラムをコンパイルしてリンクします.この命令は実行可能なプログラムa.outを生成する.真ん中に1つ発生します.oのターゲットファイルは、リンクが完了すると削除されます.........................実行:実行可能ファイルはメモリにロードする必要があります.オペレーティングシステムのある環境はオペレーティングシステムからメモリにロードされます.独立した環境では、プログラムのロードは手動でロードされます.または、実行可能コードから読み取り専用メモリにロードされます.次にプログラムが実行されます.まずメイン関数mainを呼び出し、プログラムコードの実行を開始し、プログラムは、関数のローカル変数とアドレスを格納するランタイムスタック(stack)を使用します.この関数がドメインに作用すると破棄されます.プログラムは、静的メモリ(static)を使用して、プログラム全体の実行が終了するまで静的メモリの値を保存することもできます.プログラムの終了:通常終了main関数と予期せぬ終了に分けられます.