SpiderMonkey是世界上第一款JavaScript引擎,由前网景公司布兰登·艾克设计,后期由Mozilla基金会维护,以开放原始码发布。目前为Mozilla Firefox网页浏览器所使用的JavaScript引擎,并也被嵌入到其他许多环境,例如GNOME 3桌面。

SpiderMonkey
开发者Mozilla基金会Mozilla公司
当前版本
  • 31(2014;长期支援)[1]
  • 38(2015年5月13日;长期支援)[2]
  • 45(2016年3月8日;稳定版本)[3]
  • 52.7.2(2018年3月15日;不稳定版)[4]
编辑维基数据链接
源代码库 编辑维基数据链接
编程语言CC++
操作系统跨平台
平台IA-32x86-64ARMMIPSSPARC[5]RISC-V[6]
类型JavaScript引擎
许可协议MPL[7]
网站spidermonkey.dev

历史

编辑

1995年,艾克被招聘到Netscape,目的是让他在浏览器中实作Scheme程式语言[8],于是他于10天内开发出JavaScript [9](当工程管理决定这个程式语言必须长得像Java时,使用Scheme的想法被放弃[8])。之后艾克必须为这个重大的技术负债付出代价,在1996年秋天,艾克留在家里两个礼拜,并且重写了Mocha程式库,也是后来大家所知道的SpiderMonkey[9]。SpiderMonkey这个名字源自于电影瘪四与大头蛋横贯美国,电影里的角色Tom Anderson提到,主要演员就像一对蜘蛛猴(Spider Monkey)夫妻在自慰[10]。2011年,艾克将SpiderMonkey程式码的管理交给戴夫·曼达林(Dave Mandelin)[9]

TraceMonkey

编辑

TraceMonkey是第一个为JavaScript语言编写的JIT编译器,于2008年8月23日发布并最先作为Firefox 3.5的SpiderMonkey中的编译引擎。相比Firefox 3.0的编译器,它提供了高达20到40倍的效能改善[11]

比起编译全部函式,TraceMonkey采用追踪即时编译(trace Just-in-time Compilation)将JavaScript编译成二进位码(Binary code)以提高执行效能,它的运作方式是在执行期间借由追踪和记录控制流程资料类型,将其用于建构追踪树(Trace Trees)页面存档备份,存于互联网档案馆),以生成高度最佳化路径的原生码,追踪树技术由尔湾加州大学研究团队贡献,安德里亚斯·加尔是该团队的负责人[12]

JägerMonkey的增进,使得TraceMonkey被遗弃,特别是在SpiderMonkey中类型推论引擎的开发,TraceMonkey自Firefox 11开始已经被停止使用[13]

JägerMonkey

编辑

JägerMonkey由Mozilla自2010年年初开发,在内部被称为MethodJIT,它被用来改善效能,特别是当某些情况下TraceMonkey无法生成稳定的原生码[14][15]。JägerMonkey于Mozilla Firefox 4开始被使用,采用组合编译(Method JIT)和组译器(Assembler),它的组译器移植自WebKit的Nitro引擎(SFX,SquirrelFish Extreme)[16]。后期Method JIT与TraceMonkey的Tracing JIT整合,使SpiderMonkey的速度更快。

JägerMonkey的运作很不同于其他编译器,传统的编译器是借由建立控制流图并将其最佳化,JägerMonkey则是透过重复线性前进循环SpiderMonkey字节码,也就是内部函式表示法。虽然这种方式阻碍重新排序指令的最佳化,但这对JavaScript这个经常改变变数类型而需要重新编译的语言来说,JägerMonkey有快速编译的优势。

Mozilla在JägerMonkey中实做了一个临界值的最佳化,重要的还有多形态内嵌快取( Polymorphic inline caching)及类型推论[17],Kraken和V8测试分数显示,类型推论可以分别带来44%与30%的分数提升。[18]

TraceMonkey及JägerMonkey的JIT技术的异同在一篇hacks.mozilla.org的文章页面存档备份,存于互联网档案馆)中有做解释,深入的技术细节可在一篇由SpiderMonkey的开发者Chris Leary的文章中取得,更多技术资讯还可在其他开发者的部落格中找到:dvander页面存档备份,存于互联网档案馆)、dmandelin

标准

编辑

SpiderMonkey实作了ECMA-262第5.1版(ECMAScript)和其他许多特色,而ECMA-357(ECMAScript for XML (E4X))已在2013年取消支援[19]

即便SpiderMonkey在Firefox中被使用,它并不提供一些主要环境,像是文档对象模型(DOM)。

内部

编辑

SpiderMonkey是以CC++语言编写,并包含直译器、IonMonkey即时编译垃圾回收器

IonMonkey

编辑

IonMonkey是Mozilla的第三个JIT编译器,它启用了许多新的最佳化技术,但是这些特色无法在之前的JägerMonkey架构运行[20]

IonMonkey更像传统的编译器,它使用中间表示层(IR,Intermediate representation)的静态单赋值形式将SpiderMonkey的字节码转换为控制流图(Control Flow Graph),这个结构令其他语言使用的最佳化技术可被使用在JavaScript,其中包含形态的特殊化(type specialization)、行内函式(Inline function)、线性扫描的暂存器配置(linear scan register allocator)、死码删除(Dead code elimination)以及尽可能将程序移出回圈外(Loop-Invariant Code Motion)[21]

该编译器可以在ARMX86X86-64上快速的将JavaScript函式转换成原生码

2013年初发行的Firefox 18中开始采用IonMonkey并将其作为预设引擎[22],这改进了TraceMonkey与JaegerMonkey不会对程式码进行解析、自动运行最佳化的缺点。[23]

OdinMonkey

编辑

OdinMonkey被用于最佳化JavaScript的子集asm.js,OdinMonkey并非一个JIT编译器,它依然采用IonMonkey作为编译器,这于2013年6月25日正式释出的Firefox 22起采用[24]

实作

编辑

SpiderMonkey可被嵌入于应用程式中,并为应用程式提供执行JavaScript的能力。不完整名单如下:

SpiderMonkey亦提供了JavaScript Shell,它是一个互动式开发环境,可让开发者使用命令列来执行JavaScript程式[26]。 许多大型组织使用SpiderMonkey来管理他们前端应用程式的JavaScript。

参考资料

编辑
  1. ^ https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/Releases/31.
  2. ^ https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/Releases/38.
  3. ^ https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/Releases/45.
  4. ^ https://hg.mozilla.org/releases/mozilla-esr52/rev/FIREFOX_52_7_2esr_RELEASE; 检索日期: 2018年3月23日.
  5. ^ 1.8.8 - SpiderMonkey | MDN. Developer.mozilla.org. 2013-01-10 [2013-03-21]. (原始内容存档于2013-11-14). 
  6. ^ SpiderMonkey Newsletter (Firefox 110-111). spidermonkey.dev. 2023-02-16 [2023-12-27]. (原始内容存档于2023-10-22). 
  7. ^ Mozilla Licensing Policies, mozilla.org, [2013-03-26], (原始内容存档于2013-07-15) 
  8. ^ 8.0 8.1 Eich, Brendan. Popularity. BrendanEich.com. 2008-04-03 [2013-01-24]. (原始内容存档于2011-07-03). 
  9. ^ 9.0 9.1 9.2 Eich, Brendan. New JavaScript Engine Module Owner. BrendanEich.com. 2011-06-21 [2013-01-24]. (原始内容存档于2011-07-14). 
  10. ^ Eich, Brendan. Mapping the Monkeysphere. 2011-08-19 [2013-01-24]. (原始内容存档于2013-01-13). 
  11. ^ Paul, Ryan. Firefox to get massive JavaScript performance boost. Ars Technica. 2008-08-22 [2013-03-21]. (原始内容存档于2008-12-17). 
  12. ^ TraceMonkey: JavaScript Lightspeed. BrendanEich.com. 2008-08-23 [2015-10-25]. (原始内容存档于2015-12-04). 
  13. ^ Nethercote, Nicholas. SpiderMonkey is on a diet | Nicholas Nethercote. Blog.mozilla.com. 2011-11-01 [2013-03-21]. (原始内容存档于2012-03-28). 
  14. ^ JaegerMonkey – Fast JavaScript, Always! » Mystery Bail Theater. Bailopan.net. 2010-02-26 [2013-03-21]. (原始内容存档于2013-03-24). 
  15. ^ Paul, Ryan. Mozilla borrows from WebKit to build fast new JS engine. Ars Technica. 2010-03-09 [2013-03-21]. (原始内容存档于2011-07-09). 
  16. ^ 存档副本. [2012-04-22]. (原始内容存档于2011-11-14). 
  17. ^ JaegerMonkey - MozillaWiki. Wiki.mozilla.org. [2013-03-21]. (原始内容存档于2013-08-23). 
  18. ^ David Mandelin. David Mandelin's blog. 2011-08-30 [2011-09-19]. (原始内容存档于2010-12-11). 
  19. ^ 759422 – Remove use of e4x in account creation. [2013-02-05]. (原始内容存档于2014-04-23). 
  20. ^ Platform/Features/IonMonkey - MozillaWiki. Wiki.mozilla.org. 2013-02-11 [2013-03-21]. (原始内容存档于2013-03-08). 
  21. ^ IonMonkey: Mozilla’s new JavaScript JIT compiler. Infoq.com. [2013-03-21]. (原始内容存档于2012-12-08). 
  22. ^ Firefox Notes - Desktop. Mozilla.org. 2013-01-08 [2013-03-21]. (原始内容存档于2013-11-07). 
  23. ^ 躲在 Firefox 18 裡的神奇離子猴 (@@"). 2013-01-09 [2013-01-09]. (原始内容存档于2013-01-11). 
  24. ^ Firefox Notes - Desktop. Mozilla.org. 2013-06-25 [2013-06-25]. (原始内容存档于2013-10-28). 
  25. ^ Bolso, Erik Inge. 2005 Text Mode Browser Roundup. Linux Journal. 2005-03-08 [2010-08-05]. (原始内容存档于2010-03-15). 
  26. ^ Introduction to the JavaScript shell. MDN. Mozilla Developer Network. 2019-03-18 [2019-05-20]. (原始内容存档于2019-05-28). The JavaScript shell (js) is a command-line program included in the SpiderMonkey source distribution. It is the JavaScript equivalent of Python's interactive prompt, the Lisp read-eval-print loop, or Ruby's irb. This article explains how to use the shell to experiment with JavaScript code and run JavaScript programs. 

外部链接

编辑