31

私はコンパイラコースを勉強しています。プログラムのコンパイルは以下の手順に従います

  1. 字句解析
  2. 構文解析
  3. セマンティック分析
  4. 中間コード生成
  5. コードの最適化
  6. ターゲット コード生成。

各ステップの出力を確認するにはどうすればよいですか。たとえば、構文解析後に解析ツリーを確認したいです。

LinuxマシンでGCCコンパイラを使用してプログラムをコンパイルしています。

gcc で -Wa コンパイラ オプションを使用すると、プログラムのアセンブリ コードを表示できます。同様に、トークン、解析ツリー、および Inetmediate コードを表示するオプションがあります。

4

3 に答える 3

21

-fdump-tree-allgcc でオプションとオプションを使用できますが-fdump-rtl-all、それらの出力はコンパイラの学生にとってあまり有用ではないと思います。FWIW、私は博士課程の研究の一環として gcc の作業を開始し、すでに 2 つの学部課程を修了していましたがgcc、そのデバッグ ファイルが不透明でわかりにくいことがわかりました。

さらに、gcc は実際にはコンパイラの教科書的な設計に従っていません。それはうまくいかないので、誰もそうしません。gcc が解析ツリーや抽象構文ツリーを生成しないことは確かです。高レベルの最適化を実行する IR (gimple と呼ばれる) を構築します。

代わりに LLVM を試すことをお勧めします。LLVM は、適切に設計されており、従いやすいという定評があります。もう 1 つの方法は、教科書、特に Appel 本からコードをダウンロードすることです。

もう 1 つの提案は、自分自身を少しお勧めする場合は、phcを使用することです。phc を使用すると、解析ツリーを画像として表示し、コンパイラでのすべてのパスの後に AST とソース コードを表示できます。以下は、AST と解析ツリーの一部を比較したものです。それらは、phc を使用して自明に生成されます。コンパイラ IR、CFG、SSA 形式、および型推論とエイリアス分析のデバッグ出力を確認できます。最適化とパスのオンとオフを切り替えて、その効果を確認することもできます。

これはあなたにとって役立つと思います。

于 2009-10-01T20:45:30.193 に答える
12

でプリプロセッサの出力を確認できます-E-fdump-tree-*ツリーの内部表現をダンプします-fdump-tree-all-dRTL 中間表現をダンプするためのさまざまなオプションがあり-fdump-rtl-allます。さらに、-dDすべてのマクロ定義をダンプします。

于 2009-10-01T20:31:31.387 に答える