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

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

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

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

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，純文字網頁瀏覽器

* Synchronet，BBS、電子郵件和伺服器軟體

SpiderMonkey 亦提供了 JavaScript Shell，它是一個互動式開發環境，可讓開發者使用命令列來執行 JavaScript 程式。
許多大型組織使用 SpiderMonkey 來管理他們前端應用程式的 JavaScript。



參考資料



外部連結


* 官方網站

* Are We Fast Yet?（頁面存檔備份，存於網際網路檔案館）—— 官方基準和比較