nashorn 性能_介绍Nashorn JavaScript引擎

nashorn 性能

Nashorn是由Oracle用Java编程语言开发的一种新JavaScript引擎,与Java 8一起发布。Nashorn的目标是使用本机JVM在Java中实现轻量级的高性能JavaScript运行时。 通过使用Nashorn,开发人员可以将JavaScript嵌入Java应用程序中,还可以从JavaScript代码中调用Java方法和类。

为什么离开犀牛?

犀牛是Nashorn的前身。 它始于1997年的NetScape项目,并于1998年发布。

自Rhino发布以来已经有16年了,JavaScript引擎一直活着。 因此,Java专家决定通过从头开始开发新JavaScript引擎而不是重写现有JavaScript引擎来获得一些乐趣。 这催生了纳索恩(有趣的事实:纳索恩在德语中是犀牛的意思)。

这里几乎每个人都在浏览器中使用JavaScript,有些人已经在服务器上使用了JavaScript(例如Node.js),但是Nashorn的开发是出于其他目的。 通过使用Nashorn,开发人员可以执行以下操作:

  • 将JavaScript作为本机桌面代码运行。
  • 使用JavaScript编写外壳脚本。
  • 从JavaScript代码调用Java类和方法。

纳斯霍恩的目标

在设计Nashorn时,开发人员为此制定了一系列目标:

  • 它应基于ECMAScript-262 Edition 5.1语言规范,并且必须通过ECMAScript-262兼容性测试。
  • 它应该支持javax.script (JSR 223)API。
  • 它应该允许从JavaScript调用Java,反之亦然。
  • 它应该定义一个命令行工具jjs用于评估“ shebang”脚本(通常以#!/bin/sh开头)中JavaScript代码,在此提供文档并编辑字符串。
  • 它的性能应明显优于Rhino。
  • 它应该没有安全风险。

此外,没有人决定Nashorn将不包括调试功能,也不支持CSS和JavaScript库/框架。 这意味着Nashorn可以在浏览器中实现,而不必做噩梦。

(nut)Shell中JavaScript

为了通过使用Nashorn的jjs工具在外壳中使用JavaScript,您应该首先安装JDK8 ,您可以免费下载它。 要测试其安装,执行:

>_ javac -version
# it should echo
# java version "1.8.x"
jjs -version
# it should echo
# nashorn 1.8.x
jjs>

如果您在使用第一个或第二个命令时遇到任何问题,请尝试在路径中添加JDK

现在,您可以将JavaScript用作Shell脚本。 看看这个简单的例子:

jjs> var a = 1
jjs> var b = 4
jjs> print (a+b)
5
jjs>

正如您可能已经知道的那样,您不必将代码编写到jjs shell中。 您可以将代码写入JavaScript源文件中,然后从外壳程序中调用它。 考虑以下JavaScript代码:

var isPrime = function(num) {
    if (isNaN(num) || !isFinite(num) || num < 2) 
        return false;

    var m = Math.sqrt(num);

    for (var i = 2;i <= m; i++) 
        if (num % i === 0) 
            return false;

    return true;
}

var numbers = [ 2, 3, 4, 5, 6, 7, 8, 9, 10 ];

for (var i = 0; i < numbers.length; i++) {
    if (isPrime(numbers[i]))
        print(numbers[i] + " is prime");
    else
        print(numbers[i] + " is not prime");
}

假设代码在prime.js文件中,我们可以通过执行以下命令在shell中运行它:

>_ jjs prime.js
2 is prime
3 is prime
4 is not prime
5 is prime
6 is not prime
7 is prime
8 is not prime
9 is not prime
10 is not prime

这可能使您想起Python代码或bash脚本,但这是JavaScript。 为了使其更像bash,Nashorn提供了arguments变量以提取命令行参数。 考虑以下示例:

if (arguments.length === 0)
    print("No command-line arguments.");
else {
    print("Called with these command-line arguments:");

    for each (cli_arg in arguments) {
        print(cli_arg);
    }
}

运行它会得到以下输出(参数在--之后):

>_ jjs cliargs.js
No command-line arguments.

>_ jjs cliargs.js -- a b "c d e"
Called with these command-line arguments:
a
b
c d e

而且,JavaScript可以使用Java类和方法。 请参见以下多线程JavaScript代码示例:

var Thread = Java.type("java.lang.Thread"); 
var Runnable = Java.type('java.lang.Runnable');

var Run1 = Java.extend(Runnable, { 
    run: function() { 
        print("One thread");
        print("One thread");
    } 
}); 

new Thread(function() {
    print("Another thread");
    print("Another thread");
    print("Another thread");
}).start()

new Thread(new Run1()).start();

输出将是:

Another thread
Another thread
One thread
One thread
Another thread

您可以从输出中看出代码是多线程的。 通过使用Java.type("java.lang.Thread"); 我们可以在JavaScript代码中调用Java类。 Nashorn甚至允许在另一个方向上调用Java代码中JavaScript代码。

package j2js.example;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class Main {

    public static void main(String[] args) {

        ScriptEngine nashorn = new ScriptEngineManager().getEngineByName("nashorn");
        
        try {
            nashorn.eval("print('Am I Java or JavaScript?')");
        } catch (ScriptException e) {
            e.printStackTrace();
        }
    }

}

这个例子只是打印Am I Java or JavaScript? 第14行的问题,但这是Java中JavaScript代码最简单的示例。 可以使用Java方法从JavaScript文件读取整个源代码,然后将该代码作为String参数传递给eval()方法。 这将使JavaScript代码在Java内部执行。

结论

如今,JavaScript无处不在! 您可以将其用于客户端应用程序,服务器端应用程序,甚至可以用于客户端和服务器 。 您可以将其用于移动应用程序或建立小型IoT 。 现在,借助Nashorn,您可以利用JavaScript的简单性和Java丰富的API将其用作功能强大的类似于shell的脚本语言。

翻译自: https://www.sitepoint.com/introducing-nashorn-javascript-engine/

nashorn 性能

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值