構文ツリー は、ソース コードの字句構造と構文構造を表します。 この情報だけでは、ソース内のすべての宣言とロジックを記述するのに十分ですが、参照されている内容を識別するのに十分な情報ではありません。 名前は次を表します。
- 型
- フィールド
- メソッド
- ローカル変数
これらはそれぞれ一意に異なりますが、識別子が実際に参照するものを特定するには、多くの場合、言語規則を深く理解する必要があります。
ソース コードで表されるプログラム要素があり、プログラムは、アセンブリ ファイルにパッケージ化された以前にコンパイルされたライブラリを参照することもできます。 ソース コードがないため、アセンブリに使用できる構文ノードやツリーはありませんが、プログラムはそれらの内部の要素を参照できます。
これらのタスクには、 セマンティック モデルが必要です。
セマンティック モデルは、ソース コードの構文モデルに加えて、言語ルールをカプセル化し、参照されている正しいプログラム要素と識別子を正しく照合する簡単な方法を提供します。
編纂
コンパイルは、すべてのアセンブリ参照、コンパイラ オプション、およびソース ファイルを含む C# または Visual Basic プログラムをコンパイルするために必要なすべての表現です。
この情報はすべて 1 か所にあるため、ソース コードに含まれる要素の詳細を説明できます。 コンパイルは、宣言された各型、メンバー、または変数をシンボルとして表します。 コンパイルには、ソース コードで宣言されているか、アセンブリからメタデータとしてインポートされたシンボルを見つけて関連付けるのに役立つさまざまなメソッドが含まれています。
構文ツリーと同様に、コンパイルは不変です。 コンパイルを作成した後は、自分や他のユーザーと共有している可能性がある他のユーザーが変更することはできません。 ただし、既存のコンパイルから新しいコンパイルを作成し、変更を指定することもできます。 たとえば、追加のソース ファイルまたはアセンブリ参照を含む場合を除き、既存のコンパイルとあらゆる方法で同じコンパイルを作成できます。
シンボル
シンボルは、ソース コードによって宣言されるか、アセンブリからメタデータとしてインポートされた個別の要素を表します。 すべての名前空間、型、メソッド、プロパティ、フィールド、イベント、パラメーター、またはローカル変数は、シンボルによって表されます。
Compilation型のさまざまなメソッドとプロパティは、シンボルを見つけるのに役立ちます。 たとえば、宣言された型のシンボルを共通のメタデータ名で見つけることができます。 グローバル名前空間をルートとするシンボルのツリーとして、シンボル テーブル全体にアクセスすることもできます。
シンボルには、他の参照シンボルなど、ソースまたはメタデータからコンパイラが決定する追加情報も含まれます。 各種類のシンボルは、 ISymbolから派生した個別のインターフェイスによって表され、コンパイラが収集した情報を詳細に示す独自のメソッドとプロパティが含まれます。 これらのプロパティの多くは、他のシンボルを直接参照します。 たとえば、 IMethodSymbol.ReturnType プロパティは、メソッドが返す実際の型シンボルを示します。
シンボルは、ソース コードとメタデータの間で名前空間、型、およびメンバーの共通表現を示します。 たとえば、ソース コードで宣言されたメソッドとメタデータからインポートされたメソッドは、どちらも同じプロパティを持つ IMethodSymbol によって表されます。
シンボルは、 System.Reflection API で表される CLR 型システムの概念に似ていますが、型だけでなくモデル化も豊富です。 名前空間、ローカル変数、およびラベルはすべてシンボルです。 また、シンボルは CLR の概念ではなく、言語の概念を表したものです。 重複は多数ありますが、意味のある区別も多数あります。 たとえば、C# または Visual Basic の反復子メソッドは 1 つのシンボルです。 ただし、反復子メソッドが CLR メタデータに変換される場合は、型と複数のメソッドになります。
セマンティック モデル
セマンティック モデルは、1 つのソース ファイルのすべてのセマンティック情報を表します。 これを使用して、次の情報を検出できます。
- ソース内の特定の場所で参照されるシンボル。
- 任意の式の結果の型。
- エラーや警告など、すべての診断情報。
- 変数がソースの領域に流入・流出する方法。
- より投機的な質問に対する回答。
.NET