-
编译型语言 解释型语言
-
编译器: 源码 --> (词法分析、语法分析) --> AST --> (语义分析) --> 中间代码 --> (代码优化) --> 二进制文件 --> (直接运行) --> 执行
-
解释器: 源码 --> (词法分析、语法分析) --> AST --> (语义分析) --> 字节码 --> (解释执行) --> 执行
-
源代码 --> (词法分析、语法分析) --> AST --> (Ignition解释器) --> 字节码 --> (TurboFan优化代码) --> 机器码 | | | | (逐行解释执行) 执行上下文 机器码
-
- AST一阶段: 分词(tokenize) 词法分析 一行行源码拆解成一个个token
var myName = "极客时间"
var(keyword) myName(identifier) =(assignment) "极客时间"(Literal)
-
AST二阶段: 解析(parse) 语法分析,根据生成token和语法规则转换为AST,不符合规则则会终止并抛出语法错误(syntax error)
-
AST生成后 V8会生成该段代码的执行上下文
-
- 生成字节码
-
字节码: 介于AST和机器码之间的一种代码, 与特定类型的机器码无关, 同样需要解释器转换成机器码才能运行
-
- 执行代码
-
有一段第一次执行的字节码,那么解释器会逐条解释执行, 在字节码执行过程中,如发现有热点代码(一段代码重复执行多次) 后台编译器TurboFan会将该热点字节码编译为高效的机器码,当再次执行这段被优化的代码时,只需要执行编译后的机器码就行了,提高代码的执行效率。
-
热点代码被TurboFan转换为机器码,直接执行机器码省去了字节码编译为机器码的过程
-
JIT(即时编译) 在解释器解释执行字节码时,同时收集代码信息,当某一点代码重复收集到后可以标记为热点代码,同时将编译好的机器码进行收集,以便下次使用
-
V8 字节码 + JIT
-
JIT: JS code --> ByteCode --> 判断热点代码? --> (否:解释器)逐条解释执行 --> (是:JIT编译器TurboFan)一次编译热点代码 --> 机器码
- 提升单次脚本的执行速度
- 避免大的内敛脚本
- 减少JS文件的容量 提升下载速度,占用更低的内存