24

我注意到 ubuntu 10.04 删除了 spidermonkey 包。犀牛看起来它仍然存在。犀牛和蜘蛛猴之间有什么区别(除了它们是用什么语言编写的)。他们为什么要移除蜘蛛猴?

4

3 回答 3

18

恐怕区别在于它们所用的语言或含义。人们使用 C/C++ 编写各种事物(例如 Firefox),而 Java 在应用程序服务器中最为流行。来自http://en.wikipedia.org/wiki/Rhino_%28JavaScript_engine%29

Rhino 将 JavaScript 脚本转换为 Java 类。Rhino 可以在编译模式和解释模式下工作。它旨在用于服务器端应用程序,因此对通常与 JavaScript 关联的浏览器对象没有内置支持。

这里有三个重要部分。首先,没有 DOM(SpiderMonkey 也是如此)。其次,服务器端是预期用途。您应该能够在您的大型企业级应用程序中使用 Rhino,以便在更临时的基础上实现自动化。最后,Javascript 变成了一个类,就像 Java 类层次结构的其余部分一样,您可以与 Java 类进行交互(参见该页面上的代码示例)。

简而言之,您可以很容易地操作您的 POJO/基于 JPA 的对象/消息 Bean/任何您想调用的“企业”Java 类,所有这些都在通过 Rhino 运行的 javascript 中进行。将此与 Jython 进行比较,您可以在其中使用 Python 语法和类与 Java 进行交互。如果你有一些 JavaScript/Python 高手无所事事地在办公室里闲逛,这会很方便。

相比之下,SpiderMonkey 更像是 LUA。它是一种脚本语言。有什么不同?好吧,我怀疑您是否可以直接访问 printf 。您不能直接访问 C/C++ 类,而不是能够直接访问 Java 类。相反,您使用 C/C++ 来编写语言的额外功能。

简而言之,Rhino 允许 JS 与您的代码进行交互。SpiderMonkey 更像是一个自己动手做的编译器工具包,它的额外优势是已经构建了很多人都知道的标准语言,您只需要向其中添加您的自定义。

于 2010-12-12T14:02:58.757 回答
6

由于我很难找到关于 JavaScript 外壳/解释器的基本示例,尤其是rhino在 Ubuntu 上 - 我将在此处发布...

基本上,我对安装什么以及调用什么样的命令行有点困惑:)

首先,我在 rhino (Ubuntu) 中发现了 Bug #705339:“Rhino shell crash with NullPointerException”</a> - 并意识到 OpenJDK 实际上安装了一个rhino.jarJava 存档。所以如果你有这个,你可以立即在 bash 终端 shell 中执行:

$ java -jar /usr/lib/jvm/java-6-openjdk/jre/lib/rhino.jar 
Rhino 1.7 release 2 2010 11 17
js> print("answer " + 42.0); 
answer 42
js> quit()

 

这对于基本的东西来说已经足够了......但是,如果你想使用 DOMwindow对象或setTimeout()函数 - 本质上,那些是“浏览器特定的实现”(对于setTimeout,另见SO:7286178),以及一个没有浏览器不会“知道”它们。

 

但是,至少对于rhinoEnvjs的“浏览器环境”库可以解决这个问题,它的最新版本 - 1.2env.rhino.js请参阅SO:6170676中的in)。rhinosetTimeoutrhino

所以我们可以这样做:

wget http://www.envjs.com/dist/env.rhino.1.2.js
$ java -jar /usr/lib/jvm/java-6-openjdk/jre/lib/rhino.jar 
Rhino 1.7 release 2 2010 11 17
js> load('env.rhino.1.2.js');
js: "env.rhino.1.2.js", line 1247: uncaught JavaScript runtime exception: TypeError: Cannot call property getCurrentContext in object [JavaPackage org.mozilla.javascript.Context]. It is not a function, it is "object".
    at env.rhino.1.2.js:1247
    at <stdin>:2

js> ^C

... 哎呀 - 它不起作用 :) 但是,由于 getCurrentContext 错误,无法运行 1.2 中对此进行了说明。- 环境.js | 谷歌组

抱歉,Envjs 无法与 java 捆绑的 rhino 一起运行。您需要使用此处提供的 1.7rc2:

http://www.mozilla.org/rhino/download.html

值得庆幸的是,在 Ubuntu 中,我们可以直接执行以下操作,而不是从源代码构建:

sudo apt-get install rhino

...因为正如rhino 文件列表所述,此软件包安装js-1.7R2.jar. 该包还安装了一个 script rhino,它本质上是这些 Java 档案的 shell 包装器(请参阅 参考资料less $(which rhino))——因此我们可以方便地使用它,而不是键入java -jar ...等:

$ rhino
Rhino 1.7 release 2 2010 11 17
js> load('env.rhino.1.2.js'); // takes a while to load
[  Envjs/1.6 (Rhino; U; Linux i386 2.6.38-11-generic; en-US; rv:1.7.0.rc2) Resig/20070309 PilotFish/1.2.13  ]
js> print("loaded " + 1.2); 
loaded 1.2
js> window;
[Window]
js> ^C

 

但是,现在尝试将这些相同的行包含在脚本中,我们称之为test.js

load('env.rhino.1.2.js'); // takes a while to load
print("loaded " + 1.2); 
print(window);

并尝试调用rhino它:

$ rhino test.js
loaded 1.2
js: uncaught JavaScript runtime exception: ReferenceError: "window" is not defined.

 

哦,亲爱的-又失败了,现在怎么办?:) 好吧,谢天谢地,即使在Envjs 指南中也有所暗示(注意:请允许该页面使用 javascript,否则代码将几乎不可见) - 特别是:

# 从脚本或命令行运行 env.rhino.js
# 注意优化设置
java -jar lib/js.jar -opt -1 myscript.js

对 - 所以最后,我们只需添加这个优化设置,并且:

$ rhino -opt -1 test.js
[  Envjs/1.6 (Rhino; U; Linux i386 2.6.38-11-generic; en-US; rv:1.7.0.rc2) Resig/20070309 PilotFish/1.2.13  ]
loaded 1.2
[Window]

...终于它起作用了:) 编辑:使用env.rhino.1.2.js, 您也可以console.log()用来写入标准输出。编辑:要运行rhinoJava 调试器,请查看安装特定 .jarless $(which rhino)位置,然后java直接调用(脚本使用一组不同的命令行开关,因此不能说服调用调试器):rhino

java -cp /usr/share/java/js.jar org.mozilla.javascript.tools.debugger.Main test.js

 

如果您现在尝试运行相同的脚本spidermonkey(另请参阅在 Ubuntu 11.04 上获取 spidermonkey js 的最佳方式中的 PPA 说明?),您将获得:

$ js test.js
env.rhino.1.2.js:1247: ReferenceError: Packages is not defined

...也就是说spidermonkey不适用于.env.rhino.1.2.js

 

好吧,希望这对某人有所帮助,
干杯!

于 2011-09-03T10:31:07.320 回答
-1

根据他们开发的语言,开发人员需要使用 spidermonkey 显式处理内存。由于 rhino 是在 Java 中开发的,其中包括自动垃圾收集,并且 JVM 的 [Java 虚拟机] 已经调整为比 Java 1.6 版本中的 c 或 c++ 更快的执行速度。

于 2010-12-06T12:05:36.730 回答