SpiderMonkey

维基百科,自由的百科全书
跳转至: 导航搜索
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引擎,並且被嵌入於許多不同的環境,例如:GNOME 3桌面。

歷史[编辑]

在1995年,Eich被招聘到Netscape,目的是要他能在瀏覽器實作Scheme程式語言[3],於是他於10天內開發出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]

TraceMonkey[编辑]

TraceMonkey是第一個使用JavaScript的JIT編譯器,於2008年8月23日正式公開,首次作為Firefox 3.5的SpiderMonkey中的編譯引擎,它比起Firefox 3的編譯器,提供了 高達20到40倍的效能改善 [6]

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

早在開發TraceMonkey之前,Eich曾於2006年和V8引擎開發團隊接觸,非常希望V8引擎能夠開源,並且完全整合到Firefox,甚至取代SpiderMonkey的想法,但由於當時Adobe正在考慮將Tamarin專案交給Mozilla,基於多多益善的想法於是便放棄了。[7]

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

標準[编辑]

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

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

內部[编辑]

SpiderMonkey以CC++編寫,包含直譯器、IonMonkey即時編譯、Decompiler和垃圾回收

IonMonkey[编辑]

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

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

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

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

OdinMonkey[编辑]

OdinMonkey用於最佳化JavaScript的子集asm.js,OdinMonkey並非一個JIT編譯器,他依然採用IonMonkey作為編譯器,於2013年6月25日正式釋出的Firefox 22採用[20]

實作[编辑]

SpiderMonkey可被嵌入於應用程式中,並提供應用程式可執行Javascript的能力。一個不完整的名單如下:

SpiderMonkey亦提供了JavaScript Shell,他是一個互動式開發環境,可讓開發者使用命令列來執行JavaScript程式[21]。 許多大型組織使用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. ^ Paul, Ryan. Firefox to get massive JavaScript performance boost. Ars Technica. 2008-08-22 [2013-03-21]. 
  7. ^ https://brendaneich.com/2011/06/new-javascript-engine-module-owner/
  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. ^ 759422 – Remove use of e4x in account creation. [05 February 2013]. 
  16. ^ Platform/Features/IonMonkey - MozillaWiki. Wiki.mozilla.org. 2013-02-11 [2013-03-21]. 
  17. ^ IonMonkey: Mozilla’s new JavaScript JIT compiler. Infoq.com. [2013-03-21]. 
  18. ^ Firefox Notes - Desktop. Mozilla.org. 2013-01-08 [2013-03-21]. 
  19. ^ 躲在 Firefox 18 裡的神奇離子猴 (@@"). 2013-01-09 [2013-01-09]. 
  20. ^ Firefox Notes - Desktop. Mozilla.org. 2013-06-25 [2013-06-25]. 
  21. ^ Introduction to the JavaScript shell. MDN. Mozilla Developer Network. 2010-09-29 [2010-12-14]. "The JavaScript shell is a command-line program included in the SpiderMonkey source distribution. [...] You can use it as an interactive shell [...] You can also pass in, on the command line, a JavaScript program file to run [...]" 

外部連結[编辑]