0

私はコンパイルに非常に興味があり、gccについて質問があります。

コンパイルするコードからツリーが生成され、次にASMコードが生成されることを知っています。この点について、いくつかの説明が必要です。

ASMコードがファイルに追加されて後で実行されるか、ASMコードがasm関数を使用してメモリに直接ロードされますか?私は小さなコンパイラに取り組んでいますが、生成されたツリーを実行する方法がわかりません。また、それに関するドキュメントも見つかりませんでした。

4

3 に答える 3

2

かなり漠然とした質問であり、あなたの正確な問題が何であるかを完全には理解していないと思いますが、とにかくここに答えがあります。アセンブリは実行可能ファイルに入れられません。アセンブリは中間アセンブリファイルに書き込まれ、そこからアセンブラが真のバイナリマシンコード(オブジェクトファイルと呼ばれる)を生成し、リンカがそれらを(必要なライブラリとともに)最終的な実行可能ファイルにマージします。アプリケーションが実行されると、実行可能ファイルはOSによってRAMに直接ロードされ、プロセッサによってネイティブに実行されます。

于 2012-07-25T17:13:18.923 に答える
2

GCCのフロントエンドは、さまざまな言語(C、C ++、Fortran、ObjectiveC、Javaなど)でソースファイルを解析します。次に、コード(AST)が内部表現であるRTL(レジスタ転送言語)に変換されます。これは、アセンブリに近い表現です。

次に、このRTLコードはターゲットマシンのアセンブリに変換され、.o(オブジェクト)ファイルに書き込まれます。

次に、リンカは生成された.oファイルを実行可能ファイルに結合します。

「インライン」アセンブリスニペットは、C /C++のGCCでもサポートされています。

ワークフローは

Source file -> 
 AST  ->
  RTL representation  ->
   machine codes (with _optional_ text output of the ASM code) ->
    Executable (produced by linker)

インタープリターの場合、ASTを直接解釈するか、仮想マシン用に独自のオペコードを作成できます。このようなインタープリター(仮想マシン)はASTインタープリターよりも単純だからです。

すべての詳細が必要な場合は、LCC(ChrisFraserとDavidHansonの本を含む)を参照してください。実際のアーキテクチャのコード生成の詳細はすべて、付属の本に記載されています。

そして、生成されたコードで何ができるかを知るには、ジョン・レヴィンの本によるリンカーとローダーを読む必要があります。

最後に、スクリプティング/インタプリタについてすべてを尋ねるのを避けるために、AlexVaraneseによるGameScriptingMasteryを参照してください。

于 2012-07-25T17:55:55.240 に答える
1

ソースコードを実行可能コードに変換する方法は?コンパイラにソースコードを提供し、実行可能コードを提供します。ただし、これはシングルステップ操作ではありません。これは、ソースコードを実行可能コードに変換するためのいくつかの事前定義された手順に従います。

ソースコードから実行可能コードに変換するための手順

1.プリプロセッサ マシンコードに変換される前に多くの仕事をするので、コンパイラの非常に便利な部分です。以下のテキスト編集操作を行うワードプロセッサです。

読みやすく/理解しやすいように、ソースコードに記述されているソースコードのコメント行を削除します。ヘッダーファイルの内容をソースコードに追加します。ヘッダーファイルには、常に関数プロトタイプと宣言が含まれています(ヘッダーファイルに実行可能コードが含まれることはありません)。プリプロセッサの非常に重要なプロパティは、条件付きコンパイルです。スケーラブルな設計には非常に必要です。このプロパティは、コンパイラから不要な負担を取り除きます。マクロはこのプリプロセッサに置き換えられます。

このステージの最終出力は、純粋なCコードとして知られています。

2.Translator コンパイラのこの部分は、純粋なCコードをアセンブリ言語コードに変換する役割を果たします。ここで行われるアセンブリ言語コードへのC言語コードの段階的なマッピング。関数と宣言のプロトタイプは、Cコードの変換のためにこの部分で使用されます。アセンブリコードとして知られるこの段階の出力。

3.アセンブラ アセンブリ言語コードからオブジェクトコードを生成します。アセンブリ言語コードを機械語コード(つまり、0と1の形式)に変換します。OSの助けを借りてプロセッサでコードを実行するため、直接実行されません。オブジェクトコードとして知られるこの段階の出力。

4.リンカー それは私たちのマシンで実行される予定の最終的な実行可能コードを提供します。このステージの出力は、実行可能コードと呼ばれます。これは、オブジェクトコードとサポートファイルの組み合わせです。サポートファイルは、ユーザー定義の関数定義、事前定義されたライブラリ関数定義などです。

于 2012-07-26T19:33:21.573 に答える