v8

1 | js → Parse → AST(抽象语法树) → Ignition → bytecode(字节码)→ cpu 运行指令 |
情况: 先词法分析 -> 后语法分析
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 | function sum(a,b){ |
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 就是关键字