溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

javascript依賴(lài)的支持是什么

發(fā)布時(shí)間:2022-09-30 15:35:53 來(lái)源:億速云 閱讀:133 作者:iii 欄目:web開(kāi)發(fā)

這篇“javascript依賴(lài)的支持是什么”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“javascript依賴(lài)的支持是什么”文章吧。

javascript依賴(lài)于底層javascript引擎的支持。javascript運(yùn)行在瀏覽器,主要依靠瀏覽器的js引擎解釋執(zhí)行js代碼;JavaScript引擎是一個(gè)專(zhuān)門(mén)處理JavaScript腳本的虛擬機(jī),一般會(huì)附帶在網(wǎng)頁(yè)瀏覽器之中,用于解釋和執(zhí)行js腳本。

本教程操作環(huán)境:windows7系統(tǒng)、javascript1.8.5版、Dell G3電腦。

javascript依賴(lài)于底層js引擎的支持。

javascript運(yùn)行在瀏覽器,主要依靠瀏覽器的js引擎解釋執(zhí)行js代碼。其他帶有js引擎的軟件也可以運(yùn)行js,但是一般js和網(wǎng)頁(yè)關(guān)系較大,所以一般在瀏覽器當(dāng)中運(yùn)行。

javascript引擎

JavaScript引擎是一個(gè)專(zhuān)門(mén)處理JavaScript腳本的虛擬機(jī),一般會(huì)附帶在網(wǎng)頁(yè)瀏覽器之中,用于解釋和執(zhí)行js腳本。

著名的js引擎:

    Mozilla:SpiderMonkey引擎,世界第一款JavaScript引擎,有C/C++編寫(xiě),用于Mozilla Firefox 1.0~3.0版本

    Google:V8引擎,由C++/匯編語(yǔ)言編寫(xiě),用于chrome瀏覽器

    微軟:Chakra(查克拉,笑)引擎,用于Internet Explorer 9的32位版本

瀏覽器內(nèi)核和JS引擎的關(guān)系

以webkit為例:

javascript依賴(lài)的支持是什么

V8引擎

1、V8引擎的原理

V8引擎是用C++編寫(xiě)的Google開(kāi)源高性能的JavaScript和WebAssembly引擎,用于Chrome和Node.js等。

它能夠?qū)崿F(xiàn)ECMAScript和WebAssembly,并在Windows7或者更高版本,macOS 10.12+和使用x64,IA-32,ARM或MIPS處理器的Linux系統(tǒng)上運(yùn)行。

V8引擎可以獨(dú)立運(yùn)行,也可以嵌入到任何C++應(yīng)用程序中運(yùn)行。例如,可以將V8引擎中使用Node.js看做是將將V8引擎嵌入到了應(yīng)用程序中,那么Node.js就具備了執(zhí)行JavaScript代碼的能力。

原理圖:

javascript依賴(lài)的支持是什么

①、Parse模塊會(huì)將JavaScript代碼轉(zhuǎn)換成AST,這是因?yàn)榻忉屍鞑⒉恢苯诱J(rèn)識(shí)JavaScript代碼。如果函數(shù)沒(méi)有被調(diào)用,是不會(huì)被轉(zhuǎn)換為AST的

②、Ignition是一個(gè)解釋器,會(huì)將AST轉(zhuǎn)換為ByteCode。同時(shí)會(huì)收集TurboFan優(yōu)化所需的信息(比如函數(shù)參數(shù)的類(lèi)型信息,有了類(lèi)型才能真實(shí)的運(yùn)算)。如果函數(shù)只調(diào)用一次,Ignition將AST轉(zhuǎn)換為ByteCode

③、為什么最后轉(zhuǎn)化為字節(jié)碼,而不是直接轉(zhuǎn)化為機(jī)器碼?

因?yàn)镴S代碼在什么樣的環(huán)境下執(zhí)行并不固定,有可能是使用Windows環(huán)境、或者是mac環(huán)境、或者是Linux環(huán)境的瀏覽器上,也可能是在Node.js中,環(huán)境不固定,不同環(huán)境中就會(huì)有不同的CPU,不同的CPU擁有不同的CPU架構(gòu),不同的架構(gòu)能夠執(zhí)行的機(jī)器指令是不一樣的。

javascript依賴(lài)的支持是什么

轉(zhuǎn)化為V8引擎規(guī)定好的字節(jié)碼,不管在什么環(huán)境下都可以執(zhí)行,是跨平臺(tái)的,最后V8引擎會(huì)把字節(jié)碼轉(zhuǎn)化匯編指令,再轉(zhuǎn)化為不同環(huán)境對(duì)應(yīng)的CPU指令。

