Deep Insider の Tutor コーナー
>>  Deep Insider は本サイトからスピンオフした姉妹サイトです。よろしく! 
.NETエンジニアのための定期勉強会(Sansan主催)レポート

.NETエンジニアのための定期勉強会(Sansan主催)レポート

10分間で人に説明できるまで分かるCompiler as a Service“Roslyn”
― Grani×gloops×Sansan 3社合同 アニバーサリー企画 第5回 勉強会[3]―

2014年10月30日

Visual Studio “14”の新機能として搭載予定の次期コンパイラープラットフォーム“Roslyn”について、簡単に話せるレベルになるまで、ほんの少しだけ踏み込んで解説。

Sansan株式会社 渋木 宏明
  • このエントリーをはてなブックマークに追加

 .NETの最新技術を紹介する「.NET勉強会」が、8月末にGrani×gloops×Sansan 3社合同で開催されました。本稿では、そのセッション内容を詳しく紹介します。勉強会では、下記の4つのセッションがありました。

 本稿では、3のSansan株式会社の渋木宏明の熊家賢治による「Life with Roslyn #1 ~30分間で分かったツモリになる Compiler as a Service ~」のセッション内容をご紹介します。本レポートは、話した内容をそのまま書き起こした形式となります。

Sansan主催の「.NET勉強会」について

 Sansan株式会社は、スキルアップを目指す.NETエンジニアのための勉強会を定期的に開催しています。本稿は、アニバーサリー企画としてGrani×gloops×Sansanの3社合同で開催された第5回(開催:2014年8月30日、モデレーター:Sansan株式会社 藤倉成太)の内容をレポートしたものです。第5回では、株式会社グラニより田中孝佳氏、株式会社gloopsより山本昭宏氏をゲストに迎え、Sansan株式会社の渋木宏明、熊家賢治とともに、.NETの最新技術や活用状況に関するセッションを行いました。

Life with Roslyn ~30分間で分かったツモリになるCompiler as a Service~ ― Sansan株式会社 渋木 宏明

セッションスライド

 本セッションの目的は“Roslyn”の全体像について理解を深めることです。ゴールは、「紹介記事を読んだことがある」という状況の人が、ほんの少しだけ踏み込んで、Roslynについて簡単に話せるレベルになることです。

“Roslyn”の使命

――正式名称は「.NET Compiler Platform」

 “Roslyn”(ロズリン)はコードネームで、正式名称は「.NET Compiler Platform」になったようです(以下、本稿では「Roslyn」と表記)。

 Roslynの公式ホームページは、下記のリンク先のMSDN配下にあります。

 これまでは「Compiler as a Service」と言われていましたが、恐らく開発者向けカンファレンス「Build 2014」時に(=CodePlexへオープンソースとして公開された時)、この名称に変更されたと思われます。

 公式サイトでは、Roslynを次のように説明しています。

.NET コンパイラ プラットフォーム("Roslyn")は、オープンソースC#およびVisual Basicコンパイラと豊富なコード分析APIを備えています。MicrosoftがVisual Studioの実装に使用しているのと同じAPIを使用してコード分析ツールを構築できます

 例えば、Visual StudioのIntelliSenseや他社製のReSharperなどにおけるコード分析機能の実装は全く異なります。Roslynは、コード分析などの機能について、Microsoftが行った実装をMicrosoft以外にも公開するという目的を持ちます。

――Roslyn登場の背景(想像)

 Roslyn登場の背景については公式の情報がないため、独自の推測によるものです。

 最新版のRoslynは、2014年8月下旬に公開されたVisual Studio 14 CTP 3に含まれます。

 Microsoftでは、2009年ごろからRoslynのプロジェクトにつながる潜在的なニーズがあったようです。

 1つは、C#やVisual BasicのコンパイラーはVisual C++で書かれていると言われており、これをマネージ言語で書き直したいということ。もう1つは、コンパイラーの機能を部品化して、Visual Studioのエディターやリファクタリングツールの実装に利用したいということです。

 Roslynプロジェクト始動の決定的な引き金は、恐らくVisual Studio 2010の開発であったと思われます。

 Visual Studio 2010では、IDEのGUIがWPFベースになりました。そして、Visual Studioの拡張機能(VSIX)が、それまでのCOMではなく、マネージコードでの作成が推奨されるようになりました。

 そうなると、アンマネージ言語のVisual C++で書かれているコンパイラーの機能が部品化されていても、マネージコードからは使いにくくなります。そのうえ、Visual StudioやC#の拡張機能をより迅速にという要望が社内外から多く寄せられます。その結果、Roslynプロジェクトがスタートしたのではないかと想像しています。

――Roslynの使命とは何か?

 これは一言で言うと、「コンパイラーのプラットフォーム化」に尽きると思います。

 C#とVisual Basicのコンパイラーをマネージ言語で書き直したとしても、コンパイラーの開発が迅速化され、リリースのサイクルが早くなるかもしれませんが、それ以上の恩恵を受ける人はほとんどいません。
