4

コンパイラが実際にどのように機能するかを調べることに興味を持ちました。私はいくつかの本を調べましたが、コンパイラーのフェーズは大まかに次のようなものであるという事実にすべて同意しています(間違っている場合は修正してください): 字句解析、構文解析、意味解析、中間コード、コード最適化、コード生成。レキシカルとシンタックスのフェーズは、メソッドとして非常に明確で単純に見えます (しかし、これはもちろん簡単という意味ではありません)。ただし、セマンティック フェーズが実際に構成されているものをまだ見つけることができません。1 つには、スコープ チェック、宣言チェック、型チェックなどのいくつかのサブフェーズが必要であることはわかっていますが、私を悩ませている質問は、他にやらなければならないことがありますか?ということです。このフェーズで実行する必要がある必須の手順を教えてください。これはプログラミング言語とコンパイラの実装に大きく依存することは承知していますが、C/C++、Java に関する例をいくつか教えてください。そして、それらのことを詳しく読むことができる本/ページ/記事を教えてください. ありがとう。

編集: 私が調べた本は、「コンパイラ: 原則、技法、およびツール」、Aho および「最新のコンパイラ設計」、Grune、Reeuwijk でした。それらを使用してこの質問に答えることができませんでした。この質問が広すぎると思われる場合は、C、C++、または Java のいずれかで選択したコンパイラの実装を考慮して回答してください。

4

3 に答える 3

0

必ずしもサブフェーズに分割することはできません。やらなければならないことはたくさんありますが、少なくとも概念的には、解析ツリーを上から下にたどり、再び戻る間にすべて完了します。それらが正確に何であり、それがどのように正確に発生するかは、言語、処理されるステートメント、特定のコンパイラ作成者などによって異なります...

リストの作成を開始できます。

  1. シンボル テーブルを作成します。
  2. 参照されている変数の宣言を見つけます。
  3. 変数のデータ型の互換性を確認してください。
  4. 部分式のタイプを確立します。
  5. ...

すでにこれらは、分離可能なサブフェーズを構成するのではなく、実際にはある程度混ざり合っている必要があることがわかります。

于 2013-09-18T22:16:40.870 に答える