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]. (原始内容存档于2023-10-22).
  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.