そのため、マネージ言語で書き直すに当たってコンパイラーの機能を部品化し、Microsoft内外に向けて公開することがRoslynの大きな使命であると感じています。

コンパイラーの基礎知識

――コンパイラーの役割

 Wikipediaでは、コンパイラーを次のように説明しています。

コンパイラ(compiler)とは、プログラミング言語で書かれた、プログラムのソースコード(原始コード)を、機械語、ないしバイトコードなどの中間言語によるオブジェクトコード(目的コード)に翻訳(変換)するプログラムである

 これを図で表すと、次のようになります。

図1 コンパイラーの役割

 ソースプログラムを受け取って、コンパイルという魔法の操作を加え、機械が実行できるプログラムを生成します。これがコンパイラーの役割です。

 では、コンパイルという過程では具体的に何が行われているのでしょうか。全てのコンパイラーがこうなっているわけではありませんが、共通的な処理は次のようになります。

図2 「コンパイル」の処理過程

 コンパイラーは、ソースプログラムが入力として与えられると、最初に字句解析を行い、プログラムのソースコードに含まれるトークン(=命令語)を抜き出します。

 続いて、構文解析により、人間が書いたテキストファイルであるプログラムのソースコードを、構文木というデータ構造に変換します。プログラムは、構文解析により、構文木と、構文木内で使われているクラス名や変数名から成る記号表(=シンボルテーブル)という形で辞書化されます。

 続いて、意味解析を行い、クラスライブラリやクラスの定義などを機械語に変化する準備を整えます。その後、コード最適化コード生成を経て、機械で解釈可能な形式、例えば.NETであればIL(中間言語)、Visual C++などでは機械語(LLVM)のコードに変換します。

Roslynのカタチ

――RoslynのAPI階層

 RoslynのAPIは3層構造になっています(図3)。

 一番下がCompiler API、次がWorkspaces API、最上位がFeatures APIです。

図3 RoslynのAPIは3層構造
図3 RoslynのAPIは3層構造

 基本になるのがCompiler APIです。上位の階層は下の階層の機能を呼び出すことで実装されています。

――Compiler API

 最下層のCompiler APIは、伝統的なコンパイラーの機能をAPIとして公開しています。

コンパイラーパイプライン

 Compiler APIの中でも基本となる部分です。

 コンパイラーパイプラインは、ソースコード解析、ソースコード生成、コード生成を行います。

 ソースコード解析では、入力されたソースコードを解析して、構文木、シンボル辞書、トークン情報などを生成する機能です。

 逆に、ソースコード生成では、ソースコード解析によって得られた情報からソースコードを生成します。これは通常のコンパイラーにはない機能です。

 例えば、リファクタリングツールは、人間が書いたソースコードを、プログラムで処理可能な構文木という形式に変換した後、この構文木を変形し、ソースコードに変換して出力します。つまり、ソースコード解析とソースコード生成の機能を備えていることで、その途中で変数名やクラス名などの付け直しといったリファクタリングを実行できるようになります。

 コード生成は、ソースコード解析で得られた構文木、シンボル辞書、トークン情報などからファイルを生成する機能です。

診断

 構文解析の過程でソースコードが間違っていた場合、エラーとして検出されます。検出されたエラーをRoslynの規定の形式で蓄積し、ユーザープログラムに公開する機能を提供しています。

 FxCopなどの静的解析ツールは、コンパイルエラー以外にもコードの不備を指摘してくれます。このようなユーザー定義の診断情報をRoslynの規定の形式で返すことで、Visual Studioの[エラー一覧]ウィンドウに出力したり、ユーザープログラムで取り出して活用したりできます。

スクリプティング

 スクリプティングに関しては、インタラクティブウィンドウ(=対話型でプログラムを実行できるREPLのこと)が例として紹介されています。例えばVisual Studioのインタラクティブウィンドウ(現実にはありません)にソースコードを入力すると、リアルタイムで実行されるという機能です。

 しかし現時点では、スクリプティング機能はレビュー中とされており、この機能が搭載されるかどうかは不明です。

――Workspaces API

 Workspaces APIは、コンパイラーの機能とはあまり関係がなく、Visual Studioで管理するソリューションやプロジェクトを扱う機能を提供します。ただし、Visual StudioのIDEとは依存関係はありません。

 従来、Microsoftは、例えば、Visual Studio環境でRoslynを使うときに、ソリューションやプロジェクトの内容を参照して処理を実行できるという形で開発するのが定番でした。Roslynではその関係が逆転しており、Visual Studioとは無関係な形でソリューションやプロジェクトを扱う機能を備えています。

 Workspaces APIでは、Workspaceというオブジェクトモデルを扱います。このWorkspaceオブジェクトは、IDEやユーザーアプリケーションが現在扱っているソリューション(.slnファイル)と関連付けるためのモデルです。

 Roslynでは、SolutionProjectDocumentというオブジェクトモデルを、現在扱っているソリューション、およびそこに属するプロジェクトやドキュメントのスナップショットとして、Workspaceオブジェクトから生成して処理を進めます。SolutionProjectDocumentオブジェクトは、イミュータブル(immutable:オブジェクト生成後は変更されないということ)であるため、生成後にWorkspaceオブジェクトに変更が加えられてもその変更が反映されません。

