歷史發展
在2008年到2009年的第二次瀏覽器大戰之前, JavaScript引擎( JavaScript engine)僅簡單地被當作能閱讀執行JavaScript原始碼的解釋器。
第一款JavaScript引擎由布蘭登·艾克在網景公司開發,用於Netscape Navigator網頁瀏覽器中。引擎的名字叫做SpiderMonkey,由C實現。它自JavaScript 1.5升級以符合ECMA-262 版本3。Rhino引擎,由網景公司的Norris Boyd開發,由Java實現。像SpiderMonkey一樣,Rhino符合ECMA-262 版本3。JavaScript引擎的套用例子還包括: Apple Safari4的Nitro,Chrome瀏覽器的V8和 Mozilla Firefox 3.5的TraceMonkey。
目前為止,最通用的JavaScript宿主環境是網頁瀏覽器。網頁瀏覽器一般使用公共的API創建“宿主對象”以便於在JavaScript中支持DOM。
網頁伺服器是另一種通過的應用程式引擎。一個JavaScript伺服器能夠處理HTTP請求並回應,這樣JavaScript程式能動態生成頁面。微軟用於IIS中ASP技術允許伺服器端代碼以VB Script或JScript(微軟的JavaScript實現)寫成。Jaxer是以JavaScript編寫成的網頁伺服器,這有利於在伺服器端和客戶端使用同樣的代碼。
引擎套用
主要的網頁瀏覽器JavaScript引擎:
Mozilla
SpiderMonkey,第一款JavaScript引擎,由Brendan Eich在Netscape Communications時編寫,用於Mozilla Firefox 1.0~3.0版本。
Rhino,由Mozilla基金會管理,開放原始碼,完全以Java編寫。
TraceMonkey,基於實時編譯的引擎,其中部份代碼取自Tamarin引擎,用於Mozilla Firefox 3.5~3.6版本。
JaegerMonkey,德文Jäger原意為獵人,結合追蹤和組合碼技術大幅提高性能,部分技術借鑿了V8、JavaScriptCore、WebKit,用於Mozilla Firefox 4.0以上版本。
V8,開放原始碼,由Google丹麥開發,是Chrome瀏覽器的一部分。
微軟
Chakra (JScript引擎),中文譯名為查克拉,用於Internet Explorer 9的32位版本。
Opera
Linear A,用於Opera 4.0~6.1版本。
Linear B,用於Opera 7.0~9.2版本。
Futhark,用於Opera 9.5~10.2版本。
Carakan,由Opera軟體公司編寫,自Opera10.50版本開始使用。
其它
KJS,KDE的ECMAScript/JavaScript引擎,最初由Harri Porten開發,用於KDE項目的Konqueror網頁瀏覽器中。
Narcissus,開放原始碼,由Brendan Eich編寫(他也參與編寫了第一個SpiderMonkey)。
Tamarin,由Adobe Labs編寫,Flash Player 9所使用的引擎。
Nitro(原名SquirrelFish),為Safari 4編寫。
性能演化
2008年5月11日,Mozilla採用PGO(Profile-guided Optimizations)特性指引最佳化,使Firefox 3.0的性能大幅提升。2009年6月30日發布的Firefox 3.5使用了Tracing和Nanojit技術,能“在某些情況下的速度提升20到40倍”,其中Nanojit的代碼由Adobe貢獻。
2008年6月2日,WebKit開發團隊聲明了SquirrelFish——一個新的JavaScript引擎能極大地提升Safari解釋腳本的速度。該引擎是Safari 4其中一個新特性,在2008年6月11日發布給程式設計師使用;最終此JavaScript引擎被稱為Nitro。
在瀏覽器開發者之間展開了一場開發更快的JavaScript引擎的競賽。2008年,Chrome瀏覽器因它的JavaScript性能而被受稱讚,但是其它瀏覽器馬上使用了更快的JavaScript引擎。之後,Chrome瀏覽器在性能上獲得領先,其長處在於它高速的性能和JavaScript的處理速度,這些都由許多網站在主要的瀏覽器之間的速度測試中得到驗證。隨著WebKit的Squirrelfish Extreme和Mozilla的TraceMonkey JavaScript虛擬機 出現,Chrome的JavaScript執行速度就被超越了。Google丹麥在Chrome 2中開發了更快速的V8引擎。
一個典型的瀏覽器有一個圖形引擎和一個獨立的JavaScript引擎。這樣JavaScript引擎能夠被更方便的測試、重新生成或者在另一些項目中使用。例如Carakan被用在Presto中,Nitro被用在WebKit中,SpiderMonkey被用在Gecko中,KJS被用在KHTML中,Rhino默認不包含任何布局引擎。但還有其他組合,例如V8與WebKit被用於Chrome瀏覽器中。JavaScript引擎能為程式設計師提供部分操作瀏覽器的功能(網路、DOM、外部事件、HTML5視頻、canvas和存儲)。
Sunspider是一個JavaScript實用基準測試通過一系列關於JavaScript語言的腳本測試JavaScript引擎的速度。Sunspider不測試無關於JavaScript的特性(不使用HTML、CSS和無網路情況下)。
實現
參見:ECMAScript引擎列表 JavaScript是一種ECMAScript方言,在許多程式中得以實現,特別是在網頁瀏覽器。這些方言通常擴展了語言,或者標準庫和相關API,例如W3C定義的DOM。這意味著以一種方言實現的程式不兼容於另一種方言的實現,除非程式使用了方言中的公共子集所具有的特性和API。
在實現和方言中存在著一些差別。一種語言的方言有一些與語言不同的地方。實現能夠執行該語言或方言編寫的程式。
應用程式(實現) | 方言和最後版本 | ECMAScript版本 |
Chrome瀏覽器,V8引擎 | JavaScript | ECMA-262,版本3 |
Mozilla Firefox,Gecko排版引擎,SpiderMonkey和Rhino | JavaScript 1.8.1 | ECMA-262,版本3 |
Opera | 一些JavaScript 1.5特性及一些JScript擴展 | ECMA-262,版本3 |
KHTML排版引擎,KDE項目的Konqueror與蘋果的Safari | JavaScript 1.5 | ECMA-262,版本3 |
Adobe Acrobat | JavaScript 1.5 | ECMA-262,版本3 |
OpenLaszlo Platform | JavaScript 1.4 | ECMA-262,版本3 |
Max/MSP | JavaScript 1.5 | ECMA-262,版本3 |
ANT Galio 3 | JavaScript 1.5附帶RMAI擴展 | ECMA-262,版本3 |