2010-08-25 62 views
24

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

+1

相关的Ubuntu Bug报告讨论[这里](https://bugs.launchpad.net/ubuntu/+source/xulrunner-1.9.2/+bug/536950) – richaux 2010-12-08 13:27:27

回答

18

恐怕不同之处在于它们写入的语言或其含义。人们使用C/C++编写各种方式的东西(如Firefox),而Java在应用程序服务器中最为流行。 From 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 whizzes在办公室踢球,无所事事,那么很方便。

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

简而言之,Rhino允许JS与您的代码进行交互。 SpiderMonkey更像是一个自己动手的编译器套件,它具有额外的优势,即许多人知道的标准语言已经建立,您只需将定制添加到它。

+1

感谢 - 有趣且有帮助,但Ubuntu经常有多个包来解决特定问题,所以问题依然存在:“为什么要删除spidermonkey”? – nealmcb 2012-11-15 15:23:27

+1

@nealmcb我老实不确定。也许维护Ubuntu软件包的人停止了这样做,他们放弃了它?我认为“主要”的要求是足够的定期维护和跟踪上游等等。从我写这篇文章开始就已经有一段时间了,因为我已经使用了Ubuntu,但是当我回来的时候,我记得有很多包由于维护问题而从“主”降到“宇宙”。我怀疑鉴于PPA的兴起,如果你愿意的话,你可能会抓住SpiderMonkey。 – 2012-11-15 19:50:35

-1

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

+2

-1对于虚假陈述:“开发者需要明确处理记忆使用spidermonkey“。 JavaScript是一种垃圾收集语言,无论它实现什么语言。Spidermonkey外壳特别是在全局对象上暴露了以下功能:gczeal(level) - “垃圾收集器应该是多么的热情”。所以Spidermonkey显然也有垃圾收集。另外,声明中还需要引用:“JVM的调优速度比Java 1.6版的c或C++更快”。根据http://bit.ly/fyyrTX – jbeard4 2010-12-08 12:26:39

+0

将不会更新一旦我得到链接..谢谢你的信息 – 2010-12-09 06:07:57

+0

https://developer.mozilla.org/en/SpiderMonkey_Garbage_Collection_Tips这个链接清楚地给出处理记忆的一些提示!另外,我想问题是关于与API集成。请查看 – 2010-12-09 06:11:47

6

因为我有很大的困难找到关于JavaScript的壳/口译员,特别是rhino基本的例子,在Ubuntu上 - 我会在这里基本上张贴此...

,我是在安装什么有点迷糊了,什么样的命令行来调用:)

首先,我发现Bug #705339 in rhino (Ubuntu): “Rhino shell crashes with NullPointerException” - 并意识到OpenJDK实际上安装了一个rhino.jar Java档案。所以,如果你有,你可以马上做的是bash终端外壳:

$ 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()函数 - 实质上,这些是“浏览器特定实现”(,对于setTimeout,另请参阅SO:7286178),而没有浏览器的脚本引擎将不会“知道”它们。

 

然而,至少rhino,即由Envjs '浏览器环境' 库,rhinoLatest release - 1.2env.rhino.jsrhino看到SO:6170676setTimeout)纠正。

因此,我们可以做这样的事情:

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捆绑的犀牛一起运行。你需要使用 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()写入到stdout 。编辑:要运行rhino Java调试器,请参阅使用less $(which rhino)安装的特定.jars在哪里,然后直接调用java脚本使用一组不同的命令行开关,因此无法被说服调用调试器) :

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一起使用。

 

好了,希望这可以帮助别人,
干杯!

+0

你做了我的一天,谢谢! – Rafa 2013-05-31 14:38:13