犀牛与蜘蛛猴
Posted
技术标签:
【中文标题】犀牛与蜘蛛猴【英文标题】:rhino vs spidermonkey 【发布时间】:2011-04-03 14:19:04 【问题描述】:我注意到 ubuntu 10.04 删除了 spidermonkey 包。犀牛看起来它仍然存在。犀牛和蜘蛛猴之间有什么区别(除了它们是用什么语言编写的)。他们为什么要移除蜘蛛猴?
【问题讨论】:
讨论了相关的 Ubuntu 错误报告 here 【参考方案1】:恐怕区别在于它们所用的语言或含义。人们使用 C/C++ 编写各种事物(如 Firefox),而 Java 在应用程序服务器中最为流行。来自http://en.wikipedia.org/wiki/Rhino_%28javascript_engine%29:
Rhino 将 JavaScript 脚本转换为 Java 类。犀牛在这两种情况下都有效 编译模式和解释模式。 它旨在用于 服务器端应用程序,因此有 没有对浏览器的内置支持 通常关联的对象 使用 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 更像是一个自己动手做的编译器工具包,它还有一个额外的优势,那就是已经构建了很多人都知道的标准语言,您只需向它添加您的自定义。
【讨论】:
谢谢 - 有趣且乐于助人。但是 Ubuntu 通常有不止一个软件包来解决一个特定的问题。所以问题仍然存在:“他们为什么要移除蜘蛛猴”? @nealmcb 我真的不确定。也许为 Ubuntu 维护该软件包的人停止这样做并且他们放弃了它?我相信在“主要”中的要求是足够的定期维护和跟踪上游等。自从我写这篇文章以来已经有一段时间了,因为我已经使用了 Ubuntu,但是当我这样做的时候,我记得有很多包由于维护问题,从“主要”下降到“宇宙”。我怀疑随着 PPA 的兴起,如果你愿意,你可能会得到 SpiderMonkey。【参考方案2】:由于我很难在 Ubuntu 上找到关于 JavaScript shell/解释器的基本示例,尤其是 rhino
- 我将在此处发布...
基本上,我对安装什么以及调用什么样的命令行有点困惑:)
首先,我找到了Bug #705339 in rhino (Ubuntu): “Rhino shell crashes with NullPointerException” - 并意识到OpenJDK 实际上安装了一个rhino.jar
Java 存档。所以如果你有这个,你可以立即在 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()
这对于基本的东西来说已经足够了......但是,如果你想使用 DOM window
对象或 setTimeout()
函数 - 本质上,这些是“特定于浏览器的实现”(对于 @987654337 @,另见SO:7286178),没有浏览器的脚本引擎不会“知道”它们。
但是,至少对于rhino
,这可以通过Envjs“浏览器环境”库进行补救,对于rhino
,其Latest release - 1.2 是env.rhino.js(对于setTimeout
,请参见SO:6170676在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
... 哎呀 - 它不起作用 :) 但是,这在 Can't run 1.2 due to getCurrentContext error. - Env.js | Google Groups 中得到了澄清:
抱歉,Envjs 无法与 java 捆绑的 rhino 一起运行。你需要使用 1.7rc2 可从此处获得:
http://www.mozilla.org/rhino/download.html
值得庆幸的是,在 Ubuntu 中我们可以直接执行以下操作,而不是从源代码构建:
sudo apt-get install rhino
...因为正如rhino filelist 所述,此软件包安装js-1.7R2.jar
。该软件包还安装了一个脚本rhino
,它本质上是这些Java 档案的外壳包装器(参见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 Guide 中也有所暗示(注意:请允许该页面使用 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 调试器,请参阅使用 less $(which rhino)
安装特定 .jar 的位置,然后直接调用 java
(rhino
脚本使用一组不同的命令行开关,并且所以不能被说服调用调试器):
java -cp /usr/share/java/js.jar org.mozilla.javascript.tools.debugger.Main test.js
如果您现在尝试使用 spidermonkey
运行相同的脚本(另请参阅 Best way to get spidermonkey js on Ubuntu 11.04? 中的 PPA 说明),您将获得:
$ js test.js
env.rhino.1.2.js:1247: ReferenceError: Packages is not defined
...也就是说,spidermonkey
将不与env.rhino.1.2.js
一起使用。
嗯,希望这对某人有所帮助, 干杯!
【讨论】:
【参考方案3】:根据他们开发的语言,开发人员需要使用 spidermonkey 显式处理内存。由于 rhino 是在 java 中开发的,其中包括自动垃圾收集,并且 JVM 的 [Java 虚拟机] 已被调整为比 Java 1.6 版本中的 c 或 c++ 更快的执行速度。
【讨论】:
-1 表示错误声明:“开发人员需要使用 spidermonkey 显式处理内存”。 JavaScript 是一种垃圾收集语言,不管它是用什么语言实现的。特别是 Spidermonkey shell 具有在全局对象上公开的以下函数: gczeal(level) - “垃圾收集器应该有多热心”。很明显,Spidermonkey 也有垃圾收集功能。此外,声明中需要引用:“JVM 的执行速度比 Java 1.6 版本中的 c 或 c++ 更快”。根据bit.ly/fyyrTX,在大多数情况下并非如此 developer.mozilla.org/en/SpiderMonkey_Garbage_Collection_Tips 这个链接清楚地给出了一些处理内存的技巧!另外,我想问题是关于与 API 的集成。请查看 @echo-flow - Spidermonkey 具有垃圾收集功能,但 Ratna 的重点是在 javascript 解释器级别(即扩展或集成 Spidermonkey)而不是在 javascript 中进行开发。也就是说,这个答案非常基于语言...... @ratna,链接只是告诉我们,对于这个特定的测试,JVM 6 能够达到 C++ 的速度(不是一直,看看慢 4 倍的测试),有时甚至超过它(消耗很多更多的内存,它可能没有被回收)。这意味着实际性能取决于您的应用程序、您的算法等。所以这是不正确的““JVM 已经被调整为比 Java 1.6 版本中的 c 或 c++ 更快的执行”。调整是针对 JVM 的,也针对 C++ 编译器,理论表明 JIT 可以提供更好的结果,但至少在今天,C++ 编译器在大多数情况下仍然胜出。 @bartosz 我同意。在大多数情况下,C++ 编译器仍然胜出。请查看此链接,我也会尝试提供其他链接java.sun.com/performance/reference/whitepapers/…以上是关于犀牛与蜘蛛猴的主要内容,如果未能解决你的问题,请参考以下文章