――Features API

 最上位のFeatures APIは、リファクタリング、コードの補完、ナビゲーション(F12キーによるキーワード検索など)といった機能を提供します。

 これらの機能は、1つのソースコードではなく、ソリューションに登録されているプロジェクトや、プロジェクトに登録されているドキュメントに対して横断的に動作します。そのために、Features APIは、ソリューションやプロジェクトを扱うためのWorkspaces APIの機能を利用します。

――Roslynが提供するモデルの特徴

 Roslynが提供するSyntaxTreeオブジェクト(=構文木)やWorkspaceオブジェクトなどのモデルは、一貫してイミュータブルです。例えば、ソースコード解析で構文木が作られると、それをプログラムで変更できません。そのため、リファクタリング機能などを開発する場合には、生成された構文木を基にカスタムの構文木を別途作らなければならないといった点が少し面倒です。

 モデルをイミュータブルにしているのは、「Roslynを利用するアプリケーションに変更があっても、Roslynの処理が正常に実行されるようにしたい」というニーズによるものと推測されます。

まとめ

 Roslynの使命はコンパイラーのプラットフォーム化にあります。

 Roslyn(正式名称:.NET Compiler Platform)は、3層から成るAPIを公開しています。Roslynが公開するAPIを利用することで、ソースコードを扱うツールやアプリケーションの開発を強力に支援できます。

 Roslynを利用すれば、独自の言語拡張を実装することも可能ですが、そこに関しては現時点ではほとんどサポートがないというのが現実です。.NETではNuGetでライブラリを簡単に利用できますが、同様に言語拡張をプロジェクト単位で注入できると楽しいのではと思っています。

参考リソース

 製品ページにはほとんど情報がないため、基本的にはCodePlexを参照してください。

 最新版のRoslynを体験したい場合は、(執筆時点で最新の)Visual Studio “14” CTP3をダウンロードして使ってみるのが近道です。Roslynのプロジェクトテンプレートも利用できます。

 コンソールアプリケーションで、ソースコードを扱うプログラムを試してみたい場合には、NuGet GalleryからRoslynのアセンブリをダウンロードして自分のプロジェクトに追加すると、Roslynの機能を使ったアプリケーションを作成できます。

 CodePlexで「Language feature implementation status」というページを見ると、C# 6.0で導入を予定されている機能のステータスの一覧を参照できます。

 次回は、株式会社グラニの田中孝佳による「2014年版C#でできること」のセッション内容をご紹介します。

※以下では、本稿の前後を合わせて5回分(第1回~第5回)のみ表示しています。
 連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。

.NETエンジニアのための定期勉強会(Sansan主催)レポート
1. .NET最新技術「ASP.NET Identity」とは?

ASP.NETの資格管理技術がどう進化して、最新のASP.NET Identityが生まれたのか紹介。また、その特徴と機能、構成、処理の流れなどを解説する。

.NETエンジニアのための定期勉強会(Sansan主催)レポート
2. 【現在、表示中】≫ 10分間で人に説明できるまで分かるCompiler as a Service“Roslyn”

Visual Studio “14”の新機能として搭載予定の次期コンパイラープラットフォーム“Roslyn”について、簡単に話せるレベルになるまで、ほんの少しだけ踏み込んで解説。

.NETエンジニアのための定期勉強会(Sansan主催)レポート
3. C#&.NETの進化と、次期版でできること(2014年版)

さまざまなプラットフォーム向けのプログラムを開発できるまでに進化してきたC#。その内容と特徴を、プラットフォームごとにまとめる。また今後のC#/.NETがどのように進化するかも紹介する。

.NETエンジニアのための定期勉強会(Sansan主催)レポート
4. 破壊的に進化する.NET技術のトレンド変化に立ち向かう

数年で根本から大きく変更される.NET技術。そんなトレンド変化に追随するにはどうすればよいのか? gloopsで実践されている手法を具体的に説明する。

.NETエンジニアのための定期勉強会(Sansan主催)レポート
5. Xamarinで今日から始めるクロスプラットフォーム開発

クロスプラットフォームアプリ開発の戦略についてまとめ、Xamarinによるアプリ開発の特徴を説明する。また、Xamarinに関する情報収集や、Xamarin.Forms×MVVMによる開発のポイントを紹介する。

サイトからのお知らせ

Twitterでつぶやこう!