但是每次都走這套流程,還是不夠方便。比如有一個(gè)函數(shù)是重復(fù)使用的,但是使用前面一套流程,每次使用這個(gè)函數(shù)的時(shí)候,都需要被轉(zhuǎn)化為字節(jié)碼,然后再變?yōu)镃PU指令,性能比較低,如果可以直接將這個(gè)函數(shù)變?yōu)闄C(jī)器指令保存下來(lái),使用這個(gè)函數(shù)的時(shí)候,直接運(yùn)行機(jī)器指令,性能比較高,但是如果這個(gè)函數(shù)只運(yùn)行一次,就沒(méi)有必要轉(zhuǎn)化變?yōu)闄C(jī)器代碼保存下來(lái),會(huì)浪費(fèi)空間。

④、使用TurboFan庫(kù),是一個(gè)編譯器,會(huì)將字節(jié)碼編譯為CPU可以直接執(zhí)行的機(jī)器碼,他可以利用ignition來(lái)收集函數(shù)的執(zhí)行信息,了解到哪些函數(shù)執(zhí)行次數(shù)比較多,會(huì)將這類(lèi)函數(shù)標(biāo)記為hot ,熱函數(shù),然后就會(huì)將這個(gè)函數(shù)轉(zhuǎn)換為優(yōu)化之后的機(jī)器指令,以后再使用這個(gè)熱函數(shù)的時(shí)候,不需要上面繁瑣的過(guò)程,直接執(zhí)行機(jī)器指令就行。

但是實(shí)際上機(jī)器碼也會(huì)被還原為ByteCode,這是因?yàn)槿绻罄m(xù)執(zhí)行函數(shù)的過(guò)程中,類(lèi)型發(fā)生改變,之前優(yōu)化的機(jī)器碼并不能正確地處理運(yùn)算,就會(huì)逆向的轉(zhuǎn)換為字節(jié)碼。

⑤、Deoptimization: 比如有一個(gè)函數(shù)

function  sum(num1,num2){
   num1+num2
}

調(diào)用sum函數(shù)

sum(20,30)
sum(28,30)

如果傳入數(shù)字,調(diào)用sum函數(shù),需要做的工作就是對(duì)兩個(gè)數(shù)字進(jìn)行相加,執(zhí)行的機(jī)器指令永遠(yuǎn)是對(duì)這兩個(gè)數(shù)字進(jìn)行相加.
一旦改變傳入值的類(lèi)型,如果變成字符串,那么這個(gè)函數(shù)的意思就是兩個(gè)字符串拼接。

sum("aaa","bbb")

這兩種類(lèi)型的傳入值執(zhí)行“+”操作對(duì)應(yīng)的機(jī)器指令是不同的,JavaScript是不會(huì)對(duì)傳入值的類(lèi)型做檢測(cè)的,那么還是使用數(shù)字相加的機(jī)器指令,這次函數(shù)調(diào)用的結(jié)果是不能夠使用的。

但是V8引擎中提供了一種解決辦法Deoptimization過(guò)程,這個(gè)過(guò)程是,一旦發(fā)現(xiàn)在執(zhí)行機(jī)器指令時(shí)候,執(zhí)行的操作不一樣的時(shí)候,Deoptimization會(huì)反向優(yōu)化,又轉(zhuǎn)化為字節(jié)碼,執(zhí)行后續(xù)操作。

2、V8引擎的解析圖

javascript依賴(lài)的支持是什么

V8執(zhí)行的細(xì)節(jié):

①、Blink將源碼交給V8引擎,Stream獲取到源碼并且進(jìn)行編碼轉(zhuǎn)換

②、scanner會(huì)進(jìn)行詞法分析,詞法分析之后會(huì)將代碼轉(zhuǎn)換為成tokens

③、tokens會(huì)被轉(zhuǎn)換為AST樹(shù),經(jīng)過(guò)Parser和PreParser:

Parser就是直接將tokens轉(zhuǎn)換為AST樹(shù)架構(gòu);

PreParser預(yù)解析,為什么會(huì)需要預(yù)解析?

1)如上圖中的函數(shù)outer(),內(nèi)部有一個(gè)函數(shù)inner(),但是并沒(méi)有任何調(diào)用inner()的代碼,那么就意味著并不是所有的JavaScript代碼,都是一開(kāi)始就被執(zhí)行。對(duì)所有的JavaScript代碼進(jìn)行解析,必定會(huì)影響網(wǎng)頁(yè)的運(yùn)行效率。

2)V8引擎實(shí)現(xiàn)了Lazy Parsing(延遲解析)的方案,作用是將不必要的函數(shù)進(jìn)行預(yù)解析,我只需要知道有這么個(gè)函數(shù)就行,也就是只解析暫時(shí)需要的內(nèi)容,對(duì)函數(shù)的全量解析在函數(shù)被調(diào)用的時(shí)候才會(huì)執(zhí)行。

3)例如上圖中函數(shù)outer中的inner函數(shù),它就是會(huì)執(zhí)行預(yù)解析。

④、生成AST樹(shù)之后,會(huì)被Ignition轉(zhuǎn)成字節(jié)碼,之后的過(guò)程就是代碼的執(zhí)行過(guò)程。

以上就是關(guān)于“javascript依賴(lài)的支持是什么”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI