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. 

外部連結

編輯