本篇內(nèi)容介紹了“JavaScript引擎的運(yùn)行原理分析”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
創(chuàng)新互聯(lián)專(zhuān)注為客戶(hù)提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、南昌縣網(wǎng)絡(luò)推廣、重慶小程序開(kāi)發(fā)、南昌縣網(wǎng)絡(luò)營(yíng)銷(xiāo)、南昌縣企業(yè)策劃、南昌縣品牌公關(guān)、搜索引擎seo、人物專(zhuān)訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供南昌縣建站搭建服務(wù),24小時(shí)服務(wù)熱線:028-86922220,官方網(wǎng)址:www.cdcxhl.com
注意:本文主要基于 Node.js 和基于 Chrome 的瀏覽器使用的 V8 引擎。
HTML解析器遇到帶有源代碼的script標(biāo)簽。來(lái)自此源的代碼從網(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)記,以查看是否有語(yǔ)法錯(cuò)誤。這可以減少發(fā)現(xiàn)代碼中的錯(cuò)誤所需的時(shí)間,否則解析器稍后就會(huì)發(fā)現(xiàn)這些錯(cuò)誤。
如果沒(méi)有錯(cuò)誤,解析器將根據(jù)從字節(jié)流解碼器接收到的標(biāo)記創(chuàng)建節(jié)點(diǎn)。使用這些節(jié)點(diǎn),它創(chuàng)建了一個(gè)抽象語(yǔ)法樹(shù),即AST。
接下來(lái),輪到解釋器(interpreter)了。遍歷AST并根據(jù)AST包含的信息生成字節(jié)碼的解釋器。一旦字節(jié)碼完全生成,AST就會(huì)被刪除,從而清除內(nèi)存空間。最后,生成的機(jī)器碼就可以在電腦上運(yùn)行了。
雖然字節(jié)碼很快,但它可以更快。當(dāng)這個(gè)字節(jié)碼運(yùn)行時(shí),將生成信息。它可以檢測(cè)某些行為是否經(jīng)常發(fā)生,以及所使用數(shù)據(jù)的類(lèi)型。也許已經(jīng)調(diào)用一個(gè)函數(shù)幾十次了:現(xiàn)在是時(shí)候優(yōu)化它了,這樣它會(huì)運(yùn)行得更快!
字節(jié)碼與生成的類(lèi)型反饋一起發(fā)送到優(yōu)化編譯器(ptimizing compiler)。優(yōu)化的編譯器接收字節(jié)碼和類(lèi)型反饋,并根據(jù)這些信息生成高度優(yōu)化的機(jī)器碼。
JS 是一種動(dòng)態(tài)類(lèi)型語(yǔ)言,這意味著數(shù)據(jù)類(lèi)型可以不斷變化。如果 JS引擎每次都要檢查某個(gè)值的數(shù)據(jù)類(lèi)型,那么速度會(huì)非常慢。
相反,JS 引擎使用一種稱(chēng)為內(nèi)聯(lián)緩存(inline caching)的技術(shù)。它將代碼緩存在內(nèi)存中,希望將來(lái)它會(huì)以相同的行為返回相同的值.假設(shè)某個(gè)函數(shù)被調(diào)用100次,并且到目前為止總是返回相同的值。它將假設(shè)在第101次調(diào)用它時(shí)也會(huì)返回這個(gè)值。
假設(shè)我們有以下函數(shù)sum,(到目前為止)每次都使用數(shù)值作為參數(shù)來(lái)調(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)類(lèi)型的,所以這樣做不會(huì)有任何錯(cuò)誤。
function sum(a, b){ return a + b}sum('1', 2)
“JavaScript引擎的運(yùn)行原理分析”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!