V8-学习1-v8引擎如何执行js代码

124 阅读2分钟

V8定义

是由 Google 开发的开源 JavaScript 引擎,也被称为虚拟机,模拟实际计算机各种功能来实现代码的编译和执行。

计算机执行原理

计算机执行代码,cpu只能是二进制文件010010

  • 执行语言
    • 计算机语言
      • 00010101
      • 优点
        • 直接操作cpu,执行快
      • 缺点
        • 开发成本高,难维护和理解
    • 汇编指令
      • mov ax,bx
      • 优点
        • 人能理解的,但语法面向机器
        • 适合偏底层的硬件交互
      • 缺点
        • 需要转化为计算机语言,才能执行
        • 不同的 CPU 有着不同的指令集
        • 在编写汇编代码时,需要额外了解和处理器架构相关的寄存器、内存、操作 CPU硬件知识
    • 高级语言
      • var a = 100
      • 优点
        • 人最容易理解,并且语法也是面向人
        • 与平台和硬件无关
      • 缺点
        • 也是要先转化为机器语言再执行
        • 生成的机器代码会比 汇编要大
        • 执行效率比汇编慢

执行高级语言的2中方式

  • 编译执行
    • 高级代码转化为二进制,再执行二进制
    • 启动时间长,但执行效率高
  • 解析执行
    • 高级代码转化为中间代码,然后由解释器去执行
    • 启动时间短,但执行效率低

V8的执行策略

  • 使用JIT - Just In Time
    • 即解析和编译混合使用
  • 默认启动使用解释执行
  • 当遇到重复执行的代码,会标记成热点,并把代码升级为编译的代码,下次执行执行编译的代码,无需解释。

v8执行代码流程

  1. 准备基础的运行环境
    • 全局执行上下文
      • 内置函数
      • 全局变量
    • 全局作用域
    • 消息循环系统
    • 堆空间
    • 栈空间
  2. 执行代码
    1. 生成AST 和作用域
    2. 生成中间代码-字节码
    3. 使用解释器执行字节码
    4. 输出内容
    5. 当遇到热点代码,把代码进行编译
    6. 下次执行直接执行编译后的代码
    7. 当代码被修改了,会把编译的代码反优化为字节码。

d8 调试代码

var a = 'xxx'

d8 --print-ast a.js//输出ast树形结构
d8 --print-scopes a.js//输出对应的作用域
d8 --print-bytecode a.js//输出对应的字节码信息
d8 --trace-opt a.js //被优化过的代码
pt --trace-deopt a.js //被反优化的代码

参考

time.geekbang.org/column/intr…