我注意到 ubuntu 10.04 删除了 spidermonkey 包。犀牛看起来它仍然存在。犀牛和蜘蛛猴之间有什么区别(除了它们是用什么语言编写的)。他们为什么要移除蜘蛛猴?
3 回答
恐怕区别在于它们所用的语言或含义。人们使用 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 更像是一个自己动手做的编译器工具包,它的额外优势是已经构建了很多人都知道的标准语言,您只需要向其中添加您的自定义。
由于我很难找到关于 JavaScript 外壳/解释器的基本示例,尤其是rhino
在 Ubuntu 上 - 我将在此处发布...
基本上,我对安装什么以及调用什么样的命令行有点困惑:)
$ 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),以及一个没有浏览器不会“知道”它们。
但是,至少对于rhino
,Envjs的“浏览器环境”库可以解决这个问题,它的最新版本 - 1.2是env.rhino.js(请参阅SO:6170676中的in)。rhino
setTimeout
rhino
所以我们可以这样做:
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:
值得庆幸的是,在 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()
用来写入标准输出。编辑:要运行rhino
Java 调试器,请查看安装特定 .jar的less $(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
好吧,希望这对某人有所帮助,
干杯!
根据他们开发的语言,开发人员需要使用 spidermonkey 显式处理内存。由于 rhino 是在 Java 中开发的,其中包括自动垃圾收集,并且 JVM 的 [Java 虚拟机] 已经调整为比 Java 1.6 版本中的 c 或 c++ 更快的执行速度。