前言
今天,我看了一段关于V8引擎是如何运行JS的视频。 记录视频中的主要知识点,加深记忆,二是容易复习
什么是V8
V8是用C编写的谷歌开源高性能JavaScript和WebAssembly引擎。 V8第一个版本与第一个版本Chrome一起于2008年9月2日发布
使用V8的程序
Chrome浏览器的JS引擎是V8Nodejs的运行时环境是V8electron的基础引擎是V8V8的主要职责
简单来说,V8接收JavaScript代码,编译代码并执行c程序。 编译的代码可以在不同操作系统的不同处理器上运行。 其主要责任:
编译和执行JS代码处理调用堆栈内存分配垃圾回收
v8JS代码的编译和执行方式一般来说,js引擎使用三个重要的组件来编译和执行代码。
解析器- -负责将js源代码解析为抽象语法树AST
解释器- -负责将ast解析为字节码bytecode,解释器还具有解释bytecode执行的能力
编译器--负责编译运行更高效的机器代码
但是,在V8的早期,5.9版之前没有解释器,但是有两个编译器,其编译过程如下
使用parser解释器生成抽象语法树ASTcompiler编译器Full-codegen基准编译器直接生成机器代码并运行一段时间后,使用解析器线程优化js代码compiler编译器CrankShaft
这种设计的缺点
机器码占用大量内存,缺少中间层机器码,一些优化策略不能很好地支持和优化JS的新语言特性,无法接受未来。 正因为有这样的问题,V8团队花了三年半的时间开发了新的V8体系结构
新版本的V8
parser解析器生成AST抽象语法树直接执行解释器Ignition生成字节码和AST释放内存空间以获得25% - 50%等效机器码大小的compiler实现解释器收集优化信息并将其发送到编译器TurboFan,然后重新生成机器代码的某些热点函数更改将从优化的机器代码恢复为字节码
优化点:
不调用值声明,只调用一次未解析生成的AST函数,bytcode直接解释并执行,不进入编译优化阶段的函数被调用多次,Igniton收集函数类型信息并标记为热点函数
因为不需要首先直接编译到机器码中,所以会生成中间层的字节码,从而节省了优化编译阶段的时间。 不需要从源代码重新分析,也可以直接通过字节码进行优化。 de优化回滚操作如下:
functionsum(x,y ) {return x y}; sum (1,2 ); sum (3,4 ); sum (5,6 ); sum('7)、'8); //回退的字节码操作以上是关于V8引擎如何执行JS的内容
原始视频: https://www.bilibili.com/video/b v1 zv 411 z7rx