2.1.4 脚本的编译

脚本语言一般是解释执行的。脚本引擎在运行时需要先解析脚本之后再执行。一般来说,通过解释执行的方式来运行脚本的速度比编译之后再运行会慢一些。当一段脚本需要被多次重复执行时,可以先对脚本进行编译。编译之后的脚本在执行时不需要重复解析,可以提高执行效率。不是所有的脚本引擎都支持对脚本进行编译。如果脚本引擎支持这一特性,它会实现javax.script.Compilable接口来声明这一点。脚本引擎的使用者可以利用这个能力来提高需要多次执行的脚本的运行效率。Java SE中自带的JavaScript脚本引擎是支持对脚本进行编译的。

在代码清单2-9中,Compilable接口的compile方法用来对脚本代码进行编译,编译的结果用javax.script.CompiledScript来表示。由于不是所有的脚本引擎都支持Compilable接口,因此这里需要用instanceof进行判断。在run方法中,通过CompiledScript的eval方法就可以执行脚本。代码中把一段脚本重复执行了100次,以此说明编译完的脚本在重复执行时的性能优势。

代码清单2-9 进行脚本编译的示例


public CompiledScript compile(String scriptText)throws ScriptException{

ScriptEngine engine=getJavaScriptEngine();

if(engine instanceof Compilable){

CompiledScript script=((Compilable)engine).compile(scriptText);

return script;

}

return null;

}

public void run(String scriptText)throws ScriptException{

CompiledScript script=compile(scriptText);

if(script==null){

return;

}

for(int i=0;i<100;i++){

script.eval();

}

}


CompiledScript的eval方法所接受的参数与ScriptEngine的eval方法是相同的。