摘要:引擎負責整個程序的編譯和執行過程編譯器負責語法分析和代碼生成作用域收集和維護一系列查詢由所有聲明的標識符組成例子聲明一個變量并賦值編譯器對該程序段分解成詞法單元編譯器對以上的詞法單元解析成一個樹結構抽象語法樹的語法解析器提供了一個在線解析的
引擎:負責整個js程序的編譯和執行過程
編譯器:負責語法分析和代碼生成
作用域:收集和維護一系列查詢(由所有聲明的標識符組成)
【例子:聲明一個變量并賦值 var a = value;】
Step1.編譯器對該程序段分解成詞法單元 "var" 、"a"、 "="、 "value"、";"
Step2.編譯器對以上的詞法單元解析成一個樹結構(抽象語法樹AST)
javascript的語法解析器Espsrima提供了一個在線解析的工具
在過程中,編譯器詢問作用域是否已經存在一個以"a"命名的變量在同一個作用域的集合中?若YES -> 編譯器忽略該聲明,繼續編譯;若NO -> 編譯器要求作用域在當前作用域的集合中聲明一個新變量,命名為a
Step3.編譯器生成處理 賦值操作“a = 2”的代碼
Step4.引擎運行step3生成的代碼時會詢問作用域,在當前作用域的集合中是否存在一個叫"a"的變量?若YES -> 引擎使用變量a ->Step5;若NO -> 引擎沿著作用域鏈繼續查找變量a ->Step6
Step5.引擎執行編譯器生成的代碼,把2賦值給變量a
Step6.引擎拋出一個異常
【總結】變量的賦值會經過兩個階段:
1.編譯器在作用域中聲明一個變量(若之前未聲明過)
2.運行時引擎在作用域中查找該變量
【擴展】
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
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/88736.html
摘要:本文將會深入分析的引擎的內部實現。該引擎使用在谷歌瀏覽器內部。同其他現代引擎如或所做的一樣,通過實現即時編譯器在執行時將代碼編譯成機器代碼。這可使正常執行期間只發生相當短的暫停。 原文 How JavaScript works: inside the V8 engine + 5 tips on how to write optimized code 幾周前我們開始了一個系列博文旨在深入...
摘要:我們將拆分來分析它的工作原理,更重要的是,它在性能方面如何提升加載時間,執行速度,垃圾回收,內存使用率,平臺訪問,調試,多線程和可移植性。目前,是圍繞和用例設計的。多線程在單個線程上運行。目前不支持多線程。被設計為安全和便攜。 我們將拆分WebAssembly來分析它的工作原理,更重要的是,它在性能方面如何提升JavaScript:加載時間,執行速度,垃圾回收,內存使用率,平臺API訪...
摘要:引擎可以用標準解釋器或即時編譯器來實現,即時編譯器以某種形式將代碼編譯為字節碼。這里的主要區別在于不生成字節碼或任何中間代碼。請注意,不使用中間字節碼表示法,不需要解釋器。這允許在正常執行期間非常短的暫停。 本系列的第一篇文章重點介紹了引擎,運行時和調用棧的概述。第二篇文章將深入V8的JavaScript引擎的內部。我們還會提供一些關于如何編寫更好的JavaScript代碼的技巧。 概...
摘要:但是它們其實并不是二選一的關系并不是只能用或者。正因為如此,指令有時也被稱為虛擬指令。這是因為是采用基于棧的虛擬機的機制。聲明模塊的全局變量。。下文預告現在你已經了解了模塊的工作原理,下面將會介紹為什么運行的更快。 作者:Lin Clark 編譯:胡子大哈 翻譯原文:http://huziketang.com/blog/posts/detail?postId=58c77641a6d8...
閱讀 1768·2023-04-26 01:44
閱讀 1211·2021-11-12 10:34
閱讀 1579·2021-09-09 09:33
閱讀 1729·2019-08-30 15:44
閱讀 2893·2019-08-30 13:49
閱讀 2191·2019-08-29 15:26
閱讀 944·2019-08-26 13:30
閱讀 1409·2019-08-23 18:15