.NET Compiler Platform SDK モデルについて

コンパイラは、多くの場合、人間がコードを読み取り、理解する方法とは異なる構造化された規則に従って書き込まれたコードを処理します。 コンパイラで使用されるモデルの基礎知識は、Roslyn ベースのツールを構築するときに使用する API を理解するのに必須です。

コンパイラ パイプラインの機能領域

.NET Compiler Platform SDK は、従来のコンパイラ パイプラインを反映する API レイヤーを提供することで、コンシューマーに C# と Visual Basic コンパイラーのコード分析を公開します。

steps of the compiler pipeline processing source code to object code

このパイプラインの各フェーズは別のコンポーネントです。 最初に、解析フェーズで、言語文法に従う構文にソース テキストをトークン化して解析します。 2 番目に、宣言フェーズで、ソースとインポートされたメタデータを分析して、名前付け規則を形成します。 次に、バインド フェーズで、コード内の識別子をシンボルと一致させます。 最後に、生成フェーズで、コンパイラによって構築されたすべての情報でアセンブリを生成します。

compiler pipeline api provides access to each step that is part of the compiler pipeline

これらの各フェーズに応じて、.NET Compiler Platform SDK はオブジェクト モデルを公開します。これにより、各フェーズの情報にアクセスできます。 解析フェーズでは構文ツリーを公開し、宣言フェーズでは階層シンボル テーブルを公開し、バインド フェーズではコンパイラのセマンティック分析結果を公開します。生成フェーズは IL バイト コードを生成する API です。

the language services available from the compiler api at each step of the compiler pipeline

各コンパイラは、これらのコンポーネントを一緒に単一のエンド ツー エンド全体として結合します。

これらの API は、Visual Studio で使用されるものと同じです。 たとえば、コードのアウトライン表示と書式設定機能では構文ツリーを使用し、オブジェクト ブラウザーとナビゲーション機能ではシンボル テーブルを使用します。リファクタリングと定義へ移動ではセマンティック モデルを使用し、エディット コンティニュでは、生成 API を含む、これらすべてを使用します。

API レイヤー

.NET Compiler SDK は、いくつかの API レイヤー (コンパイラ API、診断 API、スクリプティング API、ワークスペース API) で構成されています。

コンパイラ API

コンパイラ レイヤーには、構文とセマンティックの両方のコンパイラ パイプラインの各フェーズで公開される情報に対応するオブジェクト モデルが含まれています。 また、コンパイラ レイヤーには、アセンブリ参照、コンパイラ オプション、ソース コード ファイルを含む、コンパイラの単一呼び出しの不変のスナップショットも含まれています。 C# 言語と Visual Basic 言語を表す 2 つの異なる API があります。 これら 2 つの API の形は似ていますが、各言語を忠実に再現するために調整されます。 このレイヤーは Visual Studio のコンポーネントには依存しません。

診断 API

分析の一環として、コンパイラにより、構文、セマンティック、および限定代入エラーからさまざまな警告と情報診断に至るすべてをカバーする一連の診断情報が生成される場合があります。 コンパイラ API レイヤーは拡張可能な API を介して診断情報を公開し、ユーザー定義のアナライザーをコンパイル プロセスに接続できるようにします。 これにより、StyleCop のようなツールで生成されるものなど、ユーザー定義の診断情報を、コンパイラ定義の診断情報と一緒に生成することができます。 この方法で診断情報を生成すると、ポリシーに基づくビルドの停止、エディターでの破線の即時表示、コード修正の提案などの操作の診断に依存する、MSBuild や Visual Studio などのツールに自然に統合できるという利点があります。

スクリプト API

ホスティング API とスクリプト API は、コンパイラ レイヤーの上に構築されます。 スクリプト API を使用してコード スニペットを実行し、ランタイム実行コンテキストを蓄積できます。 C# 対話型 REPL (Read-Evaluate-Print Loop) ではこれらの API を使用します。 REPL を使用すると、C# をスクリプト言語として使用し、記述時に対話形式でコードを実行できます。

ワークスペース API

ワークスペース レイヤーにはワークスペース API が含まれます。この API は、ソリューション全体でのコード分析とリファクタリングの開始点となります。 単一オブジェクト モデルにソリューションのプロジェクトに関するすべての情報を簡単にまとめることができ、コンパイラ レイヤー オブジェクト モデルに直接アクセスできます。ファイルの解析、オプションの構成、プロジェクト間の依存関係の管理は必要ありません。

さらに、ワークスペース レイヤーには、Visual Studio IDE のような、ホスト環境内で機能するコード分析およびリファクタリング ツールを実装するときに使用される一連の API も示されます。 たとえば、すべての参照の検索、書式設定、コード生成 API などです。

このレイヤーは Visual Studio のコンポーネントには依存しません。