SpiderMonkey

SpiderMonkey是世界上第一款JavaScript引擎，由前网景公司的布兰登·艾克設計，後期由Mozilla基金会維護，以開放原始碼發佈。目前為Mozilla Firefox網頁瀏覽器所使用的JavaScript引擎，並也被嵌入到其他許多環境，例如GNOME 3桌面。 1995年，艾克被招聘到Netscape，目的是让他在瀏覽器中實作Scheme程式語言，於是他於10天內開發出JavaScript （當工程管理決定這個程式語言必須長得像Java時，使用Scheme的想法被放棄）。之後艾克必須為這個重大的技術負債付出代價，在1996年秋天，艾克留在家裡兩個禮拜，並且重寫了Mocha程式庫，也是後來大家所知道的SpiderMonkey。SpiderMonkey這個名字源自於電影癟四與大頭蛋横贯美国，電影裡的角色Tom Anderson提到，主要演員就像一對蜘蛛猴（Spider Monkey）夫妻在自慰。2011年，艾克將SpiderMonkey程式碼的管理交給戴夫·曼達林（Dave Mandelin）。 TraceMonkey是第一个为JavaScript语言編寫的JIT編譯器，於2008年8月23日发布并最先作為Firefox 3.5的SpiderMonkey中的編譯引擎。相比Firefox 3.0的編譯器，它提供了高達20到40倍的效能改善。 比起編譯全部函式，TraceMonkey採用追蹤即時編譯（trace Just-in-time Compilation）將JavaScript編譯成二進位碼（Binary code）以提高執行效能，它的運作方式是在執行期間藉由追蹤和記錄控制流程及資料類型，將其用於建構追蹤樹（Trace Trees）（页面存档备份，存于互联网档案馆），以生成高度最佳化路徑的原生碼，追蹤樹技術由爾灣加州大學研究團隊貢獻，安德里亞斯·加爾是該團隊的负责人。 JägerMonkey的增進，使得TraceMonkey被遺棄，特別是在SpiderMonkey中类型推论引擎的開發，TraceMonkey自Firefox 11開始已經被停止使用。 JägerMonkey由Mozilla自2010年年初开发，在內部被稱為MethodJIT，它被用來改善效能，特別是当某些情況下TraceMonkey無法生成穩定的原生碼。JägerMonkey於Mozilla Firefox 4開始被使用，採用組合編譯（Method JIT）和組譯器（Assembler），它的組譯器移植自WebKit的Nitro引擎（SFX，SquirrelFish Extreme）。後期Method JIT与TraceMonkey的Tracing JIT整合，使SpiderMonkey的速度更快。 JägerMonkey的運作很不同于其他編譯器，傳統的編譯器是藉由建立控制流圖並將其最佳化，JägerMonkey則是透過重覆線性前進循環SpiderMonkey字节码，也就是內部函式表示法。雖然這種方式阻碍重新排序指令的最佳化，但這對JavaScript這個经常改變變數類型而需要重新編譯的語言来说，JägerMonkey有快速編譯的優勢。 Mozilla在JägerMonkey中實做了一個臨界值的最佳化，重要的還有多形態內嵌快取（ Polymorphic inline caching）及类型推论，Kraken和V8测试分数显示，类型推论可以分别带来44%与30%的分数提升。 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年取消支援。 即便SpiderMonkey在Firefox中被使用，它并不提供一些主要環境，像是文档对象模型（DOM）。 SpiderMonkey是以C和C++语言編寫，並包含直譯器、IonMonkey即時編譯和垃圾回收器。 IonMonkey是Mozilla的第三個JIT編譯器，它啟用了許多新的最佳化技術，但是這些特色無法在之前的JägerMonkey架構運行。 IonMonkey更像傳統的編譯器，它使用中間表示層（IR，Intermediate representation）的静态单赋值形式將SpiderMonkey的字节码轉換為控制流圖（Control Flow Graph），這個結構令其他語言使用的最佳化技術可被使用在JavaScript，其中包含形態的特殊化（type specialization）、行內函式（Inline function）、線性掃描的暫存器配置（linear scan register allocator）、死碼刪除（Dead code elimination）以及盡可能將程序移出迴圈外（Loop-Invariant Code Motion）。 该編譯器可以在ARM、X86及X86-64上快速的將JavaScript函式轉換成原生碼。 2013年初發行的Firefox 18中開始採用IonMonkey並将其作為預設引擎，这改進了TraceMonkey與JaegerMonkey不會對程式碼進行解析、自動運行最佳化的缺點。。 OdinMonkey被用於最佳化JavaScript的子集asm.js，OdinMonkey並非一個JIT編譯器，它依然採用IonMonkey作為編譯器，这於2013年6月25日正式釋出的Firefox 22起採用。 SpiderMonkey可被嵌入於應用程式中，並为應用程式提供執行JavaScript的能力。不完整名單如下： Mozilla Firefox、Thunderbird、SeaMonkey Adobe Acrobat、Adobe Reader、Adobe Flash Professional、Adobe Dreamweaver GNOME桌面環境，第3版和更高版本 Yahoo! Widgets UOX 3，網路創世紀私人伺服器 FreeSWITCH，開放原始碼通信軟體 0 A.D.，即時戰略遊戲 ELinks（英语：ELinks），純文字網頁瀏覽器 Synchronet（英语：Synchronet），BBS、電子郵件和伺服器軟體 SpiderMonkey亦提供了JavaScript Shell，它是一個互動式開發環境，可讓開發者使用命令列來執行JavaScript程式。 許多大型組織使用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）  Eich, Brendan. Popularity. BrendanEich.com. 2008-04-03 [2013-01-24]. （原始内容存档于2011-07-03）.  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.  官方网站 Are We Fast Yet?（页面存档备份，存于互联网档案馆）——官方基準和比較