文章目录
- 概要
- 什么是V8引擎
- 为什么需要V8引擎
- 比较常见的javascript引起有哪些呢?
- V8引擎是如何工作的(V8引擎的解析过程)
- V8引擎的做了哪些优化
概要
本篇文章主要是讲V8引擎如何运行JS,对运行JS做了哪些优化
什么是V8引擎
V8 是一个由 Google 开发的开源 JavaScript引擎,目前用在 Chrome 浏览器和 Node.js中,其核心功能是执行和解析我们编写的JavaScript代码。
为什么需要V8引擎
高级的编程语言都是需要转成最终的机器指令来执行的。
我们编写的JavaScript无论交给浏览器或者Node执行,最后都是需要被CPU执行的。但是CPU只认识自己的指令集,机器语言才能被CPU所执行。所以我们需要JavaScript引擎帮助我们将JavaScript代码翻译成机器语言,才能被CPU指令来执行。
比较常见的javascript引起有哪些呢?
V8:Chrome 和 Opera 中的 JavaScript 引擎;
SpiderMonkey:Firefox(火狐) 中的 JavaScript 引擎;
Chakra:IE 中的 JavaScript 引擎;
ChakraCore:Microsoft Edge 中的 JavaScript 引擎;
SquirrelFish:Safari 中的 JavaScript 引擎。
V8引擎是如何工作的(V8引擎的解析过程)
大家都知道浏览器的渲染过程是,浏览器接受到资源后,开始解析HTML,在浏览器的内核里面有一个HTMLParser,把HTML转换成DOM
Tree(DOM树),在这个过程中,JavaScript也可以对DOM进行操作,CSS也会被CSS
Paser进行解析,转换成styleRules(css规则),然后DOM Tree和Style Rules会结合到一起生成Render
Tree(渲染树),然很会经过Layout进行适配对不同浏览器的屏幕大小进行适配布局,然后进会进行最终的绘制,生成我们最终看见的页面模样。
那么网页中的JS代码的解析过程是怎么样的呢?
这就是这篇文章的重点了,V8引擎的解析过程
1、JS由解析器解析后生成AST抽象语法树 2、解释器 Ignition 生成byteCode字节码 并直接执行 (清除AST
释放内存空间)
3. 解释器执行bytecode (此时的bytecode将被作为基准执行模型)
4. 得到25% - 50%的等效机器代码大小 (是以第三部生成的bytecode作为基准执行模型,字节码更简洁)
5. compiler 运行过程中,解释器收集优化信息发送给编译器TurboFan
6. 重新生成机器码
7. 有些热点函数变更会由优化后的机器码还原成字节码 也就是deoptimization 回退字节码操作执行
V8引擎的做了哪些优化
- 函数值只声明未被调用,不会被解析生成ast 。
- 函数只被调用一次,bytecode直接解释执行(就是说他会直接调用第三步的bytecode不会到TurboFan,因为TurboFan需要收集之前执行时的类型信息,那么就意味着TurboFan的优化对象函数至少执行大于一次)。
- 函数被调用多次,可能会被标记为热点函数,可能会被编译成机器代码(就是说当函数被标记为热点函数后,Ignition就收集了很多类型信息,那么TurboFan就会优化这些信息将bytecode生成机器代码。后面再调用就会直接调用TurboFan生成的机器代码)。
由于一开始不需要直接编译成机器码,生成了中间层的字节码,从而节约了时间,优化编译阶段,不需要从源码重新解析,直接通过字节码进行优化,也可以deoptimization回退操作。
参考链接