犀牛与蜘蛛侠

Tyl*_*ies 24 javascript rhino spidermonkey ubuntu-10.04

我注意到ubuntu 10.04删除了spidermonkey包.犀牛看起来仍然在那里.犀牛和蜘蛛侠之间有什么区别(除了他们写的是什么语言).他们为什么要删除蜘蛛侠?

小智 18

我担心区别在于它们所写的语言或它的含义.人们使用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更像是一个自己动手编译器套件,其附加优势是许多人都知道已经构建了一种标准语言,您只需要添加自定义语言即可.


sda*_*aau 6

由于我很难找到有关JavaScript shell /解释器的基本示例,特别是rhino在Ubuntu上 - 我会在这里发布这个...

基本上,我对安装什么以及调用哪种命令行感到有点困惑:)

首先,我在rhino(Ubuntu)中发现了Bug#705339:"Rhino shell崩溃并出现NullPointerException" - 并意识到OpenJDK实际上安装了一个rhino.jarJava归档文件.所以,如果你有,你可以立即在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()
Run Code Online (Sandbox Code Playgroud)

 

这对于基本的东西来说已经足够了......但是,如果你想使用DOM window对象或setTimeout()函数 - 本质上,那些是"特定setTimeout浏览器的实现"(对于,参见SO:7286178),以及没有使用的脚本引擎浏览器不会"知道"他们.

 

然而,至少rhino,这是由补救Envjs "浏览器环境"库,它的最新版本- 1.2rhinoenv.rhino.js(SO:6170676setTimeoutrhino).

所以我们可以这样做:

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
Run Code Online (Sandbox Code Playgroud)

...和ooops - 它不起作用:)但是,由于getCurrentContext错误,无法运行1.2中阐明了这一点. - Env.js | Google网上论坛:

对不起,Envjs无法运行与java捆绑的rhino.你需要使用1.7rc2从这里:

http://www.mozilla.org/rhino/download.html

值得庆幸的是,在Ubuntu中,我们可以直接执行以下操作,而不是从源代码构建:

sudo apt-get install rhino
Run Code Online (Sandbox Code Playgroud)

...因为正如rhino文件列表所述,此软件包安装js-1.7R2.jar.该软件包还安装了一个脚本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
Run Code Online (Sandbox Code Playgroud)

 

但是,现在尝试将这些相同的行包含在脚本中,让我们称之为test.js:

load('env.rhino.1.2.js'); // takes a while to load
print("loaded " + 1.2); 
print(window);
Run Code Online (Sandbox Code Playgroud)

并尝试呼吁rhino它:

$ rhino test.js
loaded 1.2
js: uncaught JavaScript runtime exception: ReferenceError: "window" is not defined.
Run Code Online (Sandbox Code Playgroud)

 

亲爱的 - 再次失败,现在怎么样?:)好吧,幸运的是,即使这在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]
Run Code Online (Sandbox Code Playgroud)

...最后它的工作原理:)编辑:用env.rhino.1.2.js,你也可以console.log()用来写入stdout.编辑:要运行rhinoJava调试器,请参阅使用less $(which rhino)安装的特定.jars的位置,然后java直接调用(rhino脚本使用一组不同的命令行开关,因此无法说服它调用调试器):

java -cp /usr/share/java/js.jar org.mozilla.javascript.tools.debugger.Main test.js
Run Code Online (Sandbox Code Playgroud)

 

如果您现在尝试运行相同的脚本spidermonkey(另请参阅最佳方法中的 PPA说明以获取Ubuntu 11.04上的spidermonkey js),您将获得:

$ js test.js
env.rhino.1.2.js:1247: ReferenceError: Packages is not defined
Run Code Online (Sandbox Code Playgroud)

...也就是说,spidermonkey不会一起工作env.rhino.1.2.js.

 

嗯,希望这有助于某人,
干杯!