|
Ignis ECMAScript Engine についてJava で実装された ECMAScript(JavaScriptのブラウザ依存以外の部分を規格化したもの) の実装です。同種のものとしては Rhino や FESI があります。Javaアプリケーションの中に組み込んで使用することを前提として開発されています。 完成版ではないのですが、一通り動作するようになったので公開します。 配布ファイルは src となっていますが、実行可能jarファイルも同梱されています。 ご意見など頂ければ幸いです。 ダウンロード
こんなスクリプトが動きますとりあえず実行してみるzip ファイルを展開すると am6.jar が含まれています。この jar ファイルに対して以下のコマンドを実行します。 C:\>java -jar am6.jarIgnis ECMAScript EngineはJava1.4標準の正規表現ライブラリまたはJakarta-ORO正規表現ライブラリを利用することができます。 Java1.4標準の正規表現ライブラリ、Jakarta-ORO正規表現ライブラリともに利用可能な場合、Jakarta-ORO正規表現ライブラリが優先して利用されます。 Jakarta-ORO正規表現ライブラリを組み込んで実行したいなら次のようにします。(lib\jakarta-oro-2.0.8.jarにライブラリがある場合) C:\>java -cp am6.jar;lib\jakarta-oro-2.0.8.jar jp.gr.java_conf.matsubara.interpreter.ScriptEngine
起動時の引数にスクリプトファイル名を渡すことで実行と同時にスクリプトファイルを実行することもできます。 C:\>java -jar am6.jar [スクリプトファイル名]例) C:\>java -jar am6.jar quick_sort.es array size : 100000 time : 3.828s sort successful. call count : 1921526 実行画面(コンソールから動かした場合)ビルド方法ビルドを行うと am6.jar が作成されます。これはzip ファイルに添付される am6.jar と基本的に同じものです。(Javaやantのバージョンによる)ビルドにはJ2SDK1.2以降とjakarta-ant1.5以降が必要です。 JAVA_HOME環境変数とANT_HOME環境変数を設定したあとantを実行します。 ant_build.bat を用いてもビルドできます。 Eclipse3.0.1以降を用いてもビルドできます。 正規表現を利用するには jakarta-ORO を利用するか、J2SDK1.4以降を利用する必要があります。 アプリケーションに組み込むこのインタープリタをアプリケーションに組み込むには以下の手順が必要です。
1. ScriptEngine のインスタンスを作成します。
2. ファイル・ストリームの何れかからスクリプトを読み込み char の配列を得ます。 3. 2の結果から ParsedScript オブジェクトを作成します。 4. ParsedScript オブジェクトを実行します。 もっとも単純な例は以下のようになります。 ScriptEngine scriptEngine = new ScriptEngine(); char[] scriptChars = scriptEngine.loadFromFile(fileName); script = scriptEngine.parseScript(scriptChars); RuntimeData defaultRuntime = scriptEngine.getExpresser().getDefaultRuntimeData(); script.execute(defaultRuntime);組み込み用途の場合、親アプリケーションを操作するためのオブジェクトをスクリプトから扱えるようにする必要がありますが、次のようにする事で実現します。 ScriptEngine scriptEngine = new ScriptEngine(); char[] scriptChars = scriptEngine.loadFromFile(fileName); script = scriptEngine.parseScript(scriptChars); RuntimeData defaultRuntime = scriptEngine.getExpresser().getDefaultRuntimeData(); defaultRuntime.setValue("foo", yourApplicationObject); // この行!! script.execute(defaultRuntime);※スクリプトからは foo として yourApplicationObject にアクセスできます。 yourApplicationObject は任意のオブジェクト型が使用可能です。 マルチスレッドアプリケーションで使用する場合、ScriptEngineや、ParsedScript を複数作成する必要はありません。runtimeオブジェクトを複製することで対応します。 最初に下記のコードを1回だけ実行します ScriptEngine scriptEngine = new ScriptEngine(); char[] scriptChars = scriptEngine.loadFromFile(fileName); script = scriptEngine.parseScript(scriptChars); RuntimeData defaultRuntime = scriptEngine.getExpresser().getDefaultRuntimeData(); defaultRuntime.setValue("foo", yourApplicationObject);各々のスレッド内で以下の処理を行います。 (servletのserviceメソッドの中とか…) RuntimeData defaultRuntime = scriptEngine.getExpresser().getDefaultRuntimeData(); RuntimeData threadRuntime = new RuntimeData(script.getDefaultRuntime()); script.execute(defaultRuntime);ScriptThread を使用してマルチスレッドを実現することもできます。 // 全体で1回(最初に実行する) ScriptEngine scriptEngine = new ScriptEngine(); char[] scriptChars = scriptEngine.loadFromFile(fileName); script = scriptEngine.parseScript(scriptChars); RuntimeData defaultRuntime = scriptEngine.getExpresser().getDefaultRuntimeData(); defaultRuntime.setValue("foo", yourApplicationObject); // 新しいスレッドが作成され、その中でスクリプトが実行されます。 script.executeNewThread(); // 自動的に新しいRuntimeDataが作成されます。※いずれの方法でもマルチスレッドの場合、グローバル変数が共有されるので注意が必要です。 各クラスの簡単な説明(主要なオブジェクト) jp.gr.java_conf.matsubara.interpreter.ScriptEngine スクリプトを実行するためのフロントエンドとなります。 通常はアプリケーションに1つあれば十分です。 jp.gr.java_conf.matsubara.interpreter.ParsedScript ソースから解析されたスクリプトを保持するオブジェクトです。実態は構文解析木です。 ソース(スクリプト)1つに対して1つだけ必要です。 jp.gr.java_conf.matsubara.expresser.RuntimeData グローバル変数や標準入出力など、スレッド毎に異なる情報を保持します。 実行を行うスレッド毎に必要です。 シングルスレッドアプリケーションの場合は、自分で作成する必要はありません。 参考資料ECMAScript仕様書 (英語・ECMAScript仕様書の仕様書(pdf)があります)http://www.ecma-international.org/publications/standards/Ecma-262.htm Dynamic Scripting (日本語・JScriptやその他のスクリプト言語のリファレンスなどがあります) http://www.interq.or.jp/student/exeal/dss/ ECMAScript - on Surface of the Depth - (ECMAScriptの重箱の隅をつつくようなコードがたくさん載っています) http://www.kmonos.net/alang/etc/ecmascript.php 著作権表示などIgnis ECMAScript EngineECMAScript Language 3rd Edition based Copyright (C) 2005 m.matsubara このプログラムは現状有姿かつ無保証、損害に関して免責という条件下で提供されます。 現時点でこのプログラムはアルファ版のため、今後仕様が大きく変更される可能性があります。 |