グロサミの最終日に Roslyn のハッカソンがあったので、午前中にちょっとだけ参加してきました。午前中だけなので、何をやるという訳でもなく、ざっくりと Roslyn Syntax Visualizer の解説を受けて、その後なにがしかの演習っぽいものをやるわけですが、いやいや、その前で抜けているので、ピザ食べて午後あたりになったときにどうなっているのかは分かりません。MS Store 行ってキーボードを買ってきて、お昼を食べて帰ってきて覗いてみたら、なんかまったりと Roslyn をインストールする感じだったので、駄弁るって感じだったんですかね?ハッカソンというものに出たことがないので、雰囲気だけ。
そんな中で、今岡さん(@imaoca)に力説した「Roslynは組み込みにも役に立つかもしれへんでー」という根拠をちらちらと書き散らしていきます。多少、希望的観測も入っているので実現が難しいところがあるかもしれませんが。
そもそも Roslyn ってどうやって使うの?
.NET コンパイラ プラットフォーム (“Roslyn”)
http://msdn.microsoft.com/ja-jp/vstudio/roslyn.aspx
Visual Studio “14”の新機能“Roslyn”とは – Build Insider
http://www.buildinsider.net/enterprise/roslyn/01
.NET Compiler Platform (“Roslyn”) – Home
https://roslyn.codeplex.com/
Roslyn が何か?ってのは、いくつかのブログで読めるので飛ばしてしまって、まずはインストールして使える状態にします。最後の https://roslyn.codeplex.com/ なところから、 Build tools that understand C# and Visual Basic な手順を順々に入れていけば OK です。
- Set up a box with Visual Studio “14” CTP 4. Either…
- Install Visual Studio “14” CTP 4, or…
- Grab a prebuilt Azure VM image.
- Install the Visual Studio “14” SDK. You’ll need to do this even if you’re using the Azure VM image.
- Install the SDK Templates VSIX package to get the Visual Studio project templates.
- Install the Syntax Visualizer VSIX package to get a Syntax Visualizer tool window to help explore the syntax trees you’ll be analyzing.
Azure 上には Visual Studio 14 導入済みのものがあるので、それに 3,4 の VSIX をインストールします。そうすると、ファイルオープンなところに「Roslyn」カテゴリが増えるのと、
View → Other Windows → Roslyn Syntax Visualiser なメニューを選択すると、
CodeDOM が見れるようになります。
これをもとに、既存の言語に機能追加をしたり、解釈を変えたりするわけです。C# 自体の新機能も含まれているのですが、C#、VB のような特定言語よりも「コンパイラ」自体に興味がある人は、この機能が公開されて利用できる、ってところに注目します。つーか、私から見た目玉機能はこれですね。
構文木を作る lex/yacc
Roslyn の詳細な API はともかくとして、オープンソースなコンパイラであれば、gcc でもよいし、ruby でも python でも良いわけで F# だってソースが公開されています。gcc のコンパイラそのものを弄ることは少ないけど吐き出される as コードを見て C 言語レベルで最適化をかけたり(部分的にアセンブラを使うとか)するわけで、コンパイラがオープンソースになったところで、あまりインパクトは大きくありません。
IL に落とすという意味でも、そこまで突っ込むことは少ないし、そもそも C# や VB の文法をローカルに変えてまでやるぐらいであれば、別の言語を読み込ませるたり、F# のコンピテーション式のように DSL を埋め込んだりしても良いのです。また、C/C++ で適当なマクロを作れば、大抵のアセンブラ的なコード(行単位の命令コードの羅列)は書けます。別言語になってしまうという難点はありますが、ライブラリとして独立さればよい話で、混乱するような形になるならば、汎用的に作らずとも、R言語のように統計に特化させても良いのです。
そんなプログラム言語単体の話よりも(リファクタリング等の機能もあるのでしょうが)、Visual Studio という IDE の機能を Roslyn により使えるというところに私は注目したいのです。構文木(Syntax Tree)を扱う時に、内部的には CodeDOM のようなスタイルになっているのでしょう。なので、このスタイルに則ってコンパイラを書けば、そのまま Visual Studio の機能が使える…と思います。おそらく、F# は対応されるだろうから、そのあたりで Roslyn の実力を見てっところなんでしょうが。
懸念点と言えば、現在 C#/VB しか対応していないところから、C#/VB に似た言語スタイルでないと Roslyn の API は使えないのか?という点です。たとえば、LISP を Roslyn で通して、Visual Studio で編集できるようになるだろうか?とか、PHP や Perl のようなスクリプト言語の場合はどうなるのだろうかとか。Ruby や Python のほうは、オブジェクト指向言語だし過去に IronRuby な形で編集できるようにもなっているので、導入は比較的楽かもしれませんが。
また、既存の複雑な言語でなくても、ちょっとした DSL を自前で作っておいて、Roslyn に対応させておけば、Visual Studio で編集ができる(補完機能とかサジェッションみないな機能とか)可能せがあります。そうなると、自前でちまちまと専用エディタを作る必要もなくなるし、読み込ませ方によっては結構面倒な JSON や XML 形式で書きつけなくてもよい、ってことになりますよね(まあ、適当なスキーマを作れば JSON のほうが便利ってのもありますが)。
そういう訳で、 Roslyn が扱う CodeDOM(かな?)に直しさえすれば、Syntax Tree から派生する機能が使えるのではないか?と想像できます。
組み込み言語と Roslyn の関係
.NET Micro Framework の場合、C# が使えるから、そのまま Roslyn の機能が使えます。IL に落とす段階や、プラットフォーム毎の .NET のバージョンの違いなどは、Windows 10 で改良されるので(Microsoft.NET とか One.NET とかいうスタイルで)、C# で書いておけば組み込み機器でも動作する、というパターンにはできそうです。
現在、.NET MF は x86 と ARM しか対応していないわけですが、将来的に(過去的にも)マイコン系の CPU に対応させたり、あるいは各種の C言語コンパイラを Roslyn スタイルに直すことで、Visual Studio 上でビルドをすることも可能では?と思っています。あるいは C# でコンパイルしたものを IL に直し、IL 自体を独自の C ライブラリに直すとか、あるいは C# で書いた後に、独自 CPU に対応した IL(内部的には C言語コール)に直してしまうとか。これもローカルな言語を Visual Studio で動かせるようになれば、組み込み言語自体のコーディング速度も変わってくるはずです。まあ、最初のターゲットとしては Arduino 用の C 言語を Visual Studio 上でビルドできる、ってのが理想的ですよね。今でも専用エディタが付いているし、.NET MF を使えば C# で書けるのですが、うまくエディタと IDE が独立に動作して、かつ、コード分析レベルでは同期することができれば、そういうことも可能でしょう。かつて CodeWarrior が、多言語の開発環境を担っていましたが、あれと同じスタイルになると良いです。まあ、それでも Visual Studio で、ひとつのソリューションに複数の言語を入れて開発することができるので、かなり実現されているわけですが。
そんな訳で、ちらちらと Roslyn の中身を眺めなければ。