単語
「Hello World」の文は、多くの小さなパートナーがプログラミングに触れる最初の段階ですが、「Hello World」の文の出力の背後には、コンパイラによる数回の処理の結果があります。
現在の統合開発環境 (IDE) はすでに非常にスマートで簡潔です. コンパイル ボタンを押して完了を待つだけで実行プログラムを取得できます. プリコンパイル、コンパイル、アセンブリ、およびリンクは表示されません (下の図に示すように)。
複数のソース ファイルがある場合、それらはプリコンパイル、コンパイル、アセンブル、およびリンクされて、実行可能プログラムが生成されます(以下を参照)。
プリコンパイル コンパイルとアセンブリ リンクの 2 つの特定の機能
2.1 プリコンパイル
1: #define の置換と削除をすべて完了する
2: #if、#ifdef、#endef などのすべてのプリコンパイル済み命令を処理します。
3: 「#include」プリコンパイル済みディレクティブを処理し、インクルード ファイルをプリコンパイル済みディレクティブの場所に挿入します。このプロセスは再帰的であることに注意してください。つまり、含まれるファイルには他のファイルも含まれる可能性があります。
4: コメント "//" と "/* */" をすべて削除します。
5: 行番号とファイル名の識別 (#2 "hello.c" 2 など) を追加して、コンパイラがコンパイル中にデバッグ用の行番号情報を生成できるようにし、コンパイル中にコンパイル エラーまたは警告が生成されたときに行番号を表示できるようにします。
6: コンパイラが使用する必要があるため、すべての #pragma コンパイラ ディレクティブを保持します。
要約: すべてのマクロが展開されているため、プリコンパイル済みの.i ファイルにはマクロ定義が含まれていません。
2.2 コンパイル
機能:ソース コードに対して文法分析、語彙分析、意味分析、および最適化を実行して、 対応するアセンブリ コードファイルを生成します (次のステップはアセンブリであるため、アセンブリ コードを生成する必要があります)。
2.3 組み立て
機能: アセンブリ コードをマシンが実行できる命令に変換する
拡張: アセンブラーはアセンブリ コードを機械実行可能な命令に変換し、各アセンブリ ステートメントはほぼ機械命令に対応します。したがって、アセンブラのアセンブリプロセスは、コンパイラに比べて比較的単純です. 複雑な構文やセマンティクスはなく、命令を最適化する必要もありません. アセンブリ命令と機械語命令の比較表に基づいているだけです.これが「コンパイル」という名前の由来です。
2.4 リンク
機能: アドレスとスペースの割り当て、セグメント テーブルのマージ、シンボル テーブルのマージと再配置
拡大:
再配置: リンカーによって変更された絶対ストレージ アドレス (変数など)