ホームページ  >  記事  >  高級言語で書かれたソースプログラムを実行可能プログラムに変換するには何が必要ですか?

高級言語で書かれたソースプログラムを実行可能プログラムに変換するには何が必要ですか?

青灯夜游
青灯夜游オリジナル
2020-08-31 15:44:1652675ブラウズ

高級言語で書かれたソースプログラムを実行可能プログラムに変換するには、「コンパイルとリンク」が必要です。高級言語で書かれたソース プログラムはマシン上で直接実行できず、コンパイルしてリンクする必要があります。

高級言語で書かれたソースプログラムを実行可能プログラムに変換するには何が必要ですか?

#プログラムを実行するには、前処理、コンパイル、アセンブリ、リンクという 4 つの手順を実行する必要があります。次に、いくつかの簡単な例を通して、これらのプロセスを詳しく説明します。

上で使用したオプションのいくつかを説明する必要があります。

オプションを指定せずに gcc コマンドを使用すると、前処理、コンパイル、アセンブリ、およびリンクのプロセス全体がデフォルトで実行されます。プログラムが正しければ、実行可能ファイルが取得されます。 a.out

-E オプション: 前処理の実行後にコンパイラに停止を要求し、その後のコンパイル、アセンブル、およびリンクは実行されません。

-S オプション: コンパイル後に停止し、アセンブルとリンクを実行しないようにコンパイラに指示します。

-c オプション: アセンブリの実行後にコンパイラに停止を要求します。

したがって、これら 3 つのオプションは、特定のステップを個別に取り出して実行するのではなく、コンパイラの実行操作の停止時間を制限することに相当します。

#上記のプログラムの実行プロセスについては誰もがよく知っているはずなので、時間を無駄にすることはありません。

1. 前処理:

-E オプションを使用すると、プリコンパイルのみが実行され、それに応じて .i ファイルが生成されます。

前処理プロセス中に実行される操作:

    すべての「#define」を削除し、すべてのマクロ定義を展開します
  • すべての条件付きコンパイル命令を処理します。たとえば、「#」 if"、"#ifdef"、"#elif"、"#else"、"#endif"
  • "#include" プリコンパイル ディレクティブを処理し、インクルードされたヘッダー ファイルをコンパイルに挿入します。 命令の場所。 (インクルードされたファイルには他のファイルも含まれている可能性があるため、このプロセスは再帰的です)
  • すべてのコメント「//」と「/* */」を削除します。
  • 行番号とファイル名の識別子を追加すると、コンパイラはコンパイル中に後でデバッグできるように行番号のアイデアを生成しやすくなり、コンパイル中にコンパイル エラーや警告が発生したときに行番号を表示できるようになります。
  • コンパイラが必要とするすべての #pragma プラグマを保持します。
簡単なプログラムを使用して、事実が上記の通りであるかどうかを確認します。

簡単なプログラムを作成し、-E オプションを使用して前処理プロセスを実行し、生成された比較ファイルを開きます。 .i ファイルをソース ファイルと結合すると、結果が一目瞭然です

コードへの行番号の追加については、ここでは説明しません。手動では行いません。コードを記述するときに行番号を追加する場合、表示される行番号は使用する編集ツールによって自動的に追加され、コンパイル システムではこれらの行番号を確認できません。コードをコンパイルすると、コードのどの行に問題があるかを知らせるプロンプトが表示され、コンパイラが自動的に行番号を追加することがわかります。

2. コンパイル:

-S オプションを使用して、コンパイル操作が実行後に終了することを示します。それに応じて .s ファイルが生成されます。

コンパイル プロセスは、プログラム全体の構築の中核部分です。コンパイルが成功すると、ソース コードがテキスト形式から機械語に変換されます。コンパイル プロセスでは、一連の字句解析が実行され、構文解析、前処理されたファイルの意味解析、解析と最適化の後、対応するアセンブリ コード ファイルが生成されます。

    字句解析:
字句解析では、lex という名前のプログラムを使用して字句スキャンを実装し、ユーザーが以前に記述した字句ルールに従って入力文字列を分析します。それを個々のトークンに分割します。生成されたトークンは通常、キーワード、識別子、リテラル (数値、文字列などを含む)、および特殊記号 (演算子、等号など) に分類され、対応するテーブルに配置されます。

    文法分析: 文法アナライザーは、ユーザーが指定した文法規則に従って字句分析によって生成されたトークン シーケンスを解析し、それらから文法ツリーを形成します。言語が異なると、文法規則が異なるだけです。 yacc という構文分析用の既製ツールもあります。

  • 意味分析:

文法分析は式の構文レベルの分析を完了しますが、ステートメントが本当に意味があるかどうかは理解できません。一部のステートメントは、文法的には正当ですが、実際的な意味を持ちません。たとえば、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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。