@natsu1211

ゲーム開発、プログラミング言語の話

.NETコンパイラープラットフォーム「Roslyn」をわかりやすく解説

Roslyn登場の背景

従来のC#/VBコンパイラーはブラックボックスであり、ソースコードを与えるとコンパイル結果のアセンブリが出力されるだけであった。Visual Studioなどが提供するIDE機能の中には、入力補完、リファクタリング、参照の検索といった「コンパイラーそのもの、あるいはそれに類する機能」が必要とされるものがある。IDEの側で、これらの機能を追加したりコンパイラーのアップデートに追随したりするケースを考えると、ブラックボックスコンパイラーだけでは実現が難しく、正式なコンパイラーと同様の処理を推測し実装する必要があった。またこのような機能を持つツールはVisual Studioだけではなく、マイクロソフト以外のサードパーティの企業や、開発者個人が実装することもあり、機能をオープンにする要望が高まっていた。

そこでマイクロソフトは、一連のコンパイラー機能をコンパイラープラットフォームとして設計し直し、APIとして提供することを決めた。その結果、Compiler platform as a Serviceとして、リリースするに至った。Roslyn(ロズリン)はコードネームで、正式名称は「.NET Compiler Platform」になります。

Roslynの概要

Roslynのソースコードhttps://github.com/dotnet/roslyn から確認できます。
Roslynは、4つの APIレイヤー (Compiler API、Diagnostics API、Scripting API、Workspace API) で構成されています。そして、これらのAPIは複数のバイナリに分けられており、Microsoft.CodeAnalysisMicrosoft.CodeAnalysis.CSharpなどのNugetパッケージを通して配布しています。

Compiler API

コンパイルの一連の過程(パイプライン)の各プロセスを、APIとしてアクセスできるようにしたもの。
また、アセンブリ参照、コンパイラオプション、ソースコードファイルを含む、一回のコンパイルに必要な全情報のスナップショットも含まれています。

Diagnostics API

コンパイルエラーや警告をユーザーが追加できるように、APIとして提供するようにしたもの。

Scripting API

C#のコード片を評価し結果を返すAPIです。 C# 対話型 REPL (Read-Evaluate-Print Loop) ではこれらの API を使用します。 REPLを使用すると、C#スクリプト言語として使用し、記述時に対話形式でコードを実行できます。

Workspace API

Workspace API は、ソリューション、プロジェクト、ソースコードといった「コンパイル/コード解析などを行う単位」を扱うためのAPI。これらの単位は、Visual Studioで扱ってきたソリューションやプロジェクトなどと同じものであるが、APIとしてはVisual Studioに依存していない。ファイルの解析、オプションの構成、プロジェクト間の依存関係の管理の手間を省いてくれます。

Compiler API

前述の通り、Compiler APIコンパイル過程の全情報へのアクセスを可能にするAPIで、Roslynの4つのAPIレイヤーの中で最も重要です。

Roslynのコンパイルプロセスの4つのフェーズに分かれており、Compiler APIもこれらのフェーズに対応しています。

  • Parser: Syntax Trees APIが対応。ソースコードを入力として、字句解析および構文木の解釈を行う。IDEでは、フォーマットや色付け、アウトライン表示などがこのAPIを利用している。
  • Symbols、Metadata Import: Symbols API が対応。Parserが生成した構文木に加えて、参照している外部アセンブリからインポートしたメタデータから、シンボルを生成する。IDEでは、[Navigate to(移動)]や[オブジェクト ブラウザー]などが利用している。
  • Binder: Binding and Flow Analysis APIが対応。生成されたシンボルに識別子をバインディングする。[名前の変更]や[メソッドの抽出]が利用している。
  • IL Emitter: Emit APIが対応。ILとしてアセンブリを出力する。デバッグ時のEdit and Continue(エディットコンティニュー)機能が利用している。

まとめ

Roslynの登場により、ブラックボックスだった.NETのコンパイルプロセスがオープンになりました。
IDEにもたらした恩恵は言うまでもないですが、一般のユーザーにとっても、Analyzerの自作や構文解析の結果を利用したコードの自動生成が格段と簡単になりました。最終的にユーザーのコード品質とパフォーマンスの向上に繋がりました。
マイクロソフトに感謝。ではまた。