今週取りあげるのはスクリプトの事前評価です。
とはいっても、JRubyのjrubycツールやJavaFX Compilerのように事前にスクリプトをJavaのクラスファイルにコンパイルするというわけではありません。
スクリプトを実行前に評価しておき、実際にスクリプトを実行するときに評価しなくてもすませるようにする手法です。
この事前評価にはjavafx.script.Compilableインタフェースを使用します。
Compilableという名前だと事前にコンパイルしそうな感じですけど、そういうわけではありません。
事前評価が可能なスクリプトエンジンはCompilableインタフェースを実装しています。とはいうものの、スクリプトエンジンにはisCompilableメソッドのようなメソッドは定義されていません。したがって、第60回で扱ったInvocableインタフェースと同様にinstanceofを使用してCompilableインタフェースを実装しているかどうかをチェックする必要があります。
サンプルのソース | CompiledScriptSample.java |
---|
サンプルのコードを以下に示します。
public final static String SCRIPT = "function hello(names) {" + " for (i in names) {" + " print('Hello, ' + names[i] + '\\n');" + " }" + "}" + "var names = ['World', 'Java', 'JavaScipt'];" + "hello(names);"; public CompiledScriptSample() { // スクリプトエンジンマネージャの生成 ScriptEngineManager manager = new ScriptEngineManager(); // スクリプトエンジンの取得 (JavaScript) Compilable engine = (Compilable)manager.getEngineByName("js"); try { // スクリプトの事前評価 CompiledScript compiledScript = engine.compile(SCRIPT); // 事前評価済みのスクリプトの実行 compiledScript.eval(); } catch (ScriptException ex) { System.err.println("スクリプトの実行に失敗しました"); System.err.println(ex.getMessage()); } }
本来ならば、上述したようにinstanceofを使用して、スクリプトエンジンがCompilableインタフェースを実装しているかどうかチェックするのですが、簡略化のために省略させていただきました。
事前評価を行なうにはScriptEngineオブジェクトをCompilableインタフェースにキャストして使用します。
事前評価を行なうには、赤字で示したようにcompileメソッドを使用します。compileメソッドはScriptEngineのevalメソッドと同様に引数に文字列とReaderクラスのどちらでも使用可能です。ここでは文字列を使用してスクリプトを表しました。
compileメソッドの戻り値の型はjavax.script.CompiledScriptクラスです。
得られたCompiledScriptオブジェクトに対し、スクリプトを実行するのであればevalメソッドをコールします(青字部分)。すでにスクリプトは評価してあるので、引数は必要ありません。
さて、これで実行してみましょう。
C:\scripting>java CompiledScriptSample Hello, World Hello, Java Hello, JavaScipt
予想通りの結果が得られました。
CompiledScriptクラスのevalメソッドは何度でもコールできます。このため、何度もスクリプトを評価するような場合、事前に評価してから実行することでパフォーマンスの向上が図れるのです。
著者紹介 櫻庭祐一 横河電機 ネットワーク開発センタ所属。Java in the Box 主筆 今月の櫻庭先月、東京の新宿でショコラの祭典Salon du Chocolatが行われました。今月にかけて京都、名古屋、小倉でも開催されています。 ショコラが大好きな櫻庭がこれに行かないわけがありません。 ショコラといってもいろいろな種類があるわけですが、特にボンボンショコラが大好き。外側のコーティングがすっと解けて、中のガナッシュの香りが口の中に広がっていくのです。まさに至福。 Salon du Chocolatにはさまざまなチョコレート職人(ショコラティエ)が参加していて、どれを買おうか迷ってしまいがち。そんなとき、どれを買えばいいか目安になるのがMOFやルレ・デセールです。 MOF (Meilleur Ouvrier de France)はフランスの国家最優秀職人賞のことで、さまざまな分野での第一人者に与えられる称号です。ショコラティエでは14人がMOFを獲得しています。 ルレ・デセール(Relais Desserts)はパティシエおよびショコラティエの情報交換を目的に作られた組織です。ルレ・デセールには日本人も参加しており、2007年にはサダハルアオキ氏がルレ・デセールの会員に認定されています。 つまり、MOFを獲得しているショコラティエ、ルレ・デセールの会員であるショコラティエであれば、はずれはないということです。 今年、櫻庭が購入したチョコレートでも、MOF獲得者であるパトリック ロジェ(Patrick Roger)のチョコレートがとても印象的でした。 ぜひ、参考にしてみてください。
|