高級言語で書かれたソースプログラムを実行可能プログラムに変換するには、「コンパイルとリンク」が必要です。高級言語で書かれたソース プログラムはマシン上で直接実行できず、コンパイルしてリンクする必要があります。
#プログラムを実行するには、前処理、コンパイル、アセンブリ、リンクという 4 つの手順を実行する必要があります。次に、いくつかの簡単な例を通して、これらのプロセスを詳しく説明します。
1. 前処理:
-E オプションを使用すると、プリコンパイルのみが実行され、それに応じて .i ファイルが生成されます。 前処理プロセス中に実行される操作:2. コンパイル:
-S オプションを使用して、コンパイル操作が実行後に終了することを示します。それに応じて .s ファイルが生成されます。 コンパイル プロセスは、プログラム全体の構築の中核部分です。コンパイルが成功すると、ソース コードがテキスト形式から機械語に変換されます。コンパイル プロセスでは、一連の字句解析が実行され、構文解析、前処理されたファイルの意味解析、解析と最適化の後、対応するアセンブリ コード ファイルが生成されます。文法分析は式の構文レベルの分析を完了しますが、ステートメントが本当に意味があるかどうかは理解できません。一部のステートメントは、文法的には正当ですが、実際的な意味を持ちません。たとえば、2 つのポインターを乗算する場合、セマンティック分析が必要になります。ただし、コンパイラが分析できるセマンティックは静的セマンティックのみです。
静的セマンティクス: コンパイル時に決定できるセマンティクス。通常、宣言、型マッチング、型変換が含まれます。たとえば、浮動小数点式が整数式に代入される場合、それは浮動小数点から整数への変換を意味するため、セマンティック分析でこの変換を完了する必要があります。セマンティック解析中に 2 つの型が一致しないことが判明し、コンパイラはエラーを報告します。
動的セマンティクス: 実行時にのみ決定できるセマンティクス。例えば、2つの整数を除算する場合、構文に問題はなく、型も一致しているので何も問題がないように見えますが、除数が0の場合に問題が発生します。この問題は不明です。これは動的セマンティクスです。
コードは最適化できます。コンパイル中に決定できるいくつかの値については、2 6 と言えば最適化されます。上の例では、コンパイル中にその値が 8 であると判断できますが、構文を直接最適化することはより困難であり、この場合、オプティマイザーはまず構文ツリーを中間コードに変換します。中間コードは通常、ターゲット マシンや動作環境から独立しています。 (データサイズ、変数アドレス、レジスタ名等は含みません)。中間コードの形式はコンパイラごとに異なりますが、最も一般的なものは 3 アドレス コードと P コードです。
中間コードにより、コンパイラをフロントエンドとバックエンドに分割できます。コンパイラーのフロントエンドはマシンに依存しない中間コードの生成を担当し、コンパイラーのバックエンドは中間コードをマシンコードに変換します。
コード ジェネレーターは、中間コードをマシン コードに変換します。マシンによってワード長が異なるため、このプロセスはターゲット マシンによって異なります。レジスタ、データ型など。
最後に、ターゲット コード オプティマイザーは、適切なアドレス指定メソッドの選択、乗算と除算の置き換えに固有のアドレス指定メソッドの使用、冗長な命令の削除など、ターゲット コードを最適化します。
3. アセンブリ
アセンブリ プロセスは、アセンブリ コードをマシンが実行できる命令に変換するために使用されるアセンブラを呼び出すことによって完了します。アセンブリ文 機械語命令に相当します。
コマンドを hello.s -o hello.o として使用するか、 gcc -c hello.s -o hello.o を使用してアセンブリ プロセスが終了するまで実行します。対応する生成ファイルは .o です。ファイル。
4. リンク
リンクの主な内容は、モジュール間で相互に参照する部分を正しく接続することです。その仕事は、他のシンボル アドレスへの一部の命令の参照を修正することです。リンク プロセスには、主にアドレスとスペースの割り当て、シンボル解決とリダイレクトが含まれます。
シンボル解決: シンボル バインディング、名前バインディング、名前解決、またはアドレス バインディングとも呼ばれ、実際にはシンボルの使用を指します。住所を特定するため。
たとえば、Int A = 6; このようなコードでは、A を使用して空間内の 4 バイト サイズの空間を識別し、その空間に格納されている内容は 4 です。各ターゲットに対処することを再配置と呼びます。
最も基本的なリンクは静的リンクと呼ばれ、各モジュールのソース コード ファイルをターゲット ファイル (Linux: .o Windows: .obj) にコンパイルし、ターゲット ファイルとライブラリを一緒にリンクします。最終的な実行可能ファイルを形成します。ライブラリは実際にはターゲット ファイルのセットのパッケージであり、最も一般的に使用されるコードの一部はターゲット ファイルに変換され、パッケージ化されて保存されます。最も一般的なライブラリはランタイム ライブラリで、プログラムの実行をサポートする基本関数のコレクションです。
関連知識の詳細については、
PHP 中国語 Web サイト以上が高級言語で書かれたソースプログラムを実行可能プログラムに変換するには何が必要ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。