当前位置: 首页 > 科技观察

Java8新特性探索(十二)Nashorn:NewRhino

时间:2023-03-12 23:00:46 科技观察

Nashorn什么是Nashorn,读作“nass-horn”,是二战时期德国的一款坦克的名字,也是新一代的javascript引擎forjava8-replacingtheoldone,SlowRhino,符合ECMAScript-262Version5.1语言规范。你可能认为javascript运行在web浏览器中,提供了对html的各种dom操作,但是Nashorn并不支持浏览器DOM对象。这是需要注意的一点。Nashorn的介绍主要是两个方面,jjs工具和javax.script包下的API:jjs自带java_home/bin,以我们创建一个func.js为例,内容如下:functionf(){返回1;};打印(f()+1);运行这个文件,把这个文件作为参数传给jjsjjsfunc.js输出结果:2另外一个方面是javax.script,也是剩下的APIScriptEngineManagermanager=newScriptEngineManager();ScriptEngineengine=manager.getEngineByName("JavaScript");System.out.println(engine.getClass().getName());System.out.println("结果:"+engine.eval("functionf(){return1;};f()+1;"));输出如下:jdk.nashorn.api.scripting.NashornScriptEngineResult:2基本用法也可以去http://my.oschina.net/jsmagic/blog/212455参考博文;在jvm上运行的NashornVSRhinojavascript并不新鲜。Rhino早在jdk6就有了,但为什么现在要取代Rhino呢?慢,改写不如改造Rhino。由于性能是Nashorn的一大亮点,下面我们来测试一下性能对比。为了比较两者的性能,使用了ECMAScript解析框架Esprima来解析未压缩版本的jquery(约268kb),测试核心代码如下:staticvoidrhino(Stringparser,Stringcode){Stringsource=“速度测试”;内联=1;Contextcontext=Context.enter();context.setOptimizationLevel(9);试试{Scriptablescope=context.initStandardObjects();context.evaluateString(范围,解析器,源,行,空);ScriptableObject.putProperty(scope,"$code",Context.javaToJS(code,scope));对象树=newObject();Objecttokens=newObject();for(inti=0;i