溫馨提示×

溫馨提示×

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

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

JavaScript 引擎的運(yùn)行原理是什么

發(fā)布時(shí)間:2021-07-01 17:24:07 來源:億速云 閱讀:131 作者:Leah 欄目:web開發(fā)

這篇文章將為大家詳細(xì)講解有關(guān)JavaScript 引擎的運(yùn)行原理是什么,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

注意:本文主要基于 Node.js 和基于 Chrome 的瀏覽器使用的 V8 引擎。

HTML解析器遇到帶有源代碼的script標(biāo)簽。來自此源的代碼從網(wǎng)絡(luò),緩存或已安裝的服務(wù)工作程序中加載。響應(yīng)是將請求的腳本作為字節(jié)流,由字節(jié)流解碼器負(fù)責(zé)。字節(jié)流解碼器在下載字節(jié)流時(shí)對其進(jìn)行解碼。

JavaScript 引擎的運(yùn)行原理是什么

字節(jié)流解碼器從已解碼的字節(jié)流中創(chuàng)建令牌。例如,0066解碼為f, 0075到u,006e到n, 0063到c, 0074到t, 0069到i,  006f到o, 006e到n,后面跟一個(gè)空格。就像JS中的function,這是 JS  中的一個(gè)保留關(guān)鍵字,它會創(chuàng)建一個(gè)標(biāo)記,并將其發(fā)送給解析器。對于字節(jié)流的其余部分也是如此。

JavaScript 引擎的運(yùn)行原理是什么

該引擎使用兩個(gè)解析器:預(yù)解析器(pre-parser)和解析器(parser)。預(yù)解析器只提前檢查標(biāo)記,以查看是否有語法錯(cuò)誤。這可以減少發(fā)現(xiàn)代碼中的錯(cuò)誤所需的時(shí)間,否則解析器稍后就會發(fā)現(xiàn)這些錯(cuò)誤。

如果沒有錯(cuò)誤,解析器將根據(jù)從字節(jié)流解碼器接收到的標(biāo)記創(chuàng)建節(jié)點(diǎn)。使用這些節(jié)點(diǎn),它創(chuàng)建了一個(gè)抽象語法樹,即AST。

JavaScript 引擎的運(yùn)行原理是什么

接下來,輪到解釋器(interpreter)了。遍歷AST并根據(jù)AST包含的信息生成字節(jié)碼的解釋器。一旦字節(jié)碼完全生成,AST就會被刪除,從而清除內(nèi)存空間。最后,生成的機(jī)器碼就可以在電腦上運(yùn)行了。

JavaScript 引擎的運(yùn)行原理是什么

雖然字節(jié)碼很快,但它可以更快。當(dāng)這個(gè)字節(jié)碼運(yùn)行時(shí),將生成信息。它可以檢測某些行為是否經(jīng)常發(fā)生,以及所使用數(shù)據(jù)的類型。也許已經(jīng)調(diào)用一個(gè)函數(shù)幾十次了:現(xiàn)在是時(shí)候優(yōu)化它了,這樣它會運(yùn)行得更快!

字節(jié)碼與生成的類型反饋一起發(fā)送到優(yōu)化編譯器(ptimizing  compiler)。優(yōu)化的編譯器接收字節(jié)碼和類型反饋,并根據(jù)這些信息生成高度優(yōu)化的機(jī)器碼。

JavaScript 引擎的運(yùn)行原理是什么

JS 是一種動態(tài)類型語言,這意味著數(shù)據(jù)類型可以不斷變化。如果 JS引擎每次都要檢查某個(gè)值的數(shù)據(jù)類型,那么速度會非常慢。

相反,JS 引擎使用一種稱為內(nèi)聯(lián)緩存(inline  caching)的技術(shù)。它將代碼緩存在內(nèi)存中,希望將來它會以相同的行為返回相同的值.假設(shè)某個(gè)函數(shù)被調(diào)用100次,并且到目前為止總是返回相同的值。它將假設(shè)在第101次調(diào)用它時(shí)也會返回這個(gè)值。

假設(shè)我們有以下函數(shù)sum,(到目前為止)每次都使用數(shù)值作為參數(shù)來調(diào)用它:

ffunction sum(a, b){  return a + b}sum(1, 2

執(zhí)行結(jié)果為 3。下次調(diào)用它時(shí),它將假定我們再次使用兩個(gè)相同數(shù)字對其進(jìn)行調(diào)用。

如果假投,那么就不需要?jiǎng)討B(tài)查找,只需要使用存儲在特定內(nèi)存槽中的結(jié)果,該槽已經(jīng)有一個(gè)引用。否則,如果假設(shè)不正確,它將反優(yōu)化代碼并恢復(fù)到原始字節(jié)碼,而不是優(yōu)化后的機(jī)器碼。

例如,下一次調(diào)用它時(shí),我們傳遞的是字符串而不是數(shù)字。因?yàn)?JS 是動態(tài)類型的,所以這樣做不會有任何錯(cuò)誤。

function sum(a, b){ return a + b}sum('1', 2)

關(guān)于JavaScript 引擎的運(yùn)行原理是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

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

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

AI