摘要:引擎負(fù)責(zé)整個(gè)程序的編譯和執(zhí)行過程編譯器負(fù)責(zé)語(yǔ)法分析和代碼生成作用域收集和維護(hù)一系列查詢由所有聲明的標(biāo)識(shí)符組成例子聲明一個(gè)變量并賦值編譯器對(duì)該程序段分解成詞法單元編譯器對(duì)以上的詞法單元解析成一個(gè)樹結(jié)構(gòu)抽象語(yǔ)法樹的語(yǔ)法解析器提供了一個(gè)在線解析的
引擎:負(fù)責(zé)整個(gè)js程序的編譯和執(zhí)行過程
編譯器:負(fù)責(zé)語(yǔ)法分析和代碼生成
作用域:收集和維護(hù)一系列查詢(由所有聲明的標(biāo)識(shí)符組成)
【例子:聲明一個(gè)變量并賦值 var a = value;】
Step1.編譯器對(duì)該程序段分解成詞法單元 "var" 、"a"、 "="、 "value"、";"
Step2.編譯器對(duì)以上的詞法單元解析成一個(gè)樹結(jié)構(gòu)(抽象語(yǔ)法樹AST)
javascript的語(yǔ)法解析器Espsrima提供了一個(gè)在線解析的工具
在過程中,編譯器詢問作用域是否已經(jīng)存在一個(gè)以"a"命名的變量在同一個(gè)作用域的集合中?若YES -> 編譯器忽略該聲明,繼續(xù)編譯;若NO -> 編譯器要求作用域在當(dāng)前作用域的集合中聲明一個(gè)新變量,命名為a
Step3.編譯器生成處理 賦值操作“a = 2”的代碼
Step4.引擎運(yùn)行step3生成的代碼時(shí)會(huì)詢問作用域,在當(dāng)前作用域的集合中是否存在一個(gè)叫"a"的變量?若YES -> 引擎使用變量a ->Step5;若NO -> 引擎沿著作用域鏈繼續(xù)查找變量a ->Step6
Step5.引擎執(zhí)行編譯器生成的代碼,把2賦值給變量a
Step6.引擎拋出一個(gè)異常
【總結(jié)】變量的賦值會(huì)經(jīng)過兩個(gè)階段:
1.編譯器在作用域中聲明一個(gè)變量(若之前未聲明過)
2.運(yùn)行時(shí)引擎在作用域中查找該變量
【擴(kuò)展】
Step4中引擎查詢變量有兩種類型:LHS 和 RHS
LHS: 找到變量的容器本身
RHS:找到變量的值
例子:
function foo(a){ var b = a; return a+b } var c = foo(2); //在該例子中,LHS有:a = 2 、c= 、b= //RHS有:=foo(2)、 =a、a+、+b
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/88736.html
摘要:本文將會(huì)深入分析的引擎的內(nèi)部實(shí)現(xiàn)。該引擎使用在谷歌瀏覽器內(nèi)部。同其他現(xiàn)代引擎如或所做的一樣,通過實(shí)現(xiàn)即時(shí)編譯器在執(zhí)行時(shí)將代碼編譯成機(jī)器代碼。這可使正常執(zhí)行期間只發(fā)生相當(dāng)短的暫停。 原文 How JavaScript works: inside the V8 engine + 5 tips on how to write optimized code 幾周前我們開始了一個(gè)系列博文旨在深入...
摘要:我們將拆分來分析它的工作原理,更重要的是,它在性能方面如何提升加載時(shí)間,執(zhí)行速度,垃圾回收,內(nèi)存使用率,平臺(tái)訪問,調(diào)試,多線程和可移植性。目前,是圍繞和用例設(shè)計(jì)的。多線程在單個(gè)線程上運(yùn)行。目前不支持多線程。被設(shè)計(jì)為安全和便攜。 我們將拆分WebAssembly來分析它的工作原理,更重要的是,它在性能方面如何提升JavaScript:加載時(shí)間,執(zhí)行速度,垃圾回收,內(nèi)存使用率,平臺(tái)API訪...
摘要:引擎可以用標(biāo)準(zhǔn)解釋器或即時(shí)編譯器來實(shí)現(xiàn),即時(shí)編譯器以某種形式將代碼編譯為字節(jié)碼。這里的主要區(qū)別在于不生成字節(jié)碼或任何中間代碼。請(qǐng)注意,不使用中間字節(jié)碼表示法,不需要解釋器。這允許在正常執(zhí)行期間非常短的暫停。 本系列的第一篇文章重點(diǎn)介紹了引擎,運(yùn)行時(shí)和調(diào)用棧的概述。第二篇文章將深入V8的JavaScript引擎的內(nèi)部。我們還會(huì)提供一些關(guān)于如何編寫更好的JavaScript代碼的技巧。 概...
摘要:但是它們其實(shí)并不是二選一的關(guān)系并不是只能用或者。正因?yàn)槿绱耍噶钣袝r(shí)也被稱為虛擬指令。這是因?yàn)槭遣捎没跅5奶摂M機(jī)的機(jī)制。聲明模塊的全局變量。。下文預(yù)告現(xiàn)在你已經(jīng)了解了模塊的工作原理,下面將會(huì)介紹為什么運(yùn)行的更快。 作者:Lin Clark 編譯:胡子大哈 翻譯原文:http://huziketang.com/blog/posts/detail?postId=58c77641a6d8...
摘要:如果不行的話,不用擔(dān)心,當(dāng)你審查錯(cuò)誤時(shí)會(huì)學(xué)習(xí)到知識(shí)的。但是任何人不得不從某處開始,也許你堅(jiān)持,會(huì)在未來看到來自你的變更記錄。 本文轉(zhuǎn)載自:眾成翻譯譯者:yu-wj鏈接:http://www.zcfy.cc/article/3963原文:https://medium.com/dailyjs/how-do-i-get-started-with-v8-development-17e976eb...
閱讀 1793·2023-04-26 01:44
閱讀 1219·2021-11-12 10:34
閱讀 1603·2021-09-09 09:33
閱讀 1738·2019-08-30 15:44
閱讀 2899·2019-08-30 13:49
閱讀 2196·2019-08-29 15:26
閱讀 951·2019-08-26 13:30
閱讀 1417·2019-08-23 18:15