全国1千万人のJavaScriptユーザーの皆様こんにちは。たかだです。
本日は、拡張性とポータビリティにすぐれた JavaScript 処理系 Rhino(ライノー)をご紹介したいと思います。
JavaScript マニアなら、ブラウザ上だけではなく、もっと汎用的なツールとして JavaScript を利用したいと思いますよね? 日常的に利用するちょっとしたスクリプトはもちろん、できれば サーバーサイドのWebアプリや GUIアプリケーションまで JavaScriptで書きたいですよね?(という人が何人いるのかわかりませんが)
RhinoはJavaScriptの実行環境としてだけではなく、Javaをインタラクティブに操る処理系としても役立ちます。
Rhino はオープンソースで開発されている JavaScript の処理系です。Mozilla Foundation によって管理され、Java言語で実装されています。
最大の特徴は、Java のクラスやメソッドを JavaScriptから操作できることです。JavaScriptコードを Javaバイトコードに変換し、classファイルを作成することもできます。
このため、処理系自体を拡張しなくても、Javaのほとんど全機能を JavaScriptから利用することができます。
- Windows上で動作する Windows Script Host
- C で実装された SpiderMonkey
- SpiderMonkeyの拡張であるjslibs
など、ブラウザから独立した JavaScript(JScript)処理系にはいくつかの選択肢がありますが、拡張性に優れ、Java言語の機能を引き出せる Rhino はもっとも有力な選択肢の1つです。
インストール
さっそく使ってみましょう。
公式サイトより最新版を入手してください。
これ以外にJDK 1.4以降の Java実行環境が必要です。Java実行環境のインストールについてはここでは説明しません。
適当な場所に解凍してください。js.jarというファイルがあるはずです。こちらのファイルに、クラスパスを通せばさっそく実行できます。
以下のコマンドを実行するとJavaScriptのインタラクティブシェルが立ち上がります。
## 以下 /path/to/rhino は解凍したrhinoのディレクトリに合わせて変更してください。
$ java -classpath /path/to/rhino/js.jar org.mozilla.javascript.tools.shell.Main
Rhino 1.7 release 0 0000 00 00
js> print(1+1);
2
js>
終了には quit() という関数を呼び出します。
js> quit()
ファイルに保存したスクリプトを実行することもできます。
$ echo 'print("hello, world");' > hello.js
$ java -classpath /path/to/rhino/js.jar org.mozilla.javascript.tools.shell.Main hello.js
hello, world
ただし、こんなに長いコマンドを覚えるのは大変なので、呼び出し用の短いエイリアスを作成しておきましょう。
Windowsでは、以下のようなファイルをrhino.batという名前で保存し、パスの通った場所に置いておきます。
Windows環境では、日本語の文字化けを防ぐため、-Dfile.encoding=UTF-8というオプションを付ける必要 あります。
@echo off set CLASSPATH=/path/to/rhino/js.jar java -Dfile.encoding=UTF-8 org.mozilla.javascript.tools.shell.Main %1 %2 %3 %4 %5 %6 %7 %8 %9
bash(UnixライクOS)では以下の用なファイルをrhinoという名前で保存し、パスの通った場所に置き、実行権限を与えます。
export CLASSPATH=/path/to/rhino/js.jar java org.mozilla.javascript.tools.shell.Main $*
以上により、rhino というコマンドで、rhino のJavaScriptシェルを呼び出すことができるようになりました。
$ rhino Rhino 1.7 release 0 0000 00 00 js>
Javaの機能を呼び出す
rhinoからJavaの機能を呼ぶのはとても簡単です。
js> java.lang.System.out.println("Hello");
Hello
以上のようにパッケージつきで呼び出せば、まるでJavaScriptの関数を呼ぶように簡単にJavaのメソッドにアクセスできます。
パッケージをタイプするのが面倒な場合は、importPackageという関数で、グローバル環境に読み込むことができます。
js> importPackage(java.lang);
js> System.out.println('hello');
hello
パッケージは、JavaScriptのオブジェクトのような扱いになっているので、変数に代入もできます。
js> var $out = java.lang.System.out;
js> $out.println('Hello');
Hello
Javaクラスのインスタンスを作成するのも簡単です。
js> var f = new java.io.File('.');
js> f.exists();
true
便利な標準関数
Javaの機能を呼びださなくても、いくつかの機能は標準で提供されています。
以下の関数などはかなり使いどころがあるのではないでしょうか。
- print()
- 標準出力に文字列を出力する。
- readFile(path)
- ファイルを読み込み、内容を文字列として返す。
- readUrl(url)
- URLを読み込み、内容を文字列として返す。
- runCommand(cmd)
- 外部コマンドを実行する。
Rhinoを使えば汎用的スクリプト言語としてJavaScriptを利用できるのはもちろん、Javaアプリのテストなどにも強力な性能を発揮します。