引擎:负责整个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

关于JavaScript的编译原理相关推荐

  1. 学了编译原理能否用 Java 写一个编译器或解释器?

    16 个回答 默认排序​ RednaxelaFX JavaScript.编译原理.编程 等 7 个话题的优秀回答者 282 人赞同了该回答 能.我一开始学编译原理的时候就是用Java写了好多小编译器和 ...

  2. 关于JavaScript编译原理以及作用域的深入探讨

    前言 几乎所有编程语言最基本的功能之一,就是能够储存变量当中的值,并且能在之后对这个值进行访问或修改.事实上,正是这种储存和访问变量的值的能力将状态带给了程序. 若没有了状态这个概念,程序虽然也能够执 ...

  3. 我看过的编译原理方面的好文章

    本文不定期更新,最后更新于2019-7-6 编译原理 编译原理三大经典书籍(龙书 虎书 鲸书) 前端为什么要会正则表达式 - 知乎 一次性搞懂JavaScript正则表达式之引擎 - 掘金 没有AST ...

  4. 大前端开发者需要了解的基础编译原理和语言知识

    转自:https://yq.aliyun.com/articles/180879 在我刚刚进入大学,从零开始学习 C 语言的时候,我就不断的从学长的口中听到一个又一个语言,比如 C++.Java.Py ...

  5. 跟vczh看实例学编译原理——一:Tinymoe的设计哲学

    自从<序>胡扯了快一个月之后,终于迎来了正片.之所以系列文章叫<看实例学编译原理>,是因为整个系列会通过带大家一步一步实现Tinymoe的过程,来介绍编译原理的一些知识点. 但 ...

  6. java pl0 四元式,【编译原理】c++实现自下而上语法分析及中间代码(四元式)生成...

    写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...

  7. 《编译原理》实验报告——TINY语言的词法分析

    TINY语言的词法分析 实验目的 (评价依据,描述是否准确到位) 构造tiny语言的词法分析器(扫描器),要求利用第三方的lex工具进行构造. 构造出的扫描器,能够读入教材样例中给出的tiny语言的示 ...

  8. python编译原理_编译原理实战课 带你吃透编译技术核心概念与算法

    编译原理实战课,我们到底要学些什么? 在这门课程里,宫老师精选出了Java.Java JIT.Python.JavaScript.Julia.Go.MySQL这7种真实编程语言的编译器,带你阅读它们的 ...

  9. MVC 模式/Servlet/JSP 编译原理剖析:Servlet 组件到底属于 MVC 模式的哪一层?

    文章目录 前言 一.回忆什么是 MVC 模式? 1.1.Model.View.Controller 组件介绍 1.2.明确 View 与 Controller 组件区别 二.什么是 Servlet? ...

最新文章

  1. MySQL数据库时间类型datetime、bigint、timestamp的查询效率比较
  2. Django Admin 录入中文错误解决办法
  3. 正版python软件多少钱-北京正版软件SeismoSelect 价目表
  4. 【临实战】CentOS 批量配置
  5. 【译】Notes on Blockchain Governance
  6. AAAI2020录用论文汇总(三)
  7. php recordarray,php5.5新数组函数array-column使用实例
  8. linux mysql导出乱码问题_[MYSQL]将数据从5.0版本导入到4.1.7版本中出现乱码问题解决方案...
  9. 作为测试人员,这些工具不会真不行
  10. linux下监控磁盘空间脚本
  11. IDEA工具配置weblogic
  12. ES(elasticsearch)备份还原脚本
  13. u深度重装系统详细教程_u深度u盘安装win10系统教程
  14. 太拼了!张朝阳的一张作息表刷爆朋友圈
  15. RE写作Issue问题题库分析与提纲
  16. 图片太大加载不出来的解决方法
  17. RTX 3090 与 Tesla P40与 Tesla M40 深度学习训练速度比较
  18. 软件设计师教程(九)计算机系统知识-软件工程基础知识
  19. 挫败、迷茫、无聊时值得一看的“有点励志的故事和语录”
  20. 使用扩散模型从文本提示中生成3D点云

热门文章

  1. JavaScript笔记(3)
  2. 前后端交互中,返回前端的自定义响应数据结构
  3. [USACO07NOV]牛继电器Cow Relays
  4. Apache的RewriteRule规则详细介绍
  5. 语言分类,我接触和我想学习的
  6. [转]VS2010中的单元测试
  7. java enum 变量_java枚举使用详解
  8. as上的git到码云操作_如何使用git从码云克隆项目到本地?
  9. 代码 拉取_Git 利用 Webhooks 实现代码的自动拉取
  10. 流浪宠物救助网站前端页面_全国爱心人士齐聚鞍山 救助流浪猫狗