本页使用了标题或全文手工转换

SpiderMonkey

维基百科,自由的百科全书
跳转至: 导航搜索
SpiderMonkey
開發者 Mozilla基金会Mozilla公司
開發狀態 開發中
编程语言 CC++
操作系统 跨平台
系統平台 IA-32x86-64ARMMIPSSPARC[1]
类型 JavaScript引擎
许可协议 MPL[2]
網站 developer.mozilla.org/en/SpiderMonkey

SpiderMonkey是第一款問世的JavaScript引擎,由前网景公司布兰登·艾克設計,後期由Mozilla基金会維護,以開放原始碼發佈。目前為Mozilla Firefox網頁瀏覽器所使用的JavaScript引擎,並且被嵌入於許多不同的環境,例如:GNOME 3桌面。

歷史[编辑]

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

TraceMonkey[编辑]

TraceMonkey是最早使用JavaScript編寫的JIT編譯器,發表於2008年8月23日,首次作為Firefox 3.5的SpiderMonkey中的編譯引擎,它比起Firefox 3.0的編譯器,提供了高達20到40倍的效能改善[6]

比起編譯全部的函式,TraceMonkey採用追蹤即時編譯(trace Just-in-time Compilation)將JavaScript編譯成二進位碼(Binary code)以提高執行效能,它的運作方式是在執行期間藉由追蹤和記錄控制流程資料類型,將其用於建構追蹤樹(Trace Trees),以生成高度最佳化路徑的原生碼,追蹤樹技術乃由爾灣加州大學研究團隊所貢獻,安德里亞斯·加爾是該團隊的領導人[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]。後期Method JIT會和TraceMonkey的Tracing JIT整合,使SpiderMonkey的速度更快。

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

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

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

標準[编辑]

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

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

內部[编辑]

SpiderMonkey由CC++編寫,並包含直譯器、IonMonkey即時編譯垃圾回收器

IonMonkey[编辑]

IonMonkey是Mozilla的第三個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用於最佳化JavaScript的子集asm.js,OdinMonkey並非一個JIT編譯器,他依然採用IonMonkey作為編譯器,於2013年6月25日正式釋出的Firefox 22採用[19]

實作[编辑]

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, [2013-03-26] 
  3. ^ 3.0 3.1 Eich, Brendan. Popularity. BrendanEich.com. 2008-04-03. 
  4. ^ 4.0 4.1 4.2 Eich, Brendan. New JavaScript Engine Module Owner. BrendanEich.com. 2011-06-21. 
  5. ^ Eich, Brendan. Mapping the Monkeysphere. 2011-08-19. 
  6. ^ Paul, Ryan. Firefox to get massive JavaScript performance boost. Ars Technica. 2008-08-22 [2013-03-21]. 
  7. ^ TraceMonkey: JavaScript Lightspeed. BrendanEich.com. 2008-08-23. 
  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. ^ [1]
  12. ^ JaegerMonkey - MozillaWiki. Wiki.mozilla.org. [2013-03-21]. 
  13. ^ David Mandelin. David Mandelin's blog. 2011-08-30. 
  14. ^ 759422 – Remove use of e4x in account creation. [2013-02-05]. 
  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]. 
  19. ^ Firefox Notes - Desktop. Mozilla.org. 2013-06-25 [2013-06-25]. 
  20. ^ Bolso, Erik Inge. 2005 Text Mode Browser Roundup. Linux Journal. 2005-03-08 [2010-08-05]. 
  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 [...] 

外部連結[编辑]