presented by 松原正和
 





広告








twitter


掲示板

FeedWind
      
Ignis ECMAScript Engine

Ignis ECMAScript Engine について

 Java で実装された ECMAScript(JavaScriptのブラウザ依存以外の部分を規格化したもの) の実装です。同種のものとしては RhinoFESI があります。
 Javaアプリケーションの中に組み込んで使用することを前提として開発されています。
 完成版ではないのですが、一通り動作するようになったので公開します。
 配布ファイルは src となっていますが、実行可能jarファイルも同梱されています。
 ご意見など頂ければ幸いです。

ダウンロード

バージョン ダウンロードファイル 備考
Version 0.4.0 am6-src-20060420_ver0.4.0.zip history.txt
for-in 構文のサポート(ようやく)
マルチスレッド時の型変換が上手く働かない不具合を修正
名称をIgnis ECMAScript Engine から Ignis ECMAScript Engine に変更しました。
Version 0.3.0 am6-src-20051016_ver0.3.0.zip 高速化
Jakarta-OROが存在しても使用しない不具合を修正
その他不具合修正
Version 0.2.1 am6-src-20050907_ver0.2.1.zip 不具合修正版
Version 0.2.0 am6-src-20050813_ver0.2.0.zip 最初のインターネット公開版
(公開終了)


こんなスクリプトが動きます

  • quick_sort.es クイックソートアルゴリズムの実装
  • test.es テスト用スクリプト

    とりあえず実行してみる

     zip ファイルを展開すると am6.jar が含まれています。
     この jar ファイルに対して以下のコマンドを実行します。
    C:\>java -jar am6.jar
    
     Ignis 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
    
    実行されて出てきたプロンプトからは以下のコマンドが実行できます。
    []は任意の内容で置き換える必要があります)
    >@run [ファイル名]
    
    指定されたスクリプトファイルを実行します。
    実行が終了するまでプロンプトは戻りません。

    >@start [ファイル名]
    
    指定されたスクリプトファイルが新しいスレッドで開始されます。
    実行が終了しなくてもプロンプトに戻ります。
    実行したスクリプトが終了する前に別のスクリプトを実行することも可能ですが、グローバル変数領域が共有されることに注意しなければなりません。
    >@exit
    
    プログラムを終了します。
    >@mem
    
    Javaのメモリの状態を表示します。
    >[計算式]
    
    計算式の評価を行います。

    起動時の引数にスクリプトファイル名を渡すことで実行と同時にスクリプトファイルを実行することもできます。
    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 Engine
        ECMAScript Language 3rd Edition based
        Copyright (C) 2005 m.matsubara

     このプログラムは現状有姿かつ無保証、損害に関して免責という条件下で提供されます。
      現時点でこのプログラムはアルファ版のため、今後仕様が大きく変更される可能性があります。


    home
  •  








    5245409