梗概:
1. 总流程图

2. 主流程
- js代码 → paser == AST
- AST → 基准解释器(Igniton) == 字节码
- 删除AST, 释放内存
- 代码 → 基准解释器 == 代码信息
- 随着输入基准解释器的AST越来越多, 获取到越来越多的代码信息
- 代码信息 + 字节码 → 优化编译器 == 机器代码
- 让操作系统执行机器代码或字节码
- 直接执行字节码时, 其实也是需要先转义为机器代码的, 只不过是一次性的
- 而不像优化编译器产生的机器代码那样会保存起来
- 直接执行字节码时, 其实也是需要先转义为机器代码的, 只不过是一次性的
3. 还有一个逆向流程(deoptmization)
- 有些保存着的机器代码特定情况下会被还原为字节码
3.1. 原因:
- js是一门动态类型的语言
- 不同的赋值, 导致代码信息也不同
- 导致同一个字节码编译出来的机器代码也可能不同
V8重要的优化策略:
- 如果函数只生成一次, 就不会被解析为AST
- 即V8将这个函数直接忽略掉
- 如果函数只被调用一次, 则直接编译运行其字节码
- 而不会保存编译产生的机器代码
- 如果函数被调用多次, 可能会被标标记为热点函数, 可能被保存编译出来的机器代码