Javascript引擎的优势

Javascript引擎的优势,javascript,v8,rhino,spidermonkey,javascript-engine,Javascript,V8,Rhino,Spidermonkey,Javascript Engine,我现在对JavaScript引擎感到困惑。我知道这很重要,因为它将JavaScript编译为本机代码 然后我开始阅读,据我所知,它是用C编写的,可以编译JavaScript。那么这与V8有什么不同呢?如果这是真的,为什么Firefox不这么做呢 最后,是否真的将JavaScript编译成Java字节码,以便获得Java的所有速度优势?如果不是,为什么人们在桌面上编写脚本时不运行V8?V8是最快的,因为它将所有JS编译为机器代码 SpiderMonkey(FF使用的)也很快,但编译成中间字节码,而

我现在对JavaScript引擎感到困惑。我知道这很重要,因为它将JavaScript编译为本机代码

然后我开始阅读,据我所知,它是用C编写的,可以编译JavaScript。那么这与V8有什么不同呢?如果这是真的,为什么Firefox不这么做呢


最后,是否真的将JavaScript编译成Java字节码,以便获得Java的所有速度优势?如果不是,为什么人们在桌面上编写脚本时不运行V8?

V8是最快的,因为它将所有JS编译为机器代码

SpiderMonkey(FF使用的)也很快,但编译成中间字节码,而不是机器码。这就是V8的主要区别。编辑-较新的Firefox版本带有较新的SpideMonkey变体;特雷森基。TraceMonkey对关键部件进行JIT编译,也许还有其他智能优化

Rhino将Javascript编译成Java类,从而允许您基本上用Javascript编写“Java”应用程序。Rhino还被用作在后端解释JS并对其进行操作的一种方式,并且具有完整的代码理解,例如反射。例如,YUI压缩机就采用了这种方式

到处使用Rhino而不是V8的原因可能是因为V8相对较新,所以很多项目已经使用Rhino/Spidermonkey作为JS引擎,例如Yahoo widgets。(我想这就是你所说的“桌面上的脚本”)

编辑- 这个链接还可以让我们了解为什么SpiderMonkey被如此广泛地采用。
回答这个问题,为什么本机代码与字节码

本机代码更快,对谷歌来说是一个战略选择,因为他们计划JS,其中至少有一个是ChromeOS


有关这个问题的一段好视频发布在第9频道,采访了V8引擎的幕后黑手Lars Bak,如果您想了解各种浏览器内Javascript引擎的运行情况,请安装Safari 4(是的,它现在也在Windows上运行!)、Chrome V8、Firefox 3.5和IE 8(如果您在Windows上),并运行基准测试:

我相信正如Pointy在上面所说的,新的Firefox3.5使用了TraceMonkey,它还可以使用某种形式的JIT动态编译代码。因此,与V8相比,它应该是比较好的。至少不会像Firefox3 SpiderMonkey(没有JIT)那样比V8慢10倍

对我来说。。。safari 4.0.3比Win XP上Firefox 3.5.3中的Tracemonky快2.5倍。IE8要慢得多。我现在没有安装Chrome

我不知道Rhino如何编译成java字节码。如果它仍在解释Javascript的动态特性,例如能够在运行时向对象实例添加属性(例如,Javascript中允许的obj.someNewAttribute=“someValue”)。。。我不太确定它是否完全“编译”成字节码,而且除了不必每次运行Javascript时都从Javascript源代码文本编译之外,您可能不会获得更好的性能。记住Javascript允许非常动态的语法,比如eval(“x=10;y=20;z=x*y”);这意味着您可以构建在运行时编译的代码字符串。这就是为什么我认为Rhino将是混合模式解释/编译的,即使您确实编译为JVM字节码

JVM仍然是一个解释器,尽管它具有JIT支持,是一个非常好的解释器。所以我喜欢将JVM上的Rhino看作两个解释器层(解释器对解释器)或解释器^2。而您的大多数其他Javascript引擎都是用C编写的,因此应该更像解释器^1。每个解释器层可以增加5-10x性能退化,与C或C++相比(例如REF Perl或Python或Ruby),但是JIT的性能命中可以在2-4X的顺序上低得多。JVM拥有有史以来最健壮、最成熟的JIT引擎之一

因此,您的里程数肯定会有所不同,如果您想在自己的硬件和操作系统上为您的预期应用程序找到一个真正的答案,那么您可能会受益于进行一些认真的基准测试

Rhino的速度不能太慢,因为我知道很多人都在使用它。我认为它的主要吸引力不在于它的速度,而在于它易于编码/轻量级/可嵌入/解释器,并具有Java库的挂钩,这使得它非常适合于软件项目的脚本编写/配置/可扩展性。一些文本编辑器(如UltraEdit)甚至将Javascript作为替代宏脚本引擎嵌入其中。每个程序员似乎都能很容易地通过javascript,所以也很容易学会

Rhino的一个优势是它几乎可以在JVM运行的任何地方运行。根据我的经验,在Windows这样的系统上,试图从命令行构建并运行独立的TraceMonkey或SpiderMonkey可能有点痛苦。而嵌入到您自己的应用程序中可能会更加耗时。但是,对于一个大项目来说,拥有一种嵌入式语言的回报是值得的,而如果你想这样做的话,就必须“推出自己的”迷你脚本解决方案


使用Rhino编写脚本非常简单,如果您有Java和Rhino jar,您只需编写javascript并从命令行运行它。我一直使用它来完成简单的任务。

JavaScript执行有多种方法,即使是在执行JIT时也是如此。V8和Nitro(以前称为SquirreFish Extreme)选择执行整个方法JIT,这意味着当遇到脚本时,他们将所有JavaScript代码编译成本机指令,然后简单地执行,就好像它是编译的C代码一样。SpiderMonkey使用“跟踪”JIT,它首先将脚本编译成字节码并解释它,但监视执行,寻找循环等“热点”。当它检测到一条热路径时,它会将该热路径编译为机器代码,并在将来执行

这两种方法都有好处