摘要:极客时间《图解 Google V8》宏观视角笔记
V8
V8 是 JavaScript 虚拟机的一种,它能将人类能够理解的编程语言 JavaScript,翻译成机器能够理解的机器语言。
完整的 V8 编译流水线:
V8 知识图谱:
V8 执行过程
CPU 相当于一个非常小的运算机器,可以通过二进制的指令和 CPU 进行沟通。为了能够完成复杂的任务,有对应的一大堆指令来实现各种功能,被称为指令集(Instructions),即机器语言。二进制代码难以阅读和记忆,就出现了易于识别和记忆的汇编指令集。但 CPU 只认识二进制而不能直接识别汇编语言,所以需要汇编编译器将汇编语言转换成 CPU 认识的二进制代码。
汇编语言虽然降低程序员理解机器语言的复杂度,但依旧很繁杂。而且不同的 CPU 有不同的指令集,开发业务还需要了解与处理器架构相关的知识。接着就出现高级语言,仅需要开发自身的业务代码,而不需要关心计算机架构细节。但是 CPU 也不认识高级语言,一般有两中方法来执行高级语言:
1、解释执行,解析器将源代码编译成中间代码,再由解释器解释中间代码,然后直接输出结果。
2、编译执行,解析器将源代码编译成中间代码,再由编译器将中间代码编译成以二进制文件形式存储的机器码,需要时执行这段代码的二进制文件。如果使用虚拟机,可以将机器代码保存在内存中,然后直接执行内存中的二进制代码。
混合使用编译器和解释器的技术称为 JIT(Just In Time)技术,V8 也是采用了 JIT。
V8 执行 JavaScript 过程:
1、初始化基础环境
2、解析源码生成 AST 和作用域
3、依据 AST 和作用域生成字节码
4、解释执行字节码
5、监听热点代码
某段代码被执行多次后会被识别并标记为热点代码
6、优化热点代码为二进制的机器代码
优化编译器会在后台将热点代码的字节码编译为二进制代码,然后再对编译后的二进制代码执行优化操作提升执行效率
7、反优化生成的二进制机器代码
经过优化编译器优化过的代码只能针对某种固定的结构,如果对象的结构在执行过程中被动态修改,那么优化之后的代码就会变成无效的代码。此时,优化编译器就会执行反优化操作,经过反优化的代码下次执行就会回退到解释器解释执行