Rosyln プロジェクトを取り上げた最初のレポートでは,単にランタイムへのアクセス性に優れたコンパイラと REPL 形式のインタプリタとして報告しただけだったが,それよりもはるかに野心的なものであることが明らかになった。コンパイラのパイプラインをすべて公開することで Microsoft が期待するのは,多くのレベルでさまざまなツールが開発されることだ。
Rosyln プロジェクトには4つの "API レイヤ" がある。Microsoft による要約は次のとおりだ。
コンパイラ API
コンパイラレイヤには,コンパイラパイプラインの各フェーズで出力される構文的および意味的情報に相当するオブジェクトモデルが配置されている。アセンブリ参照やコンパイラオプション,ソースコードファイルなど,コンパイラの起動単位で指定される情報もここに含まれる。C# 言語と Visual Basic 言語それぞれに同じような形式の API が用意されている。
スクリプティング API
スクリプティングレイヤは,C# あるいは Visual Basic のスニペット (snippet,短いコード) を実行するランタイムコンテキストに相当するもので,プログラム構造上の最上位において式や文を評価するスクリプティングエンジンを備えている。
ワークスペース API
ワークスペースレイヤは,ソリューション全体にわたるコード解析とリファクタリングを実行するための出発点となる。ファイル解析やオプション設定,プロジェクト間の依存関係管理を必要とせずに,コンパイラレイヤのオブジェクトモデルに直接アクセスする機能を提供することによって,ソリューション内のプロジェクトに関するすべての情報を単一オブジェクトモデルへと組織化する作業の補助的な役割を果たす。
サービス API
サービスレイヤにはインテリセンス,リファクタ,コードフォーマット機能など,Visual Studio IDE のすべての機能が含まれている。ユーザが Visual Studio を容易に拡張できるサービス API も備えている。
これら4つのレイヤのうちで Visual Studio のコンポーネントに強く依存しているのはサービス API だけであって,他は任意のアプリケーションで使用することができる。ただしワークスペース API については,Visual Studio でホストされた場合の方が高機能である。
目的とするものが解析であれ,あるいは更新であれ,コードを扱う開発者の大部分は,まずワークスペースのレベルから始めることになる。ワークスペースはホスト (IDE など) が提供するものを利用することも,ソリューションファイルをロードして独自に構築することも可能だ。ホストが提供する場合には,ソリューションの項目の変更がイベントとして通知される。
ISolution を起点とする場合,ワークスペース API 下はすべて変更不能なスナップショットとして表現されている。これによってソリューションに含まれるすべてのプロジェクトやドキュメント,構文,シンボルツリーに対するスレッドセーフなアクセスが実現される。変更は構文木のコピーを生成して,対応する部分と置き換えることによって行う。変更不能であるため,操作対象でないブランチはすべて安全に再利用することができる。
ツリーの最下部分には,ソースコードそのものを表すテキストがある。コンパイラは最初のパスで,これらを 構文木 に変換する。構文木はファイル全体からも,あるいは単一の文や式からも生成することができる。Rosyln の構文木には,元のソースコードに対してコメントや単なる空白文字も含む完全な忠実度を持っている,という興味深い特徴がある。これは構文木からソースコードへの逆変換が可能であることを意味するもので,コードジェネレータやリファクタリングツールにとっては重要な機能だ。
構文木は構文ノード,トークン,トリビアから構成される。構文ノードは常に他のノード,トークン,あるいはトリビアの組み合わせを含んでいる。NamespaceDeclarationSyntax,ForStatementSyntax,inaryExpressionSyntax などの構文ノードがある。トークンは個々のキーワード,シンボル,識別子などである。トリビアは空白やコメントなど,コンパイラには必要ないが元のソースコード表記を再現する上では重要な情報を保持している。
構文木の変更は,コンストラクタと ReplaceNode メソッドを組み合わせて行う。このメソッドは,構文木の変更されていない部分のコピー操作を不要にするものだ。
構文木が表現しているのは,ソースコードの字句および構文構造に限られている。文法的な意味を知るためには コンピレーション(compilation) を生成する必要がある。コンピレーションはひとつまたは複数の構文木,参照コレクション,コンパイラフラグなどから生成され,ネームスペースや型,メソッド,フィールド,イベント,ローカル変数,ラベルといったシンボルのリスト管理を主な役割としている。
開発者は一般に,セマンティックモデルを用いて作業を行う。セマンティックモデルはコンピレーションに構文木をフィードバックして,シンボルデータで注釈付けすることで生成されるもので,以下のような情報の問い合わせに使用される。
- ソース上のある位置で参照されているシンボル。
- 式の結果を表す型。
- エラーや警告など診断情報すべて。
- ソース領域内外への変数の移動状態。
- さらに思索的な問いへの答。
セマンティックモデル上には "コントロールおよびデータフロー解析 API" があり,特定の領域内での変数の設定と参照,ジャンプあるいはリターン文の有無などの情報獲得に使用される。
Rosyln は現在,CPT がダウンロード公開されている。利用には Visual Studio 2010 SP 1 が必要だ。