Skip to content

Latest commit

 

History

History
52 lines (30 loc) · 2.41 KB

14.编译器和解释器:V8是如何执行一段JavaScript代码的.md

File metadata and controls

52 lines (30 loc) · 2.41 KB

14 | 编译器和解释器:V8是如何执行一段JavaScript代码的?

编译器、 解释器、 抽象语法树、 字节码、 即时编译器

编译器 解释器

  • 编译型语言 解释型语言

  • 编译器: 源码 --> (词法分析、语法分析) --> AST --> (语义分析) --> 中间代码 --> (代码优化) --> 二进制文件 --> (直接运行) --> 执行

  • 解释器: 源码 --> (词法分析、语法分析) --> AST --> (语义分析) --> 字节码 --> (解释执行) --> 执行

V8执行JS代码

  • 源代码 --> (词法分析、语法分析) --> AST --> (Ignition解释器) --> 字节码 --> (TurboFan优化代码) --> 机器码 | | | | (逐行解释执行) 执行上下文 机器码

    1. AST一阶段: 分词(tokenize) 词法分析 一行行源码拆解成一个个token
	var myName = "极客时间"

	var(keyword) myName(identifier) =(assignment) "极客时间"(Literal)
  • AST二阶段: 解析(parse) 语法分析,根据生成token和语法规则转换为AST,不符合规则则会终止并抛出语法错误(syntax error)

  • AST生成后 V8会生成该段代码的执行上下文

    1. 生成字节码
  • 字节码: 介于AST和机器码之间的一种代码, 与特定类型的机器码无关, 同样需要解释器转换成机器码才能运行

    1. 执行代码
  • 有一段第一次执行的字节码,那么解释器会逐条解释执行, 在字节码执行过程中,如发现有热点代码(一段代码重复执行多次) 后台编译器TurboFan会将该热点字节码编译为高效的机器码,当再次执行这段被优化的代码时,只需要执行编译后的机器码就行了,提高代码的执行效率。

  • 热点代码被TurboFan转换为机器码,直接执行机器码省去了字节码编译为机器码的过程

  • JIT(即时编译) 在解释器解释执行字节码时,同时收集代码信息,当某一点代码重复收集到后可以标记为热点代码,同时将编译好的机器码进行收集,以便下次使用

  • V8 字节码 + JIT

  • JIT: JS code --> ByteCode --> 判断热点代码? --> (否:解释器)逐条解释执行 --> (是:JIT编译器TurboFan)一次编译热点代码 --> 机器码

关注点

  • 提升单次脚本的执行速度
  • 避免大的内敛脚本
  • 减少JS文件的容量 提升下载速度,占用更低的内存