V8定义
是由 Google 开发的开源 JavaScript 引擎,也被称为虚拟机,模拟实际计算机各种功能来实现代码的编译和执行。
计算机执行原理
计算机执行代码,cpu只能是二进制文件010010
- 执行语言
- 计算机语言
- 00010101
- 优点
- 直接操作cpu,执行快
- 缺点
- 开发成本高,难维护和理解
- 汇编指令
- mov ax,bx
- 优点
- 人能理解的,但语法面向机器
- 适合偏底层的硬件交互
- 缺点
- 需要转化为计算机语言,才能执行
- 不同的 CPU 有着不同的指令集
- 在编写汇编代码时,需要额外了解和处理器架构相关的寄存器、内存、操作 CPU硬件知识
- 高级语言
- var a = 100
- 优点
- 人最容易理解,并且语法也是面向人
- 与平台和硬件无关
- 缺点
- 也是要先转化为机器语言再执行
- 生成的机器代码会比 汇编要大
- 执行效率比汇编慢
- 计算机语言
执行高级语言的2中方式
- 编译执行
- 高级代码转化为二进制,再执行二进制
- 启动时间长,但执行效率高
- 解析执行
- 高级代码转化为中间代码,然后由解释器去执行
- 启动时间短,但执行效率低
V8的执行策略
- 使用JIT - Just In Time
- 即解析和编译混合使用
- 默认启动使用解释执行
- 当遇到重复执行的代码,会标记成热点,并把代码升级为编译的代码,下次执行执行编译的代码,无需解释。
v8执行代码流程
- 准备基础的运行环境
- 全局执行上下文
- 内置函数
- 全局变量
- 全局作用域
- 消息循环系统
- 堆空间
- 栈空间
- 全局执行上下文
- 执行代码
- 生成AST 和作用域
- 生成中间代码-字节码
- 使用解释器执行字节码
- 输出内容
- 当遇到热点代码,把代码进行编译
- 下次执行直接执行编译后的代码
- 当代码被修改了,会把编译的代码反优化为字节码。
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 //被反优化的代码