摘要:引擎负责整个程序的编译和执行过程编译器负责语法分析和代码生成作用域收集和维护一系列查询由所有声明的标识符组成例子声明一个变量并赋值编译器对该程序段分解成词法单元编译器对以上的词法单元解析成一个树结构抽象语法树的语法解析器提供了一个在线解析的
引擎:负责整个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
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/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...
阅读 1767·2023-04-26 01:44
阅读 1209·2021-11-12 10:34
阅读 1578·2021-09-09 09:33
阅读 1728·2019-08-30 15:44
阅读 2892·2019-08-30 13:49
阅读 2189·2019-08-29 15:26
阅读 942·2019-08-26 13:30
阅读 1409·2019-08-23 18:15