JavaScript 的执行过程
JS执行的第一步是读取 js 文件中的字符流,然后通过词法分析生成令牌流Tokens,之后再通过语法分析生成 AST(Abstract Syntax Tree),最后生成机器码执行。
模版语法-->抽象语法树AST-->渲染函数(h函数)-->虚拟节点(diff在此运行)-->界面生成AST需要用到指针算法和Stack数据结构
什么是AST(抽象语法树)?
抽象语法树(Abstract Syntax Tree,AST),或简称语法树(Syntax tree),是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。
为什么要了解AST ?
如果你想了解 前端 常用的一些插件或者工具是如何实现的?那么你就得了解 AST,比如说Javascript转译、代码压缩、css预处理器、elint、pretiier等功能的实现,都是建立在 AST 的基础之上。
JavaScript 是一种解释型脚本语言,与 C、C++ 等语言需要先编译 再运行不同,使用 JavaScript 编写的代码 不需要 编译成目标源码, 可以直接运行(编译和解释是一次性完成的)。
编译 是把 输入的源程序 翻译生成为目标代码(例如,字节码等),并存下来(无论是存在内存中还是磁盘上),后续可直接执行此目标代码,即可以复用;
解释 是对 输入的 源程序 边翻译边执行 一次性 完成,期间不生成可存储的目标代码。
一些编程语言 是同时采用 编译器 与 解释器 来实现的,包含Python,Java, C、C++ 等,先将代码编译为字节码,运行字节码时再进行解释。所谓“解释型语言”并不是 不用编译,而只是不需要用户显式去使用编译器得到可执行代码而已 。

词法分析
词法分析 是编译过程的 第一个阶段,也称之为扫描(Scanner)。这个阶段的任务可以看成是-从左到右一个字符一个字符地读入源程序,从中识别出一个个“单词”符号,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号);
通过词法分析程序实现上述读入源程序,识别符号的任务,词法分析过程依据的是语言的词法规则;
输出:词法分析程序输出的“单词”常以二元组的方式输出,即单词种别和单词自身的值;
认识:词法, 定义组成语言的单词, 是语言中最小单元;
词法分析,也称之为扫描(scanner),简单来说就是调用 next() 方法,一个一个字母的来读取字符,然后与定义好的 JavaScript 关键字做比较,生成对应的令牌流Tokens。令牌Token是一个不可分割的最小单元,例如 var 这三个字符,它只能作为一个整体,语义上不能再被分解,因此它是一个令牌Token。词法分析器里,每个关键字是一个令牌Token ,每个标识符是一个令牌Token,每个操作符是一个令牌Token,每个标点符号也都是一个令牌Token。除此之外,还会过滤掉源程序中的注释和空白字符(换行符、空格、制表符等)。
最终,整个代码将被分割进一个令牌流Tokens列表(或者说一维数组)。
语法分析
语法分析 是编译过程的 一个逻辑阶段,此阶段的任务是在词法分析的 基础上 将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等;语法分析会将词法分析出来的令牌流转化成 有语法含义的 抽象语法树AST(Abstract Syntax Tree)。同时,验证语法,语法如果有错的话,抛出语法错误。
语法是用户数据与控制信息的结构与格式
认识:语法-- 将单子组织成有含义的短语和句子的规则,正如英语翻译中的语法;
1. 语法分析的任务是判断源程序在结构上是否正确,是上下文无关的;
2. 语义分析的任务是判断结构正确的源程序所表达的意义是否正确,是上下文有关的。一个是检查你说话的“主谓宾”结构,一个是检查你说话的意思。
语义分析(Syntax analysis)
语义分析 是编译过程的 一个逻辑阶段,语义是解释控制信息每个部分的意义,它规定了需要发出何种控制信息,以及完成的动作与做出什么样的响应,此阶段的任务是对结构上正确的源程序进行上下文有关性质的审查,进行类型审查;
收集类型信息供后面的代码生成阶段使用;
语义分析将审查类型并报告错误:不能在表达式中使用一个数组变量,赋值语句的右端和左端的类型不匹配;
认识:语义-- 结合上下文,可以推导出语句的真实含义,也就是我们输入中文之后翻译出来的英文含义,或输入英文,翻译出来的中文;
举例认识:
我现在要翻译一句话,如下图所示:

词法分析:想要获取这句话的意思,那么首先我需要输入信息,系统进行一个个单词识别,也就是录入源程序,这属于词法分析;
语法分析:这句话录入程序,接下来系统就要进行识别每一个单词分别都是什么格式,英语语法的主谓宾、定状补,进而确定要翻译的语句的结构;
语义分析:获取了句子的单词,词性,接下来就是最后的输出阶段啦,语义分析,通过语义分析输出该翻译字句的中文含义:“她很漂亮宛如一个小仙女”;