您好,登錄后才能下訂單哦!
這篇文章主要介紹了JavaScript引擎如何使用的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇JavaScript引擎如何使用文章都會(huì)有所收獲,下面我們一起來看看吧。
注意:本文主要基于 Node.js 和基于 Chrome 的瀏覽器使用的 V8 引擎。
HTML解析器遇到帶有源代碼的script標(biāo)簽。來自此源的代碼從網(wǎng)絡(luò),緩存或已安裝的服務(wù)工作程序中加載。響應(yīng)是將請(qǐng)求的腳本作為字節(jié)流,由字節(jié)流解碼器負(fù)責(zé)。字節(jié)流解碼器在下載字節(jié)流時(shí)對(duì)其進(jì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)鍵字,它會(huì)創(chuàng)建一個(gè)標(biāo)記,并將其發(fā)送給解析器。對(duì)于字節(jié)流的其余部分也是如此。
該引擎使用兩個(gè)解析器:預(yù)解析器(pre-parser)和解析器(parser)。預(yù)解析器只提前檢查標(biāo)記,以查看是否有語法錯(cuò)誤。這可以減少發(fā)現(xiàn)代碼中的錯(cuò)誤所需的時(shí)間,否則解析器稍后就會(huì)發(fā)現(xiàn)這些錯(cuò)誤。
如果沒有錯(cuò)誤,解析器將根據(jù)從字節(jié)流解碼器接收到的標(biāo)記創(chuàng)建節(jié)點(diǎn)。使用這些節(jié)點(diǎn),它創(chuàng)建了一個(gè)抽象語法樹,即AST。
接下來,輪到解釋器(interpreter)了。遍歷AST并根據(jù)AST包含的信息生成字節(jié)碼的解釋器。一旦字節(jié)碼完全生成,AST就會(huì)被刪除,從而清除內(nèi)存空間。最后,生成的機(jī)器碼就可以在電腦上運(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)化它了,這樣它會(huì)運(yùn)行得更快!
字節(jié)碼與生成的類型反饋一起發(fā)送到優(yōu)化編譯器(ptimizing compiler)。優(yōu)化的編譯器接收字節(jié)碼和類型反饋,并根據(jù)這些信息生成高度優(yōu)化的機(jī)器碼。
JS 是一種動(dòng)態(tài)類型語言,這意味著數(shù)據(jù)類型可以不斷變化。如果 JS引擎每次都要檢查某個(gè)值的數(shù)據(jù)類型,那么速度會(huì)非常慢。
相反,JS 引擎使用一種稱為內(nèi)聯(lián)緩存(inline caching)的技術(shù)。它將代碼緩存在內(nèi)存中,希望將來它會(huì)以相同的行為返回相同的值.假設(shè)某個(gè)函數(shù)被調(diào)用100次,并且到目前為止總是返回相同的值。它將假設(shè)在第101次調(diào)用它時(shí)也會(huì)返回這個(gè)值。
假設(shè)我們有以下函數(shù)sum,(到目前為止)每次都使用數(shù)值作為參數(shù)來調(diào)用它:
ffunction sum(a, b){ return a + b}sum(1, 2
執(zhí)行結(jié)果為 3。下次調(diào)用它時(shí),它將假定我們?cè)俅问褂脙蓚€(gè)相同數(shù)字對(duì)其進(jìn)行調(diào)用。
如果假投,那么就不需要?jiǎng)討B(tài)查找,只需要使用存儲(chǔ)在特定內(nèi)存槽中的結(jié)果,該槽已經(jīng)有一個(gè)引用。否則,如果假設(shè)不正確,它將反優(yōu)化代碼并恢復(fù)到原始字節(jié)碼,而不是優(yōu)化后的機(jī)器碼。
例如,下一次調(diào)用它時(shí),我們傳遞的是字符串而不是數(shù)字。因?yàn)?JS 是動(dòng)態(tài)類型的,所以這樣做不會(huì)有任何錯(cuò)誤。
function sum(a, b){ return a + b}sum('1', 2)
關(guān)于“JavaScript引擎如何使用”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“JavaScript引擎如何使用”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。