クラス定義

やはりPnuts 1.2にはクラス定義も盛り込もうと思う。使い方は2とおりあって、普通にスクリプトからクラスを定義する方式と、Javaみたいにファイルとして置いておいてclassloaderに読ませる方式。
前者はクラスを定義するたびに新しいclassloaderを使う( http://opensvn.csie.org/Pnuts/1.2 は何となく動く状態)。後者はロードされる直前にコンパイルする。実現すれば、これまでのフィードバックの大半に対応したことになる。今週中に何とかしたい。

Pnuts1.2新機能

Pnuts 1.2で追加する新機能の検討を始めた。

  • 多重代入 x, y = [1, 2]
  • for文の変数も複数可能に for (x, y: map){ ... }
  • 無名関数のためのコンパクトな記法 {x -> x * x}
  • 配列とCollectionの自動変換
  • クラス定義関係の追加は無し

機能を絞って、さっさとリリースしてしまおう。よいアイデアがあれば教えて下さい。

Java-pluginのActiveXブリッジ

pnuts.tools.PnutsAppletを少し修正して、AppletオブジェクトをContextローカル変数から取り出せるようにして、ユーザのセキュリティポリシーをAllPermissionにしておけば、IEで動いているPnutsアプレットの中からそのページのDHTMLオブジェクトにアクセスできるようです。実際にやってみたら、AJaxでよくやるようにinnerHTMLの値をPnutsを使って置き換えることはできました。ただ、今のJava-pluginには、ページ遷移のイベントを拾う仕組みはあるけど、DOMノードに対してイベントハンドラを登録するための仕組みはなさそうです。JacobだとイベントハンドラJavaで書けるようになっているけど、それと同じことができれば、onclickハンドラ等をJavaで書くことができるでしょう。

そういえば、Jacobのバージョンが上がっていて、win32com.jacobモジュールがコンパイルに失敗するようになっていました。後で修正します。

Client Side Java

よくできたAjaxアプリを見慣れてくると、ブラウザで動くスクリプトとしてJavaScript以外の仕組みを使うことはあまり思いつかないかもしれません。ただ、Webアプリケーションの基盤の一部として長い目で見た場合に、いくつか改善の余地があることに気がつきます。

  • Javaの場合はsandboxの制限を緩めてローカルリソースにアクセスできますが、JavaScriptでは(独自拡張しないかぎり)できません。
  • アプリケーションが大規模になってくると、JavaScriptのコードの量が当然多くなります。しかも、プログラムをバイトコードでなくテキストで HTTP/GET し、クライアントサイドのJavaScriptインタープリタで毎回構文解析をして実行しなければなりません。処理が小さいうちは、一瞬で起動できるインタプリタスクリプトを実行した方が速いかもしれませんが、大きなアプリケーションでは、構文解析が済んだ状態のバイトコードをダウンロードして実行した方が効率の面で逆転するでしょう。
  • prototype.jsのようなベースとなるようなライブラリを、アプリケーション用のスクリプトと同じように扱っていて、(ブラウザがキャッシュしてくれるとはいえ)論理的には毎回取りにいきます。本当は、共有される基本ライブラリは、一度だけダウンロードしておいて、あとはバージョンが新しくならないかぎりダウンロードはしなくて済むようにするべきです。

で、通常はJavaScriptで書くonclick等のイベントハンドラや DOM へのアクセスを Javaで実現するようなブラウザのプラグインは実現できないか、という妄想をしはじめました。起動時間については、Java-pluginと違ってSwing/AWTを使わず、最近のマシンだと0.2秒くらいになるので、Appletのような問題は起きないでしょう。JSR223経由のRhinoを使って、互換性を保ったままJavaScriptの実装を差し替えることができれば、ブラウザ間の非互換性に対する解になるかもしれません(逆に非互換性の元を一つ増やしてしまうかもしれませんが)。Windowsの場合はJREの配布の問題はありますが、上に挙げた問題が解決できるとすれば、それなりに価値はあると思うのです。

JSR-199 & JSR-223

Mustangに含まれるJava Compiler API (JSR-199) を使うと、Javaコンパイラをプログラムから操作できるようになります。新たにできるようになることとしては、たとえば、クラスファイルを(ファイルシステム上に作らずに)メモリ上に作って読み込むことができます。スクリプト言語からJavaソースコードを直接読み込むような使い方も考えられます。

Java Compiler APIは、mustangの最近のビルドでAPIの大きな変更があり、サンプルコードもない状態だったので、実は、どうやって使うものかわからずお手上げ状態でした。しかし、http://blogs.sun.com/roller/page/sundararajan?entry=jsr_223_script_engine_for
によると、http://scripting.dev.java.net/ に JSR 223の Javaエンジンの実装が追加されたそうで、JSR-199のよいサンプルコードかもしれません。