当你想在你的代码中找到一个错误时,这很难;当你认为你的代码是不会有错误时,这就更难了。

javascript-rhino与spidermonkey

admin 107℃
我注意到ubuntu 10.04删除了spidermonkey包。犀牛看起来好像还在那里。Rhino和Spidermonkey有什么区别(除了用什么语言写的)。为什么他们要移除SpiderMonkey?

恐怕不同之处在于它们所用的语言,或者它的意思。人们使用C/C++来编写各种事物(比如Firefox),而Java在应用服务器中最为普遍。从http://en.wikipedia.org/wiki/Rhino_%28JavaScript_engine%29

rhino将javascript脚本转换为 Java类。犀牛在这两个地方都工作 编译和解释模式。 它的用途是 服务器端应用程序,因此 对浏览器没有内置支持 通常关联的对象 使用javascript。

这里有三个重要的部分。首先,没有dom(spidermonkey也是如此)。其次,服务器端是预期用途。您应该能够在大型企业级应用程序中使用rhino,以便在更特殊的基础上实现自动化。最后,javascript变成一个类,就像java类层次结构的其他部分一样,您可以与java类交互(请参阅该页上的代码示例)。

简言之,您可以很容易地操作基于pojos/jpa的对象/消息bean/任何您想称之为'企业'java类的东西,所有这些都是通过rhino在javascript中运行的。与jython相比,jython可以使用python语法和类与java交互。如果你有一些javascript/python代码在办公室里闲逛而无所事事,那就很方便了。

相比之下,spidermonkey更像lua。它是一种脚本语言。有什么区别?嗯,我怀疑你能否直接访问printf。不是直接访问Java类,而是不能直接访问C/C++类。相反,你使用C/C++来编程语言的额外特性。

简而言之,rhino允许js与代码交互。spidermonkey更像是一个自己动手的编译器工具包,它的附加优势是许多人都知道的标准语言已经构建好了,您只需向其中添加自定义项即可。

因为我很难找到关于javascript外壳/解释器的基本示例,特别是 rhino ,在ubuntu上-我会在这里发布…

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

首先,我发现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() 功能-本质上,这些是'特定于浏览器的实现'(用于 setTimeout ,另请参见SO:7286178),并且没有浏览器的脚本引擎不会'知道'它们。

 

不过,至少 rhino ,它由Envjs的'浏览器环境'库修复,其Latest release - 1.2用于 rhinoenv.rhino.js(参见SO:6170676了解 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

…ooops-它不起作用:)但是,这在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]

…终于成功了:)edit:with env.rhino.1.2.js ,也可以使用 console.log() 写信给标准输出。编辑:运行 rhino Java调试器,请参见使用 less $(which rhino) 特殊的.jars安装在哪里,然后调用 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++执行速度更快。

转载请注明:我的代码 » javascript-rhino与spidermonkey