コンパイラは、人間がコードを読み、理解する方法とは異なる構造化された規則に従って記述するコードを処理します。 コンパイラで使用されるモデルの基本的な理解は、Roslyn ベースのツールを構築するときに使用する API を理解するために不可欠です。
コンパイラ パイプラインの機能領域
.NET Compiler Platform SDK は、従来のコンパイラ パイプラインをミラー化する API レイヤーを提供することで、C# および Visual Basic コンパイラのコード分析をコンシューマーとして公開します。
このパイプラインの各フェーズは個別のコンポーネントです。 最初に、解析フェーズでは、言語文法に従う構文にソース テキストがトークン化され、解析されます。 次に、宣言フェーズでは、ソースとインポートされたメタデータを分析して名前付きシンボルを形成します。 次に、バインド フェーズでは、コード内の識別子がシンボルと一致します。 最後に、出力フェーズでは、コンパイラによって構築されたすべての情報を含むアセンブリが出力されます。
これらの各フェーズに対応して、.NET Compiler Platform SDK は、そのフェーズの情報へのアクセスを許可するオブジェクト モデルを公開します。 解析フェーズでは構文ツリーが公開され、宣言フェーズでは階層シンボル テーブルが公開され、バインド フェーズではコンパイラのセマンティック分析の結果が公開され、出力フェーズは IL バイト コードを生成する API です。
各コンパイラは、これらのコンポーネントを 1 つのエンド ツー エンド全体として結合します。
これらの API は、Visual Studio で使用される API と同じです。 たとえば、コードのアウトライン機能と書式設定機能では構文ツリーが使用され、 オブジェクト ブラウザーとナビゲーション機能ではシンボル テーブルが使用され、リファクタリングと 定義への移動 ではセマンティック モデルが使用され、 エディット コンティニュ では Emit API を含むこれらすべての機能が使用されます。
API レイヤー
.NET コンパイラ SDK は、コンパイラ API、診断 API、スクリプト API、ワークスペース API という複数の API レイヤーで構成されています。
コンパイラ API
コンパイラ レイヤーには、構文とセマンティックの両方で、コンパイラ パイプラインの各フェーズで公開される情報に対応するオブジェクト モデルが含まれています。 コンパイラ レイヤーには、アセンブリ参照、コンパイラ オプション、ソース コード ファイルなど、コンパイラの 1 回の呼び出しの変更できないスナップショットも含まれています。 C# 言語と Visual Basic 言語を表す 2 つの異なる API があります。 2 つの API の形状は似ていますが、個々の言語に合わせて高い忠実性を実現するように調整されています。 このレイヤーには、Visual Studio コンポーネントへの依存関係はありません。
診断用API
解析の一環として、コンパイラは、構文、セマンティック、明確な代入エラーから、さまざまな警告や情報診断まで、すべてをカバーする一連の診断を生成できます。 コンパイラ API レイヤーは、ユーザー定義アナライザーをコンパイル プロセスに接続できる拡張可能な API を介して診断を公開します。 これにより、StyleCop などのツールによって生成された診断などのユーザー定義診断を、コンパイラ定義の診断と共に生成できます。 この方法で診断を生成すると、MSBuild や Visual Studio などのツールと自然に統合できるという利点があります。これは、ポリシーに基づくビルドの停止やエディターでのライブ 波線の表示、コード修正の提案などのエクスペリエンスの診断に依存します。
スクリプト API
ホスティング API とスクリプト API は、コンパイラ レイヤーの上に構築されます。 スクリプト API を使用してコード スニペットを実行し、ランタイム実行コンテキストを蓄積できます。 C# 対話型 REPL (読み取りEvaluate-Print ループ) では、これらの API が使用されます。 REPL を使用すると、C# をスクリプト言語として使用し、記述時に対話形式でコードを実行できます。
ワークスペース API
Workspaces レイヤーには、ワークスペース API が含まれています。これは、ソリューション全体に対してコード分析とリファクタリングを行うための開始点です。 ソリューション内のプロジェクトに関するすべての情報を 1 つのオブジェクト モデルに整理するのに役立ちます。ファイルの解析、オプションの構成、プロジェクト間の依存関係の管理を行うことなく、コンパイラ レイヤー オブジェクト モデルに直接アクセスできます。
さらに、Workspaces レイヤーには、Visual Studio IDE などのホスト環境内で機能するコード分析およびリファクタリング ツールを実装するときに使用される一連の API が表示されます。 たとえば、すべての参照の検索、書式設定、およびコード生成 API があります。
このレイヤーには、Visual Studio コンポーネントへの依存関係はありません。
.NET