SpiderMonkey

维基百科,自由的百科全书
(重定向自JaegerMonkey
跳转至: 导航搜索
SpiderMonkey
開發者 Mozilla基金会 / Mozilla公司
程式語言 C++
作業系統 跨平台
平台 IA-32, x86-64, ARM, MIPS, SPARC [1]
類型 JavaScript引擎
許可協議 MPL[2]
網站 developer.mozilla.org/en/SpiderMonkey
www.mozilla.org/js/spidermonkey

SpiderMonkey是第一款面世的JavaScript引擎,由前网景公司布兰登·艾克编写。後來由Mozilla基金会維護,以開放原始碼發佈。目前為Mozilla Firefox所使用的JavaScript引擎,並且被嵌入於許多不同的環境,例如GNOME3桌面。

目录

歷史 [编辑]

在1995年,Eich被 招聘到Netscape,目的是要他能在瀏覽器實作Scheme程式語言[3],於是他於十天內開發出JavaScript [4](當工程管理決定這個與前必須長得像JAVA時,使用Scheme的想法就被放棄[3])。之後Eich必須為這個重大的技術債務(Technical debt)付出代價,在1996年秋天Eich 留在家裡兩個禮拜,並且重寫了Mocha程式庫,也是後來大家所知道的SpiderMonkey[4]。SpiderMonkey這個名字源自於電影癟四與大頭蛋橫貫美國,電影裡的角色Tom Anderson提到,主要演員就像一對蜘蛛猴(Spider Monkey)夫妻在自慰[5],於2011年Eich將SpiderMonkey程式碼的管理交給Dave Mandelin[4]

標準 [编辑]

SpiderMonkey實作了ECMA-262第5版(ECMAScript)和許多其他加進來的特色,ECMA-357(ECMAScript for XML (E4X))已經在2013年稍早取消支援了[6]

即使SpiderMonkey被使用在Firefox,他仍然不提供一些主要環境,像是文档对象模型(DOM)。

內部 [编辑]

SpiderMonkey以CC++編寫,包含直譯器、幾個即時編譯(TraceMonkey、JagerMonkey、IonMonkey...等等)、Decompiler以及垃圾回收

TraceMonkey [编辑]

TraceMonkey採用了Adobe Tamarin計畫所開發的「Nanojit」技術,它是第一個JavaScript使用的JIT編譯器,於2008年8月23日正式公開,首次作為Firefox 3.5的SpiderMonkey中的編譯引擎,它比起Firefox 3的編譯器,提供了 高達20到40倍的效能改善 [7]

比起編譯全部的函式,TraceMonkey採用追蹤即時編譯(trace Just-in-time Compilation)將JavaScript編譯成二進位碼(Binary code)以提高執行效能,它的運作方式是在執行期間藉由追蹤和記錄控制流程資料類型,將其用於建構追蹤樹(Trace Trees),以生成高度最佳化路徑的原生碼,而「追蹤樹(Trace Trees)」是由爾灣加州大學團隊Andreas Gal、Michael Bebenita、Mason Chang和Gregor Wagner所貢獻的技術,而Andreas Gal是目前的TraceMonkey專案領導人。

JägerMonkey的增進,使得TraceMonkey被遺棄,特別是在SpiderMonkey中类型推论引擎的開發,TraceMonkey自Firefox 11開始已經被停止使用[8]

JägerMonkey [编辑]

JägerMonkey由Mozilla發展自2010年年初,在被內部被稱為MethodJIT,它是被用來改善效能,特別是在某些情況之下TraceMonkey無法生成穩定的原生碼[9][10]。JägerMonkey於Mozilla Firefox 4開始被使用,採用組合編譯(Method JIT)和組譯器(Assembler),他的組譯器是移植自WebKit的Nitro引擎(SFX,SquirrelFish Extreme)[11][12]。後期Method JIT會和TraceMonkey的Tracing JIT整合,使SpiderMonkey的速度更快。

JägerMonkey的運作與其它編譯器非常不一樣,傳統的編譯器藉由建立Control Flow Graph並將其最佳化,JägerMonkey則是透過重覆線性前進循環SpiderMonkey字节码,也就是內部函式表示法。雖然這種方式禁止重新排序指令的最佳化,但這對JavaScript這個在改變變數類型很頻繁而需要重新編譯的語言,JägerMonkey有快速編譯的優勢。

Mozilla在JägerMonkey實做了一個臨界值的最佳化,最重要的還有多形態內嵌快取( Polymorphic inline caching)及类型推论[13],在Kraken和V8测试分数显示,类型推论可以分别带来44%与30%的分数提升。[14]

TraceMonkey及JägerMonkey的JIT技術的異同在一篇hacks.mozilla.org的文章中解釋,更深入技術細節,可在一篇由SpiderMonkey的開發者Chris Leary的文章取得,更多的技術資訊可以在其它開發者的部落格中找到:dvanderdmandelin

IonMonkey [编辑]

IonMonkey是Mozilla目前採用的JavaScript JIT編譯器的名稱,它啟用了許多新的最佳化技術,但是這些特色無法在之前的JägerMonkey架構運行[15]

IonMonkey更像傳統的編譯器,他使用中間表示層(IR,Intermediate representation)的静态单赋值形式將SpiderMonkey的字节码轉換為Control Flow Graph,這個結構令其他語言使用的最佳化技術可被使用在JavaScript,其中包含形態的特殊化(type specialization)、行內函式(Inline function)、線性掃描的暫存器配置(linear scan register allocator)、移除不必要的程序(Dead code elimination)以及盡可能將程序移出迴圈外(Loop-Invariant Code Motion)[16]

這個編譯器在ARM架構X86X86-64可以快速的將JavaScript函式轉換成原生碼

IonMonkey在2013年初發行Firefox 18中開始被採用並作為預設的引擎[17],改進了TraceMonkey與JaegerMonkey不會對程式碼進行解析,自動運行最佳化的缺點。[18]

OdinMonkey [编辑]

OdinMonkey是Mozilla第四個JIT編譯器,它最佳化JavaScript的子集asm.js。最快於Firefox 22採用。

實作 [编辑]

SpiderMonkey的目的是嵌入到其他應用程序提供主機環境為JavaScript。一個不完整的名單如下:

參考資料 [编辑]

  1. ^ 1.8.8 - SpiderMonkey | MDN. Developer.mozilla.org. 2013-01-10 [2013-03-21]. 
  2. ^ Mozilla Licensing Policies, mozilla.org [March 26, 2013] 
  3. ^ 3.0 3.1 Eich, Brendan. Popularity. BrendanEich.com. 3 April 2008. 
  4. ^ 4.0 4.1 4.2 Eich, Brendan. New JavaScript Engine Module Owner. BrendanEich.com. 21 June 2011. 
  5. ^ Eich, Brendan. Mapping the Monkeysphere. 19 August 2011. 
  6. ^ 759422 – Remove use of e4x in account creation. [05 February 2013]. 
  7. ^ Paul, Ryan. Firefox to get massive JavaScript performance boost. Ars Technica. 2008-08-22 [2013-03-21]. 
  8. ^ Nethercote, Nicholas. SpiderMonkey is on a diet | Nicholas Nethercote. Blog.mozilla.com. 2011-11-01 [2013-03-21]. 
  9. ^ JaegerMonkey – Fast JavaScript, Always! » Mystery Bail Theater. Bailopan.net. 2010-02-26 [2013-03-21]. 
  10. ^ Paul, Ryan. Mozilla borrows from WebKit to build fast new JS engine. Ars Technica. 2010-03-09 [2013-03-21]. 
  11. ^ Mozilla borrows from WebKit to build fast new JS engine
  12. ^ [1]
  13. ^ JaegerMonkey - MozillaWiki. Wiki.mozilla.org. [2013-03-21]. 
  14. ^ David Mandelin. David Mandelin's blog. 2011-08-30. 
  15. ^ Platform/Features/IonMonkey - MozillaWiki. Wiki.mozilla.org. 2013-02-11 [2013-03-21]. 
  16. ^ IonMonkey: Mozilla’s new JavaScript JIT compiler. Infoq.com. [2013-03-21]. 
  17. ^ Firefox Notes - Desktop. Mozilla.org. 2013-01-08 [2013-03-21]. 
  18. ^ 躲在 Firefox 18 裡的神奇離子猴 (@@"). 2013-01-09 [2013-01-09]. 

外部連結 [编辑]