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 性能