Archive | 08:10

スクリプティング

15 12月

RoslynがNuGet配布されましたね。

 

ということで、本日は予定を変更して、スクリプト エンジンとNuGetの話をしましょうか。

元の予定が何だったのかは秘密♪

 

今日のサンプル コード: CsharpScriptingSample.cs

NuGet

NuGetは、オープン ソースなライブラリを簡単に使うための仕組みです。

  • NuGet gallery: オープン ソース ライブラリを公開するための公式サービスです。
  • NuGet Package Manager: Visual Studioの拡張で、NuGet galleryで公開されているライブラリをお手軽検索&インストールするためのツールです。

NuGet Package Manager自体のインストールもお手軽で、Visual Studio 2010をお持ちの方は、拡張機能マネージャーを立ち上げて、「nuget」で検索してみてください。

ただし、拡張機能マネージャーは基本的にProfessional以上のグレード(有償)の機能です。しかし抜け道もあって、以下のいずれかを使えば、無償版でも拡張機能マネージャーを(そしてNuGetも)利用できます。

 

.NET用スクリプト エンジン

Roslynの前に少々寄り道しましょうか。.NET用のスクリプト エンジンと言えば、IronPythonに代用される、DLR(dynamic language runtime: 動的言語ランタイム)スクリプト。IronPythonIronRubyIronJSがNuGet経由でインストールできたりします。

ひゃっはー!さっそくインストールだーっ!

プロジェクトの「参照設定」を右クリックして、「Manage NuGet Packages…」を選択します。

すると、NuGet Package Managerが立ち上がりますが、右上に検索ボックスがあるので、「iron」で検索しましょう。

 

ここでは、とりあえず、IronPythonを使ってみましょう。検索結果の中から、IronPythonを選んでダブル クリックすればOKです。

ちなみに、IronRubyとIronPythonで、参照しているDLRのバージョンが違ったりするので、同時にインストールするとビルドに失敗したりします。ご注意を。

IronPythonを使ってみよう

インストールさえしてしまえばあとは簡単。以下のようなコードで、PythonコードをC#プログラム中で実行できます。

var engine = IronPython.Hosting.Python.CreateEngine();
var code = @”
data = (1, 2, 3, 4, 5)
q = (x * x for x in data)
sum(q)
;

var x = engine.Execute<int>(code);
Console.WriteLine(x);

var f = engine.Execute<Func<doubledouble>>(@”
from math import *
lambda x: sin(x * x)
);
Console.WriteLine(f(10));

Pythonのラムダ式からFuncデリゲートへのキャストまでしてくれるみたいです。

Roslyn

さて、本日のメインディッシュ、Roslynです。

Roslynとは

Roslyn(コードネームです。マイクロソフトのプレビュー製品のコードネームはだいたいどこかの地名だったり)は、C#コンパイラーの中身をライブラリ公開するものです。次の次(C# 6.0?今のペースだと、2014年頃正式版?)での導入を目指して開発が進んでいます。以下のものを含んでいます。

  • Visual Studio拡張を作るためのプロジェクト テンプレート
    • C#エディター上で、リアルタイムで警告したり、右クリック メニューでリファクタリング機能を提供したり
  • C#/VBコンパイラー
    • C#/VBコードをコンパイルする際の、中間結果を含めていろいろ中をのぞけます
      • 構文解析結果の式ツリー
      • 意味解析結果の、エラーの一覧や、変数の依存関係
  • C#スクリプティング
    • C#をスクリプト言語として使うためのエンジン
    • DLR準拠(使い勝手がほぼ同じというか、サブセット)

 

NuGet経由でインストールできるのは、下の2つです。Visual Studio拡張は、Roslyn本体をインストールする必要があります(Visual Studio拡張に関しては、Visual Studio自身に手を入れる必要がありますが、残りは単なるライブラリです)。

ちなみに、かなりの早期プレビュー版なので、C#の文法のうち、まだ実装されていないものが結構あります。

Roslynを使ってみよう

あとは、IronPythonの時とほとんど同じです。C#スクリプティングは、Roslyn.Scripting.CSharp名前空間にあります(最終的にはSystem名前空間?それとも、Microsoft名前空間?)。

var engine = new Roslyn.Scripting.CSharp.ScriptEngine(
    references: new[] { “System”“System.Core” });
var code = @”
using System.Linq;
var data = new int[] { 1, 2, 3, 4, 5 };
var q = data.Select(x => x * x);
q.Sum()
;

var x = engine.Execute<int>(code);
Console.WriteLine(x);

var f = engine.Execute<Func<doubledouble>>(@”
using System.Math;
x => Sin(x * x)
);
Console.WriteLine(f(10));

ScriptEngineの作り方が少し違う(直接newするのと、参照するアセンブリを引数で指定する)くらいで、残りは同じです。

ラムダ式に対してちゃんと型推論が働いている(x => Sin(x * x) だけでFunc<double, double> 扱いされてる)のはありがたいですねぇ。

あと、地味に、スクリプト専用の文法が入っていたりします。静的クラス(この例ではMathクラス)をusingすることで、静的メソッド(Sinメソッド)を直接書けるようになります。

まとめ

NuGet galleryに入ったことで、誰でもかなりお手軽に「C#スクリプト」を使えるようになりました。

Roslynの本領はVisual Studio拡張の方にあったりする上に、まだまだプレビュー版なので、実は結構「おもちゃ」感あったりしますが。今から慣れ親しんでおけば、数年後に何かが花開くかも!