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以C及C++編寫,包含直譯器、幾個即時編譯(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的文章取得,更多的技術資訊可以在其它開發者的部落格中找到:dvander、dmandelin。
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架構、X86及X86-64可以快速的將JavaScript函式轉換成原生碼。
IonMonkey在2013年初發行Firefox 18中開始被採用並作為預設的引擎[17],改進了TraceMonkey與JaegerMonkey不會對程式碼進行解析,自動運行最佳化的缺點。[18]。
OdinMonkey [编辑]
OdinMonkey是Mozilla第四個JIT編譯器,它最佳化JavaScript的子集asm.js。最快於Firefox 22採用。
實作 [编辑]
SpiderMonkey的目的是嵌入到其他應用程序提供主機環境為JavaScript。一個不完整的名單如下:
- Mozilla Firefox、Thunderbird、SeaMonkey
- Adobe Acrobat、Adobe Reader、Adobe Flash Professional、Adobe Dreamweaver
- GNOME桌面環境,第3版和更高版本
- Yahoo! Widgets
- 0_A.D.
參考資料 [编辑]
- ^ 1.8.8 - SpiderMonkey | MDN. Developer.mozilla.org. 2013-01-10 [2013-03-21].
- ^ Mozilla Licensing Policies, mozilla.org [March 26, 2013]
- ^ 3.0 3.1 Eich, Brendan. Popularity. BrendanEich.com. 3 April 2008.
- ^ 4.0 4.1 4.2 Eich, Brendan. New JavaScript Engine Module Owner. BrendanEich.com. 21 June 2011.
- ^ Eich, Brendan. Mapping the Monkeysphere. 19 August 2011.
- ^ 759422 – Remove use of e4x in account creation. [05 February 2013].
- ^ Paul, Ryan. Firefox to get massive JavaScript performance boost. Ars Technica. 2008-08-22 [2013-03-21].
- ^ Nethercote, Nicholas. SpiderMonkey is on a diet | Nicholas Nethercote. Blog.mozilla.com. 2011-11-01 [2013-03-21].
- ^ JaegerMonkey – Fast JavaScript, Always! » Mystery Bail Theater. Bailopan.net. 2010-02-26 [2013-03-21].
- ^ Paul, Ryan. Mozilla borrows from WebKit to build fast new JS engine. Ars Technica. 2010-03-09 [2013-03-21].
- ^ Mozilla borrows from WebKit to build fast new JS engine
- ^ [1]
- ^ JaegerMonkey - MozillaWiki. Wiki.mozilla.org. [2013-03-21].
- ^ David Mandelin. David Mandelin's blog. 2011-08-30.
- ^ Platform/Features/IonMonkey - MozillaWiki. Wiki.mozilla.org. 2013-02-11 [2013-03-21].
- ^ IonMonkey: Mozilla’s new JavaScript JIT compiler. Infoq.com. [2013-03-21].
- ^ Firefox Notes - Desktop. Mozilla.org. 2013-01-08 [2013-03-21].
- ^ 躲在 Firefox 18 裡的神奇離子猴 (@@"). 2013-01-09 [2013-01-09].
外部連結 [编辑]
- arewefastyet.com — 官方SpiderMonkey效能趨勢圖
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||