JavaScript调用Java的方法

JavaScript调用Java的方法
https://www.rstk.cn/news/734491.html?action=onClick

在这里插入图片描述

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

Nashorn简介

Nashorn
Nashorn(读作Naz-horn[naːsˌɔn])是Oracle全新开发的JavaScript实现。高度兼容ECMAScript 5标准,并尽可能兼容Rhino。它使用Java语言实现,运行在JVM上,借助JDK7开始包含的JSR 292(invokedynamic)新功能达到较高的性能,同时保持代码的相对整洁

在2012年底Nashorn就已经达到可以完全通过test262测试套件的兼容性,就这点说它甚至比SpiderMonkey、V8更佳兼容于标准。

官方网站: OpenJDK: Nashorn

官方博客: http://blogs.oracle.com/nashorn/

官网Wiki: Main - Main - OpenJDK Wiki

邮件列表: nashorn-dev Info Page

兼容标准: ECMAScript 5.1

实现语言: Java

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

代码版本控制工具: Mercurial

开源许可证: GPLv2

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

Nashorn还在快速开发中,日新月异,所以它的工作流程在不断变化。简单来说,Nashorn的编译入口可以从Context.compile()开始看:

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

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

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

Nashorn不但可以执行JavaScript,还可以当作库为其它工具提供一些基础服务。例如说它现在为NetBeans IDE中的JavaScript编辑器提供语法高亮支持和调试支持。

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

直接使用Java类的实例来容纳JavaScript对象的字段,在对象内嵌入字段而不放在spill array里的好处是:

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

数组访问有边界检查,而对象字段访问则没有,后者效率更高

参考内容:

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

各JavaScript引擎的简介,及相关资料/博客收集帖 https://hllvm-group.iteye.com/group/topic/37596

Rhino简介

Rhino 是一种使用 Java 语言编写的 JavaScript 的开源实现,原先由Mozilla开发。
Rhino 是一种动态类型的、基于对象的脚本语言,它可以简单地访问各种 Java 类库。

当时Netscape想用纯Java来实现新版浏览器,自然需要一个Java版的JavaScript引擎实现;另外也希望能在服务器端把JavaScript当作Java应用里的脚本语言使用。于是Rhino就诞生了。

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

Parser是从SpiderMonkey移植过来的。自然也是手写的纯递归下降式。
JavaScript对象的接口是org.mozilla.javascript.Scriptable。主要实现类是IdScriptableObject、ScriptableObject。用Object[]来存字段,挺高效的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值