v8

aminzi

v8流程图
v8 的主流程

1
2
3
js → Parse → AST(抽象语法树) → Ignition → bytecode(字节码)→ cpu 运行指令
|
TurboFan → 优化的机器指令

情况: 先词法分析 -> 后语法分析

v8 得到 js 代码会进行 Scanner(扫描器)进行词法法分析

词法分析

对每一行代码进行分词,比如 var 一个词语、age 一个词语

生成一个个 token(tokenization,记号化)

1
var age = 18

语法分析(parse)

分析具体语法,var 就是关键字

得到 js 代码会进行 Scanner(扫描器)进行词法法分析

词法分析

对每一行代码进行分词,比如 var 一个词语、age 一个词语

生成一个个 token(tokenization,记号化)

1
var age = 18

语法分析(parse)

分析具体语法,var 就是关键字得到 js 代码会进行 Scanner(扫描器)进行词法法分析

词法分析

对每一行代码进行分词,比如 var 一个词语、age 一个词语

生成一个个 token(tokenization,记号化)

1
var age = 18

语法分析(parse)

分析具体语法,var 就是关键字 v8 流程图

对于频繁调用的函数每次都转为字节码,然后转为 cup 指令。这一个过程是很消耗性能的

TurboFan 把需要频繁调用的函数进行优化和标记为热函数,之后碰到频繁调用的函数就使用优化后的机器指令

  • 但是注意,对于频繁调用的函数突然改变,比如函数的形参类型改变,就会进行反向优化。而 ts 能限制函数形参方面的处理,在某些方面 ts 是对代码的优化
1
2
3
4
5
6
7
8
function sum(a,b){
return a+b
}

sum(1,2)
sum(2,2)
sum('2','2') // x

Parse 模块

将 js 代码,转为 AST 语法树。后面的解释器不认识 js 代码

  • 如果 js 函数没有被调用,那么是不会被转为 AST

Ignition 解释器

将 AST 转为 字节码

  • 会收集 TurboFan 需要优化的信息(比如函数的参数类型信息)
  • 如果函数只调用一次,Ignition 是执行字节码,而不经过 TurboFan

字节码

  • 跨平台
  • 可以在 win 电脑 cpu 架构上运行,转为对应 cpu 的指令
  • 可以在 win 电脑 cpu 架构上运行,转为对应 cpu 的指令

Scanner 扫描器

扫描器
得到 js 代码会进行 Scanner(扫描器)进行词法法分析

词法分析

对每一行代码进行分词,比如 var 一个词语、age 一个词语

得到 js 代码会进行 Scanner(扫描器)进行词法法分析

词法分析

对每一行代码进行分词,比如 var 一个词语、age 一个词语

生成一个个 token(tokenization,记号化)

1
var age = 18

语法分析(parse)

分析具体语法,var 就是关键字生成一个个 token(tokenization,记号化)

1
var age = 18

语法分析(parse)

分析具体语法,var 就是关键字