TraceMonkey

**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?（頁面存檔備份，存於網際網路檔案館）—— 官方基準和比較