次の方法で共有


共通言語ランタイムと式の評価

Important

Visual Studio 2015 では、式エバリュエーターを実装するこの方法は非推奨になりました。 CLR 式エバリュエーターの実装については、 CLR 式エバリュエーターマネージド式エバリュエーターのサンプルを参照してください。

共通言語ランタイム (CLR) を対象とする Visual Basic や C# (C シャープと発音) などのコンパイラでは、Microsoft Intermediate Language (MSIL) が生成され、後でネイティブ コードにコンパイルされます。 CLR には、結果のコードをデバッグするためのデバッグ エンジン (DE) が用意されています。 独自のプログラミング言語を Visual Studio IDE に統合する場合は、MSIL にコンパイルすることを選択できるため、独自の DE を記述する必要はありません。 ただし、プログラミング言語のコンテキスト内で式を評価できる式エバリュエーター (EE) を記述する必要があります。

考察 (Discussion)

一般に、コンピューター言語の式は、一連のデータ オブジェクトと、それらを操作するために使用される演算子のセットを生成するために解析されます。 たとえば、式 "A+B" を解析してデータ オブジェクト "A" と "B" に加算演算子 (+) を適用すると、別のデータ オブジェクトが生成される可能性があります。 データ オブジェクト、演算子、およびそれらの関連付けの合計セットは、多くの場合、ツリーとしてプログラムで表され、ツリーのノードの演算子と分岐のデータ オブジェクトで表されます。 ツリー形式に分割された式は、多くの場合、解析されたツリーと呼ばれます。

式が解析されると、シンボル プロバイダー (SP) が呼び出され、各データ オブジェクトが評価されます。 たとえば、"A" が両方とも複数のメソッドで定義されている場合は、A の値を確認する前に、"どの A?" という質問に答える必要があります。 SP によって返される答えは、"5 番目のスタック フレームの 3 番目の項目" や "このメソッドに割り当てられた静的メモリの開始から50バイト先にあるA" のようなものです。

プログラム自体の MSIL を生成するだけでなく、CLR コンパイラは、Program DataBase (.pdb) ファイルに書き込まれる非常にわかりやすいデバッグ情報を生成することもできます。 独自言語コンパイラが CLR コンパイラと同じ形式でデバッグ情報を生成する限り、CLR の SP はその言語の名前付きデータ オブジェクトを識別できます。 名前付きデータ オブジェクトが識別されると、EE はバインダー オブジェクトを使用して、そのオブジェクトの値を保持するメモリ領域にデータ オブジェクトを関連付ける (またはバインド) します。 その後、DE はデータ オブジェクトの新しい値を取得または設定できます。

独自のコンパイラは、(名前空間ISymbolWriterの .NET Framework で定義されている) System.Diagnostics.SymbolStore インターフェイスを呼び出すことによって、CLR デバッグ情報を提供できます。 MSIL にコンパイルし、これらのインターフェイスを使用してデバッグ情報を書き込むことで、独自のコンパイラで CLR DE と SP を使用できます。 これにより、独自の言語を Visual Studio IDE に統合する作業が大幅に簡素化されます。

CLR DE が独自の EE を呼び出して式を評価すると、DE は SP とバインダー オブジェクトへのインターフェイスを EE に提供します。 したがって、CLR ベースのデバッグ エンジンを記述することは、適切な式エバリュエーター インターフェイスを実装するだけで済むということです。CLR はバインディングとシンボル処理を自動的に処理します。