RhinoでJavaScriptを動かす
Javaで記述されたJavaScriptの実装「Rhino」。シンメトリック社内の勉強会(檜山研)の1つ「JavaScript」チームでは、JavaScriptの学習にRhino(GUIで操作できるRhino JavaScript Debugger)を使っています。
講師の檜山さんが、Rhinoについての解説のなかで「RhinoはJavaScriptの処理系だけども、全てJavaで記述されているからJavaのクラスを使うこともできる」とコメントしていました。 RhinoでJavaのクラスを使った短いコードを試してみたりもし、そのときは正直「へ~」と感心する程度の認識だったのですが・・・。その後、しばらくしてRhinoでJavaクラスを使うことが実に手軽で便利と思うことがありました。今回はその使い方について説明します。
ある日の業務中、phpでの開発中にテストデータのための小さなコードを書こうと思いました。Javaで開発していればすぐにEclipseのスクラップブックページを使って何か書くのですが、開発環境はZend Studio for Eclipseでスクラップブックページがありません。だからといってスクラップブックページのためだけにEclipseを起動するのもどうかと。それと、私は普段phpを使わないので、使い捨てコードをphpで書くにはかえって手間という事情(本音)もありました。
そこでふと先日の檜山さんの言葉を思い出し、Rhino上でスクラップブックページ代わりのコードを書いてみると・・・。Rhinoがサラリと実行結果を出力しました。使い慣れたJavaクラスを利用しながらコンパイルは不要です。思わず感動です。
すごいぞRhino!と、今まで知らなかった世界を見たような気持ちです。コードアシスト機能はないですが、小さなコードならさほどの不便さもないと感じました。
以降は具体的な使い方とサンプルです
jsファイルを作る
importPackage(java.lang) importPackage(java.util) function get_order_list() { var set = new LinkedHashSet(); var r = new Random(); while (set.size() < 10) { var n = r.nextInt(10) + 1; set.add(new Integer(n)); } return set.toArray(); }
1~2行目でJavaパッケージをインポートしています。これで完全修飾名で書かなくてもよくなります。
JavaScriptの書き方(関数・制御構文・変数)とJava(クラス・メソッドの利用)が混ざっていることにお気づきでしょうか?やりたいことに応じてJavaクラスを都合よく使いつつ、スクリプト言語で手軽に書けるというのもRhinoの魅力と思います。
Rhinoでスクリプトを実行する
Rhino JavaScript Debuggerを起動したら、Rhinoのコンソールで先ほどのjsファイルをロードします。次のように打ち、上の「Go」をクリックするとset.jsをロードしたWindowが開きます。
load('set.js')
コンソールが後ろに隠れてしまいますので、閉じるか「Window」>「Console」で、コンソールを前に持ってきます。
コンソール上のload(‘set.js’)に続けて、関数を実行するコードを次のように入力します。
var i = 0; while (i < 10) { var list = get_order_list(); print(list.toSource()); i++; }
実際の表示は次のようになります。
エンターキーで実行すると、配列の結果が出力されます。このように、Rhinoでは配列の個々の値を容易に見ることができます。
最後に・・・Rhinoをもっと気軽に使う
Rhinoは通常CUIで使われるようですが、GUIのRhino Script Debuggerの起動コマンドをbatファイルにしておくとすぐに使えて便利です。
@echo off
echo Rhino JavaScript Debugger を起動します...
java -classpath js.jar org.mozilla.javascript.tools.debugger.Main
今回は小さなコードを使うだけにとどまりました。今後、檜山研でJavaScriptやRhinoを学ぶうちに、より有意義な使い方を見出せるのではないかと、期待が高まります。実際の仕事で活用できるよい例ができたら、また紹介したいと思います。