Posted by & filed under いろいろ.


先週のありえるえりあミニ勉強会#4 ~ Google Closure Libraryにて@teppeisさんに発表していただいたfixclosureをRhinoのパーサーで書き直してみました。

https://github.com/tuchida/fixclosure-rhino

Eclipseプラグインを作ったりClosure Compilerに組み込んだりしやすくなったのではないでしょうか。まあRhinoパーサー使いたかっただけなので用途を考えてないのですが。

以下脱線してRhinoの話をします。(rhino1_7R4時点)

まずRhinoは

  1. 実装がJavaで作られている
  2. Rhinoで実行するJavaScriptからJavaを呼べる

ということはつまりRhinoで実行するJavaScriptからJavaScriptエンジンを十全に使えるということを意味します。ただの「JVM上で動くJavaScript環境」ではなく「JavaScriptのメタプログラミング環境」として使うことができます。(他のJVM上で動く言語ではどうなんでしょう?)

具体的にどんなことができるかというと

Rhinoパーサーが使える

fixclosure-rhinoで使ったやつです。

本来はNodeVisitorを実装したものをParser#visitに渡すのですが、実装するメソッドが一個の場合、かつ呼び出すメソッドが一意に決まる(オーバーロードしてない)場合はjsの関数を渡すだけで済みます。今回esprimaと比較しながら使ってみてわかったのですが、astのノードの親がたどれなかったり、lexer(TokenStream.java)とparser(Parser.java)で定数(Token.java)を使いまわしているので意味が分かりにくいものがあったり(Token.COMMAって何)して、esprimaが少し羨ましいと感じました。

Proxy API

JavaオブジェクトをJSオブジェクトにラップするためのScriptableを実装することでES.nextのProxy APIのようなことができます。

これを利用して社内アプリ用のSQLを書くライブラリなんてのも作りました。まあキモいので誰も使ってませんが。

スコープを汚さずにeval

例えばrequire/exportsをこんな風に実装できます。

「新しいJavaScript」

JavaScript1.8に対応してます。ES5外の機能として特に条件付きcatchとIteratorはJavaと相性がいいので押さえておくべきでしょう。あと(まだ)E4Xが使えます。


Nashornの話題なんかのときに「Rhinoは古い」と言われますが、個人的にはなかなか面白いJavaScriptエンジンだと思うんですけどね。


関連文書:

  • 関連文書は見つからんがな

Comments are closed.