beta2時点での話だけど、Managed JScriptがダメすぎる

Silverlight beta 2 の開発で Managed JScript を使ってたりするものの、どうも 微妙というかダメダメな気がしてきた。

ということで、Managed JScript のダメなところをまとめてみた。

イベントハンドラを除去する事ができない

2008/10/02追記 Silverlight 2 RC0 + sdlsdk-0.4.0でこの不具合が修正されてるのを確認しました。

たぶんバグ。そして致命的。Managed JScript をがんばる気を無くしたのもこいつが原因。

Silverlightではイベントハンドラを追加するときは += 演算子を使う。

function handler(sender, eventArgs) { }
button.MouseClick += handler;

で、ハンドラを除去するときには -= 演算子を使うんだけど、こいつが動作しない。

function handler(sender, eventArgs) { }
button.MouseClick += handler;
button.MouseClick -= handler;  // 除去できない

フラグ管理でがんばれなくはないけど、なんかヤダ。
というのも、Silverlightでは描画は非同期で行われ、描画終了時に LayoutUpdated イベントが発生するアーキテクチャになっている。で、重い描画処理を分割して少しずつ描画させたいときは このイベントに1回だけしか呼ばれないハンドラをひっかけて、順々に描画させるようにするんだけど、これがフラグ管理になるとか考えると…。

モジュールとかインクルードとかそういう概念が存在しない

ここで言うモジュールは Silverlight 組込みのモジュールではなくて、ユーザライブラリ(外部スクリプト)の方。
IronPython は import、IronRuby は require で外部スクリプトを「普通に」ロードできるのに、Managed JScript にはそんな概念すら存在しないようだ。一応、Import() が用意されているのだが、Silverlight 組込みモジュールしかロードする事ができない。
LoadModule() / LoadModuleFromFile() で代用できなくはないのだが、これを使ってロードしたスクリプトは別の実行コンテキスト(別スコープ)で実行されてしまう。コンテキスト間で値の受け渡し(コンテキスト自身の受け渡しも含めて)は問題なく行えるのだが、無理やり感がどうしても漂ってくる。

デリゲートがサポートされていない

ドキュメントにはっきりと「JScript では、デリゲートは使用できません。」と書かれてる。将来的にもサポートする気なさそうな感じが…。

で、デリゲートがサポートされてないせいで System.Threading.Thread などの一部のAPIを使用する事ができない。まぁ、Thread に関して言えば、BackgroundWorker とかは使えるので、代替手段に困る事はそんなにないと思うが…。

で、まとめ

あまりに Managed JScript がしょんぼりなので、いい加減見切りをつけた。で、IronPython を評価してみたら、問題になっているところが全部解決できていい感じ。そんなわけで現在は Python をお勉強中。

少なくとも現時点の評価だけど、動的言語Silverlight やりたいような奇特な人は Managed JScript なんてダメなもん使わない方がいいよ。