【发布时间】:2011-04-03 14:19:04
【问题描述】:
我注意到 ubuntu 10.04 删除了 spidermonkey 包。犀牛看起来它仍然存在。犀牛和蜘蛛猴之间有什么区别(除了它们是用什么语言编写的)。他们为什么要移除蜘蛛猴?
【问题讨论】:
-
讨论了相关的 Ubuntu 错误报告 here
标签: javascript rhino ubuntu-10.04 spidermonkey
我注意到 ubuntu 10.04 删除了 spidermonkey 包。犀牛看起来它仍然存在。犀牛和蜘蛛猴之间有什么区别(除了它们是用什么语言编写的)。他们为什么要移除蜘蛛猴?
【问题讨论】:
标签: javascript rhino ubuntu-10.04 spidermonkey
恐怕区别在于它们所用的语言或含义。人们使用 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 上找到关于 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 可从此处获得:
值得庆幸的是,在 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 一起使用。
嗯,希望这对某人有所帮助,
干杯!
【讨论】:
根据他们开发的语言,开发人员需要使用 spidermonkey 显式处理内存。由于 rhino 是在 java 中开发的,其中包括自动垃圾收集,并且 JVM 的 [Java 虚拟机] 已被调整为比 Java 1.6 版本中的 c 或 c++ 更快的执行速度。
【讨论】: