SpiderMonkey

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. . Developer.mozilla.org. 2013-01-10 [2013-03-21]. (原始内容存档于2013-11-14).
  6. . spidermonkey.dev. 2023-02-16 [2023-12-27].
  7. , mozilla.org, [2013-03-26], (原始内容存档于2013-07-15)
  8. Eich, Brendan. . BrendanEich.com. 2008-04-03 [2013-01-24]. (原始内容存档于2011-07-03).
  9. Eich, Brendan. . BrendanEich.com. 2011-06-21 [2013-01-24]. (原始内容存档于2011-07-14).
  10. Eich, Brendan. . 2011-08-19 [2013-01-24]. (原始内容存档于2013-01-13).
  11. Paul, Ryan. . Ars Technica. 2008-08-22 [2013-03-21]. (原始内容存档于2008-12-17).
  12. . BrendanEich.com. 2008-08-23 [2015-10-25]. (原始内容存档于2015-12-04).
  13. Nethercote, Nicholas. . Blog.mozilla.com. 2011-11-01 [2013-03-21]. (原始内容存档于2012-03-28).
  14. . Bailopan.net. 2010-02-26 [2013-03-21]. (原始内容存档于2013-03-24).
  15. Paul, Ryan. . Ars Technica. 2010-03-09 [2013-03-21]. (原始内容存档于2011-07-09).
  16. . [2012-04-22]. (原始内容存档于2011-11-14).
  17. . Wiki.mozilla.org. [2013-03-21]. (原始内容存档于2013-08-23).
  18. David Mandelin. . 2011-08-30 [2011-09-19]. (原始内容存档于2010-12-11).
  19. . [2013-02-05]. (原始内容存档于2014-04-23).
  20. . Wiki.mozilla.org. 2013-02-11 [2013-03-21]. (原始内容存档于2013-03-08).
  21. . Infoq.com. [2013-03-21]. (原始内容存档于2012-12-08).
  22. . Mozilla.org. 2013-01-08 [2013-03-21]. (原始内容存档于2013-11-07).
  23. . 2013-01-09 [2013-01-09]. (原始内容存档于2013-01-11).
  24. . Mozilla.org. 2013-06-25 [2013-06-25]. (原始内容存档于2013-10-28).
  25. Bolso, Erik Inge. . Linux Journal. 2005-03-08 [2010-08-05]. (原始内容存档于2010-03-15).
  26. . 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.

外部链接

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.