梗概:

1. 总流程图

2. 主流程

  • js代码 paser == AST
  • AST 基准解释器(Igniton) == 字节码
    • 删除AST, 释放内存
  • 代码 基准解释器 == 代码信息
    • 随着输入基准解释器的AST越来越多, 获取到越来越多的代码信息
  • 代码信息 + 字节码 优化编译器 == 机器代码
  • 让操作系统执行机器代码字节码
    • 直接执行字节码时, 其实也是需要先转义为机器代码的, 只不过是一次性
      • 而不像优化编译器产生的机器代码那样会保存起来

3. 还有一个逆向流程(deoptmization)

  • 有些保存着的机器代码特定情况下会被还原为字节码

3.1. 原因:

  • js是一门动态类型的语言
    • 不同的赋值, 导致代码信息也不同
    • 导致同一个字节码编译出来的机器代码也可能不同

V8重要的优化策略:

  • 如果函数只生成一次, 就不会被解析为AST
    • 即V8将这个函数直接忽略掉
  • 如果函数只被调用一次, 则直接编译运行其字节码
    • 而不会保存编译产生的机器代码
  • 如果函数被调用多次, 可能会被标标记为热点函数, 可能保存编译出来的机器代码

1. 视频讲解

【干货】8分钟带你了解V8引擎是如何运行JS!都2020年了还不知道什么是V8?_哔哩哔哩_bilibili