SpiderMonkey 是世界上第一款JavaScript引擎 ,由前网景公司 的布兰登·艾克 設計,後期由Mozilla基金会 維護,以開放原始碼 發佈。目前為Mozilla Firefox 網頁瀏覽器 所使用的JavaScript 引擎,並也被嵌入到其他許多環境,例如GNOME 3 桌面。
歷史
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是以C 和C++ 语言編寫,並包含直譯器 、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] 。
该編譯器可以在ARM 、X86 及X86-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。
參考資料
^ https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/Releases/31 .
^ https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/Releases/38 .
^ https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/Releases/45 .
^ https://hg.mozilla.org/releases/mozilla-esr52/rev/FIREFOX_52_7_2esr_RELEASE ; 检索日期: 2018年3月23日.
^ 1.8.8 - SpiderMonkey | MDN . Developer.mozilla.org. 2013-01-10 [2013-03-21 ] . (原始内容 存档于2013-11-14).
^ SpiderMonkey Newsletter (Firefox 110-111) . spidermonkey.dev. 2023-02-16 [2023-12-27 ] . (原始内容存档 于2023-10-22).
^ Mozilla Licensing Policies , mozilla.org, [2013-03-26 ] , (原始内容存档 于2013-07-15)
^ 8.0 8.1 Eich, Brendan . Popularity . BrendanEich.com. 2008-04-03 [2013-01-24 ] . (原始内容 存档于2011-07-03).
^ 9.0 9.1 9.2 Eich, Brendan . New JavaScript Engine Module Owner . BrendanEich.com. 2011-06-21 [2013-01-24 ] . (原始内容 存档于2011-07-14).
^ Eich, Brendan . Mapping the Monkeysphere . 2011-08-19 [2013-01-24 ] . (原始内容 存档于2013-01-13).
^ Paul, Ryan. Firefox to get massive JavaScript performance boost . Ars Technica. 2008-08-22 [2013-03-21 ] . (原始内容存档 于2008-12-17).
^ TraceMonkey: JavaScript Lightspeed . BrendanEich.com. 2008-08-23 [2015-10-25 ] . (原始内容存档 于2015-12-04).
^ Nethercote, Nicholas. SpiderMonkey is on a diet | Nicholas Nethercote . Blog.mozilla.com. 2011-11-01 [2013-03-21 ] . (原始内容 存档于2012-03-28).
^ JaegerMonkey – Fast JavaScript, Always! » Mystery Bail Theater . Bailopan.net. 2010-02-26 [2013-03-21 ] . (原始内容 存档于2013-03-24).
^ Paul, Ryan. Mozilla borrows from WebKit to build fast new JS engine . Ars Technica. 2010-03-09 [2013-03-21 ] . (原始内容存档 于2011-07-09).
^ 存档副本 . [2012-04-22 ] . (原始内容 存档于2011-11-14).
^ JaegerMonkey - MozillaWiki . Wiki.mozilla.org. [2013-03-21 ] . (原始内容存档 于2013-08-23).
^ David Mandelin. David Mandelin's blog . 2011-08-30 [2011-09-19 ] . (原始内容 存档于2010-12-11).
^ 759422 – Remove use of e4x in account creation . [2013-02-05 ] . (原始内容 存档于2014-04-23).
^ Platform/Features/IonMonkey - MozillaWiki . Wiki.mozilla.org. 2013-02-11 [2013-03-21 ] . (原始内容存档 于2013-03-08).
^ IonMonkey: Mozilla’s new JavaScript JIT compiler . Infoq.com. [2013-03-21 ] . (原始内容 存档于2012-12-08).
^ Firefox Notes - Desktop . Mozilla.org. 2013-01-08 [2013-03-21 ] . (原始内容存档 于2013-11-07).
^ 躲在 Firefox 18 裡的神奇離子猴 (@@") . 2013-01-09 [2013-01-09 ] . (原始内容存档 于2013-01-11).
^ Firefox Notes - Desktop . Mozilla.org. 2013-06-25 [2013-06-25 ] . (原始内容存档 于2013-10-28).
^ Bolso, Erik Inge. 2005 Text Mode Browser Roundup . Linux Journal. 2005-03-08 [2010-08-05 ] . (原始内容 存档于2010-03-15).
^ 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.
外部連結
Mozilla Labs專案 Mozilla Research專案 產品
附属機構 社群 本地社区
MozTW
Mozilla China Community
WebDINO Japan
人物 相關