JS引擎(2):Java平台上JavaScript引擎—Rhino/Nashorn概述

科技资讯 投稿 6400 0 评论

JS引擎(2):Java平台上JavaScript引擎—Rhino/Nashorn概述

  • Chrome V8 基于C++

Rhino和Nashorn都是用Java实现的JavaScript引擎。它们自身都是普通的Java程序,运行在JVM上

Rhino简介

Rhino 是一种动态类型的、基于对象的脚本语言,它可以简单地访问各种 Java 类库。

官网自带Rhino历史,跟Wikipedia上的Rhino词条基本上一样,有兴趣的话可以去看看。

JavaScript对象的接口是org.mozilla.javascript.Scriptable。主要实现类是IdScriptableObject、ScriptableObject。用Object[]来存字段,挺高效的。

IdScriptableObject {   Object[] valueArray;   short[] attributeArray;   // ... }

Rhino可以通过参数从11个预设的优化基本中选择一个使用。只从JVM以上的层面看,Rhino既可以工作于纯解释模式(-1),也可以工作于纯编译模式(0-9)。这11个级别分别是:

Rhino 优化级别

当优化级别为-1时,Rhino使用一个用Java写的字节码解释器来解释执行JavaScript。

[ JavaScript源码 ] -> ( 语法分析器 Parser  -> [ 抽象语法树(AST) ast ] -> ( Rhino内部表现形式生成器 IRFactory  -> [ Rhino内部表现形式 ScriptNode ] -> ( Rhino字节码生成器 CodeGenerator  -> [ Rhino字节码 Icode ] -> ( Rhino解释器 Interpreter  -> [ 运行结果 ]

当优化级别为0~9时,Rhino使用一个用Java写的编译器将JavaScript编译为Java字节码;生成出来的Java字节码交由JVM直接执行。至于底下的JVM是解释执行Java字节码,还是将Java字节码编译为机器码再执行,Rhino并不关心。
此时,Rhino的工作流程简单说是:

只从JVM以上的层面看,Nashorn是一种单层的纯编译型JavaScript实现。所有JavaScript代码在首次实际执行前都会被编译为Java字节码交由JVM执行。

JDK6 JDK7  Rhino区别

顺带一提,Sun/Oracle JDK6 / OpenJDK6中自带的Rhino是经过裁剪的,去掉了Mozilla Rhino中的部分功能。其中一个被去掉的功能就是Rhino的编译模式。这意味着JDK6自带的Rhino只能用解释模式运行。

Nashorn起初是Oracle内部一个实验项目,用于验证JSR 292功能的完整性、可用性、易用性。后来得到了内部的关注,决定将其产品化,作为默认的JavaScript实现替换掉从JDK6开始包含在JDK之中的Rhino。

Nashorn

它使用Java语言实现,运行在JVM上,借助JDK7开始包含的JSR 292(invokedynamic)新功能达到较高的性能,同时保持代码的相对整洁

  • 官方网站: http://openjdk.java.net/projects/nashorn/

  • 官网Wiki: https://wiki.openjdk.java.net/display/Nashorn/Main

  • 兼容标准: ECMAScript 5.1

  • 代码: http://hg.openjdk.java.net/nashorn/jdk8/nashorn

  • 开源许可证: GPLv2

Nashorn是一个纯编译的JavaScript引擎。它没有用Java实现的JavaScript解释器,而只有把JavaScript编译为Java字节码再交由JVM执行这一种流程,跟Rhino的编译流程类似

[ JavaScript源码 ] -> ( 语法分析器 Parser -> [ 抽象语法树(AST) ir ] -> ( 编译优化 Compiler -> [ 优化后的AST + Java Class文件(包含Java字节码) ] -> JVM加载和执行生成的字节码 -> [ 运行结果 ]

(当然JVM自身可能是混合执行模式的,例如HotSpot VM与J9 VM。所以Nashorn在实际运行中可能需要一定预热才会达到最高速度)

从Oracle JDK 8 build 82开始,Nashorn已经作为JDK8的一部分包含在安装包中。安装后可以在JDK安装目录的jre/lib/ext/nashorn.jar找到Nashorn的实现。

  1. 对象更加紧凑,数据离得更近,局部性更好

 

Rhino 和 Nashorn 到底怎么运行? - RednaxelaFX的回答 - 知乎 https://www.zhihu.com/question/27631001/answer/37407481

转载本站文章《JS引擎(2:Java平台上JavaScript引擎—Rhino/Nashorn概述》,
请注明出处:https://www.zhoulujun.cn/html/webfront/browser/webkit/2020_0718_8520.html

编程笔记 » JS引擎(2):Java平台上JavaScript引擎—Rhino/Nashorn概述

赞同 (37) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