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を学ぶうちに、より有意義な使い方を見出せるのではないかと、期待が高まります。実際の仕事で活用できるよい例ができたら、また紹介したいと思います。

Page Top