BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース .NETと動的言語

.NETと動的言語

数ヶ月後、もしくは数年後には、動的言語は.NETプラットフォームにおいて重要な役割を担うようになるだろう。このサポートのために、Microsoftは動的言語とCLRの統合に多大な投資を行っている。

この統合がどのようになされるかについて踏み込む前に、オープンソースについて時間をとって議論する必要がある。.NETプラットフォームのもっとも重要な動的言語はIronPythonとIronRubyだ。どちらもオープンソースライセンスに基づいており、それらは言語の変更に対して通常のスケジュールには従わないだろう。というのも、Microsoftが公式にサポートを表明しているオープンソースな言語はどれも、二つのリリースサイクルを持っている。アーリー(早期)リリースはオープンソースプロジェクトに一般的に計画されるもので、多くはキャンペーンのためにある。それと並行して正式で、十分にテストされたリリースがあり、Microsoftが望むのはこちらのリリースである。企業や開発者は、どちらのスタイルのリリースを使うかを選ぶことができ、どちらも同じコードベースを使っている。
 

統合に関しては、すべてはIDynamicObjectインターフェースを中心に回っている。これはメソッドバインダーの役割を果たし、オブジェクトがそれぞれの言語のセマンティクスを使えるようにするものだ。最初からこのバインダーを持つ言語は、IronPython、IronRuby、JScript、そしてCOMがある。そう、COMは遅延バインディングと動的なメソッド呼び出しを持つことから、動的言語とみなされている。

言語固有のバインダーに加え、開発者は単一のクラスのためだけの特別なルールを用意することができる。これのもっとも簡単な方法は、抽象クラスDynamicObjectから始めることだ。下にあるリストは、カスタムの振る舞いをさせるためにオーバーライド可能なアクションの一覧である。見るとわかるが、いくつかのアクションは明らかにあなたが選んだ言語の構文で直接サポートしていないのがわかるだろう。
 

  • GetMember
  • SetMember
  • DeleteMember
  • UnaryOperation
  • BinaryOperation
  • Convert
  • InvokeMember
  • Invoke
  • CreateInstance
  • GetIndex
  • SetIndex
  • DeleteIndex

開発者はこれらのメソッドすべてを実装する必要はない。たとえば、プロパティの入れ物を作るだけならSetMemberと GetMemberを使って簡単にできるだろう。またこれによって、もちろんそのための設計なのであるが、どんな言語でも、C#のような静的型付け言語であっても、真に動的なクラスを書くことができる。
 

もともとIronPythonは自身の言語固有の抽象構文木を持っていた。DLRの取り組みの中で、それぞれの言語の違いは実際にはとても小さいことだということがわかった。最終的には、LINQのExpression Tree(式木)が、あらゆる動的言語を表現するのに必要なほとんどのものを持っていることを見つけ出した。

欠けている機能は(それらは.NET4で追加される予定であるが)、割り当てと、制御フロー(繰り返しとgoto)、そしてノードの動的ディスパッチである。ノードの動的ディスパッチは、言語に固有であり、メソッド呼び出しとオーバーロードの解決のための言語固有のルールを支えるために使われる。

言語固有のセマンティクスの例として、20億×2の結果を見てみよう。Expression TreeがIronRubyやIronPythonのセマンティクスをサポートするなら、これは40億を返すだろう。C#のデフォルトのセマンティクスを使うと、オーバーフローを起こすし、VBなら例外を返すはずだ。この不思議なことがなぜ起こるかというと、IronRubyとIronPythonではオーバーフローが起きそうになるとInt32からBigIntegerへ自動的にフィールドを昇格させるからである。
 

性能を改善するために、DLRは新しいコールサイト(call site)メカニズムを使用するようになった。DLRでのコールサイトは、動的な呼び出しをデリゲートに基づく静的に型付けされた表現にしている。デリゲートは生成のコストが小さくないため、一つのリストにキャッシュされる。各呼び出しごとにマッチするものが見つかるまでリストが操作され、これまで出てこなかった型については、その型の共有の抽象構文木に基づく新しいデリゲートが追加される。

引数の型が既知のものかどうかを決定するために、それぞれの言語でMetaObjectを提供する必要がある。これはその引数の型が過去に見たものとマッチするかどうかをチェックし、マッチするなら何をすべきかを知るオブジェクトだ。

新しいMetaObjectを作ることができれば、開発者は名前をベースにした、呼ばれたメソッドの実際のExpression Treeを使って検索する、高価なハッシュテーブルの置き換えが可能になる。書き方によっては、静的な世界のものをしのぐ性能を出すことさえできるだろう。

原文はこちらです:http://www.infoq.com/news/2008/10/DLR-NET4

この記事に星をつける

おすすめ度
スタイル

BT