Lars Bak是這個(gè)項(xiàng)目的組長(zhǎng),目前該JavaScript引擎已用于其它項(xiàng)目的開發(fā)。第一個(gè)版本隨著第一個(gè)版本的Google Chrome于2008年9月2日發(fā)布。
基本介紹
V8使用C++開發(fā),并在谷歌瀏覽器中使用。在運(yùn)行ECMAScript之前,相比其它的JavaScript的引擎轉(zhuǎn)換成字節(jié)碼或解釋執(zhí)行,V8將其編譯成原生機(jī)器碼(IA-32, x86-64, ARM, or MIPS CPUs),并且使用了如內(nèi)聯(lián)緩存(inline caching)等方法來(lái)提高性能。有了這些功能,JavaScript程序在V8引擎下的運(yùn)行速度媲美二進(jìn)制程序。V8中實(shí)現(xiàn)的ECMAScript中指定ECMA-262,第3版運(yùn)行在Windows XP和Windows Vista, MacOS X的10.5(雪豹)和Linux使用IA-32或ARM處理器。V8可以獨(dú)立運(yùn)行,也可以嵌入到任何C++應(yīng)用程序。項(xiàng)目托管在谷歌 Code上,基于BSD協(xié)議,任何組織或個(gè)人可以將其源碼用于自己的項(xiàng)目中。
歷史
Google為其Google Chrome創(chuàng)建了V8,兩者均于2008年首次發(fā)布。V8的首席開發(fā)人員是Lars Bak ,它因強(qiáng)大的汽車引擎而得名。多年來(lái),Chrome 執(zhí)行ECMAScript 的速度比其他瀏覽器更快。
V8匯編器基于Strongtalk匯編器。 2010 年 12 月 7 日,發(fā)布了名為 Crankshaft 的新編譯基礎(chǔ)架構(gòu),速度有所提高。在 2015 年的 Chrome 41 版本中,添加了 TurboFan 項(xiàng)目,以便為以前具有挑戰(zhàn)性的工作負(fù)載(例如asm.js )提供更多性能改進(jìn)。V8 的大部分開發(fā)都受到Sun Microsystems開發(fā)的Java HotSpot 虛擬機(jī)的強(qiáng)烈啟發(fā),較新的執(zhí)行管道與 HotSpot 的執(zhí)行管道相似。
對(duì)新WebAssembly語(yǔ)言的支持于 2015 年開始。
2016年,V8中添加了Ignition解釋器,設(shè)計(jì)目標(biāo)是與TurboFan和Crankshaft相比,減少小內(nèi)存Android手機(jī)的內(nèi)存使用量。 Ignition 是一個(gè)基于寄存器的機(jī)器,與 HotSpot 使用的模板解釋器具有相似(盡管不完全相同)的設(shè)計(jì)。
2017年,V8發(fā)布了全新的編譯器管道,由Ignition(解釋器)和TurboFan(優(yōu)化編譯器)組成。從 V8 版本 5.9 開始,V8 中不再使用 Full-codegen(早期基線編譯器)和 Crankshaft 來(lái)執(zhí)行 ECMAScript,因?yàn)閳F(tuán)隊(duì)認(rèn)為他們不再能夠跟上新的 JavaScript 語(yǔ)言功能以及這些功能所需的優(yōu)化。
2021 年,隨著 SparkPlug 編譯器的發(fā)布,引入了新的分層編譯管道,它補(bǔ)充了 V8 中現(xiàn)有的 TurboFan 編譯器,與 HotSpot 使用的分析 C1 編譯器直接并行。
2023 年,添加了基于 Maglev SSA的編譯器,它比 Sparkplug 慢 10 倍,但比 TurboFan 快 10 倍,彌補(bǔ)了 Sparkplug 和 TurboFan 之間的差距,適用于頻率較低的運(yùn)行循環(huán),這些循環(huán)的“熱”程度不足以通過(guò)TurboFan,就像大多數(shù) Web 應(yīng)用程序的情況一樣,它們與瀏覽器交互的時(shí)間多于 ECMAScript 執(zhí)行的時(shí)間。
設(shè)計(jì)
V8引擎的設(shè)計(jì)受到了Sun Microsystems開發(fā)的Java HotSpot虛擬機(jī)的啟發(fā),特別是在新的執(zhí)行管道方面,它與HotSpot的設(shè)計(jì)非常相似。2010年,V8引入了Crankshaft編譯基礎(chǔ)設(shè)施,以提高執(zhí)行速度。2015年,為了進(jìn)一步提升性能,尤其是對(duì)于如asm.js這樣的復(fù)雜工作負(fù)載,V8添加了TurboFan項(xiàng)目。2016年,為了在內(nèi)存受限的Android手機(jī)上減少內(nèi)存使用,V8引入了Ignition解釋器。2017年,V8發(fā)布了包括Ignition(解釋器)和TurboFan(優(yōu)化編譯器)的全新編譯器管道,取代了Full-codegen和Crankshaft。2021年,V8引入了SparkPlug編譯器,進(jìn)一步優(yōu)化了編譯管道。
V8的執(zhí)行過(guò)程首先是使用自己的解析器生成抽象語(yǔ)法樹,然后Ignition解釋器從這個(gè)語(yǔ)法樹生成字節(jié)碼,最后TurboFan將字節(jié)碼編譯成機(jī)器碼。V8的即時(shí)編譯技術(shù)允許它在執(zhí)行前將ECMAScript編譯成本地機(jī)器碼,并根據(jù)代碼的執(zhí)行情況動(dòng)態(tài)進(jìn)行優(yōu)化和重新優(yōu)化。V8的垃圾收集器是一種分代增量收集器,旨在優(yōu)化內(nèi)存管理。
V8不僅可以在瀏覽器中使用,還可以集成到獨(dú)立項(xiàng)目中,例如Couchbase數(shù)據(jù)庫(kù)服務(wù)器、Deno運(yùn)行環(huán)境、Electron桌面應(yīng)用程序框架、MarkLogic數(shù)據(jù)庫(kù)服務(wù)器、NativeScript移動(dòng)應(yīng)用程序框架、Node.js運(yùn)行環(huán)境和Qt Quick運(yùn)行環(huán)境。此外,V8還被移植到了PowerPC和IBM 歐洲航天局/390架構(gòu)上。Firefox瀏覽器也將V8的部分功能移植到了其正則表達(dá)式解析器中。
運(yùn)作方式
V8在執(zhí)行之前將ECMAScript編譯成了機(jī)器代碼,而非字節(jié)碼或是解釋執(zhí)行它,以此提升性能。更進(jìn)一步,使用了如內(nèi)聯(lián)緩存(inline caching)等方法來(lái)提高性能。有了這些功能,JavaScript程序與V8引擎的速度媲美二進(jìn)制編譯。
傳統(tǒng)的Javascript是動(dòng)態(tài)語(yǔ)言,又可稱之為Prototype-based Language,JavaScript繼承方法是使用prototype,透過(guò)指定prototype屬性,便可以指定要繼承的目標(biāo)。屬性可以在運(yùn)行時(shí)添加到或從對(duì)象中刪除,引擎會(huì)為執(zhí)行中的對(duì)象建立一個(gè)屬性字典,新的屬性都要透過(guò)字典查找屬性在內(nèi)存中的位置。V8為object新增屬性的時(shí)候,就以上次的hidden class為父類別,創(chuàng)建新屬性的hidden class的子類別,如此一來(lái)屬性訪問(wèn)不再需要?jiǎng)討B(tài)字典查找了。
為了縮短由垃圾回收造成的停頓,V8使用stop-the-world, generational, accurate的垃圾回收器。在執(zhí)行回收之時(shí)會(huì)暫時(shí)中斷程序的執(zhí)行,而且只處理對(duì)象堆棧。還會(huì)收集內(nèi)存內(nèi)所有對(duì)象的指針,可以避免內(nèi)存溢出的情況。V8匯編器是基于Strongtalk匯編器。
參考資料 >