SilverlightとDLR(Dynamic Language Runtime)
SilverlightではDLR上でPythonやRuby、JScriptといった言語での開発をサポートしています。本項では、SilverlightにおけるDLRが業務アプリケーションにどのように役立つのかを調べていきたいと思います。
DLRとは
DLR(Dynamic Language Runtime)とは、.NET Frameworkで動的言語を動作させるための実行基盤です。DLRによって、各動的言語間の型を一貫して提供することで、動的言語間やC#やVisual Basicと言ったCLR(Common Language Runtime)の言語間の会話を可能とします。現在サポートされている動的言語はIronPython、IronRuby、Managed JScriptの3つですが、DLRの登場で.NET Framework上で動的言語を作りやすくする環境が整備されたということになります。
SilverlightとDLRの関係
DLRは図2のように、.NET Frameworkや.NET Framework for Silverlightの上に実装され、コンソールアプリケーションやASP.NET、Silverlightといった環境にホストされます。
つまり、DLR上に構築された動的言語を使用すれば、コンソールアプリケーション、ASP.NET、Silverlightといったアプリケーションで動的言語を使用したり、C#やVisual Basicといった言語から、動的言語で実装された機能を呼び出すことが可能になるのです。
また、Silverlightでは、後述するHTML DOMとの統合機能によってSilverlightからクライアントのHTMLを操作することが可能なため、JavaScriptの代わりに動的言語を使用してHTMLの操作を行うことも可能になっています。
SilverlightでDLR対応言語を使用するためには
SilverlightでDLRを使用するためには、CodePlexで提供されているSilverlight Dynamic Languages SDKを使ってプログラミングを行う必要があります。
このSDKには、SilverlightでIronPythonやIronRuby、JScriptといった言語を動作させるためのdllと、各言語でSilverlightアプリケーションを作成するためのテンプレート、xapファイルの作成コマンドといった物が含まれます。
使い方については、同梱されているReadme.txtを確認してください。
動的言語を使うメリット
.NET Framework上で動的言語を使用できるとして、業務アプリケーションを開発する際のメリットはどのような物があるでしょうか。
筆者は動的言語を使うことで次のようなメリットがあると考えています。
- 動的言語の開発経験をそのままSilverlightで使用することが可能
- 動的言語を「のりしろ」的な役割で使用することで柔軟な対応が可能
1つ目の利点については説明は不要でしょう。DLRでは、現在正式にサポートされているIronRubyやIronPython、JScriptに加えLispやScalaといった動的言語の開発も進められています。SilverlightとDLRの組み合わせを使用することで、開発者は好きな言語を選んでアプリケーションの開発が可能となります。
2つ目の利点については、少し説明が必要でしょうか。
DLR上に作成されたアプリケーションは、CLRから動的に呼び出して実行することができます。つまり、C#やVisual Basicといった言語からIronPythonやIronRubyで作成されたスクリプトを読み出して実行することができるということです。
この特性を利用して、ユーザーから頻繁に仕様変更が予想される部分や、手軽に変更を行いたい部分を動的言語で実装し、C#やVisual Basicから呼び出します。動的言語を動的な部分と静的な部分をつなぐ「のりしろ」として使用するのです。
リスト9はC#から動的にPythonのコードを実行している例です。
var pythonCode = "1 + 2"; // 1.動的言語の設定 var languageSetup = new LanguageSetup( "IronPython.Runtime.PythonContext, IronPython, " + "Version=2.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "IronPython 2.0", new string[] { "IronPython", "Python", "py" }, new string[] { ".py" } ); var scriptSetup = new ScriptRuntimeSetup(); scriptSetup.DebugMode = true; scriptSetup.LanguageSetups.Add(languageSetup); // 2.動的言語のエンジンを取得 var runtime = new ScriptRuntime(scriptSetup); var scope = runtime.CreateScope(); var engine = runtime.GetEngine("py"); // 3.コードの実行 var sum = engine.Execute(pythonCode, scope);
動的言語をC#などから呼び出す場合は、次の手順で動的言語を読み込む必要があります。
- 動的言語の設定
- 動的言語のエンジンを取得
- コードの実行
例えばコード中の pythonCode は IronPython のソースコードを格納した文字列です。プログラム中でソースコードをサーバーからダウンロードして実行することで、C# や Visual Basic で記述された既存のSilverlightプログラムをコンパイルすることなく動作を変更することもできますし、Excelの計算式のようにユーザーにプログラムの動作を定義してもらうといった使い方もできます。
C#やVisual Basicで業務アプリケーションを作成している場合は、C#やVisual Basicといった強い型付け言語をメインにプログラムを作成し、動的に変更したい一部を動的言語で作成するというシナリオが思い浮かびます。
SilverlightとHTML DOMの連携
Silverlightでは、SilverlightをホストしているHTMLの要素を操作したり、HTML(JavaScript)からSilverlightの要素を操作することができます。つまりJavaScriptの代わりにPythonやRubyといった言語からSilverlightを通じてHTML DOMを操作することもできるということです。
少し例を見てみましょう。リスト10はSilverlight Dynamic Languages SDKに含まれるslコマンドで生成したHTMLに、textBox1とbutton1というオブジェクトを追加した例です。
<html xmlns="http://www.w3.org/1999/xhtml" > <head> <title>Silverlight Template</title> 略 </head> <body> <input type="text" id="textBox1" /> <input type="button" id="button1" /> 略 <object data="data:application/x-silverlight," type="application/x-silverlight-2" width="100%" height="100%"> <param name="source" value="python.xap"/> 略 </body> </html>
HTMLがロードされたときに、textBox1にメッセージを表示し、ボタンがクリックされたときにメッセージボックスを表示するコードをIronPythonを使って作成したいと思います。コードの例はリスト11のようになります。
from System.Windows import Application from System import EventHandler from System.Windows.Browser import HtmlPage from System.Windows.Browser.HtmlPage import Document def Button1_Click(sender, event): HtmlPage.Window.Alert("ボタンクリック"); class App: def __init__(self): Document.textBox1.value = "Hello Python"; handler = EventHandler(Button1_Click) Document.Button1.AttachEvent("onclick", handler) App()
Silverlightでは、System.Windows.Browser名前空間のクラスを使うことでHTML DOMにアクセスすることができます。IronPythonの初期化処理ではtextBox1にHello Pythonという文字列を表示し、ボタンがクリックされたときにメッセージボックスを表示するため、Button1_Clickというイベントハンドラが呼び出されるように設定します。
まとめ
こうみると、インタラクティブな要素以外にも、現在の業務アプリケーションを作成する上で必須と言える機能が多く含まれる開発基盤としてSilverlightは大きな役割を持っていることが分かります。
特に大きいのは、C#やVisual BasicといったCLRの言語を使用してアプリケーションを作成することでCLRによるコンパイル時の型解決の恩恵を享受しつつ、動的言語との連携で柔軟にアプリケーションの動作を変更できるということです。
ぜひ一度Silverlightによるアプリケーションの開発を試してみてください。その開発生産性の高さに驚くかもしれませんよ。