[dlr]OSC2007でお見せしたデモ内容について

オープンソースカンファレンス 2007 Tokyo/Fall でお見せしたデモ内容は、以下のようなものです。

  1. IronPythonにおける Pythonデータ型と.NET データ型のシームレスな統合
    IronPythonでサウンドを鳴らす。
  2. DLR Consoleを使って、IronPythonの関数とManaged JScriptの関数の相互利用(共有オブジェクト)
  3. IronRubyで使って、Windows Fromsを使う。IronRubyへ追加した独自モジュールの使い方。
  4. IronPythonからRubyスクリプト(Windows Formsのサンプル)を読み込んで、Windows Formsのインスタンスを操作する

1.Pythonデータ型と.NETデータ型のシームレスな統合
 IronPython起動直後は、Python互換モードで起動されます。例えば文字列を定義するとそのデータ型はpythonの「str」型となります。このためstr型が提供されるstrip()メソッドなどを利用することができます。この状態で「import clr」によってclrモジュールを読み込むと文字列のデータ型がpythonの「str」型に「System.String」の型の特徴が付与されます。このためpythonのstrip()メソッドに相当する.NETのTrim()メソッドも使用できるようになります。このようにデータ型を.NETの型へのシームレスに移行させるのもclrモジュールの役割の一つです。このような実装方法になった理由は、コミュニティからのフィードバックによるものです。Python互換を標準状態が良いというコミュニティの意見を尊重した結果です。

2.DLR Consoleでの複数言語間のオブジェクト共有
 言語にPythonを選択して、以下のような関数を作成しました。

 def pyfunc(a):
  return a + ' by IPY'

 この関数をPythonから呼べるのは当たり前として、言語をJScriptに切り替えてpyfuncを呼び出してみました。次に、JScriptで以下のような関数を作成しました。

 function jsfunc(a)
{ return a + " by JScript"; }

このJScriptで定義した関数を言語をPythonに切り替えて呼び出してみました。DLR Console上では、PythonとJScript間で言語に依存しないで関数を共有できることをお見せしました。これが共有オブジェクトの機能です。

3.IronRubyからWindows Formsを使用する
 RubyForgeに公開されているIronRubyの実装では、.NETのアセンブリを読み込むのに「require 'アセンブリ識別子'」を指定する必要があります。このためwinforms.rbというスクリプトの中に「require 'System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'」という記述をしていることを説明し、「hellowinform.rb」というスクリプトの中でWindows Formsのインスタンスを作成しています。イベントハンドラについては、以下のように記述していることを説明しました。

 my_button.Click do |sender, args|
   # Labelコントロールを作成
   my_message = Forms::Label.new
   my_message.Text = 'Welcome to IronRuby!'
   my_message.AutoSize = true

   # Label を追加する
   my_flp.Controls.Add(my_message)
end

イベントハンドラをブロックで記述する方法であるということです。そして、現在のソースツリーの中に「IronRuby.Libraries」という独自モジュールを作成するプロジェクトが用意されておりサンプルのモジュールがある点を説明しました。この独自モジュールを利用するには、「require 'IronRuby.Libraries, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null']として、「Sample.hello」でメソッドを呼び出せることを説明しました。

4.IronPythonからRubyスクリプトを使用する
 IronPythonからIronRubyで使用した「hellowinform.rb」スクリプトを使用したサンプルということで、以下のようなコードを記述しました。

 import clr
r = clr.Use('hellowinform.rb', 'rb')

これでサンプルのWindows FormsがIronRubyランタイムを使ってIronPythonで表示されました。後は、r.my_formのようにIronRuby側で作成したインスタンスをIronPython側で操作するところをお見せしました。

DLRという共有オブジェクト(DynamicType)でうまく表現できるオブジェクトであれば、言語に依存しないオブジェクト共有が実現できます。その反面、言語実装者がDLRのDynamicTypeにオブジェクトをうまくマップできなければオブジェクトの共有はできないことになります。事実、IronRubyの現在の実装ではメソッド定義は、IronRubyのRuntimeFlowControlオブジェクトとしてIronPython側には公開されます。このためにIronPythonからIronRubyのメソッドは呼び出せないという状態です。

 オブジェクト共有を実現できるかどうかは、言語実装者次第であるということです。DLR自体は、動的言語向けのインフラを提供するだけです。このため全ての言語に向けた全ての機能事態を盛り込むことは不可能なことでしょう。もし貴方が言語実装を考えていて、このような機能が欲しいと考えたなら、IronPythonチームにぜひフィードバックをしてください。大勢の方の要望があれば、きっと機能として盛り込まれると思います。何故なら、コミュニティのフィードバックを大事にしながら開発を続けてきたのがIronPythonチームだからです。