V8引擎详解(一)——概述

背景

在现有的javascript引擎中,V8引擎绝对是其中的佼佼者,chrome和node底层都使用了V8引擎,其中chrome的市场占有率已经达到70%,而node更是前端工程化以及扩展边界的核心支柱,V8引擎对于一个前端开发工程师来讲重要程度可想而知。咱们大部分javascript开发者也许没有机会本身开发一个javascript引擎,可是学习V8引擎绝对是咱们提高技术能力的重要途径,故专门查阅各类书籍和文章进行学习,整理出系列文章让咱们一块儿学习进步。(本文为系列文章第一篇)javascript

什么是V8引擎

javascript引擎

了解V8引擎以前咱们先要知道什么是javascript引擎。简单来讲,CPU并不认识咱们的js代码,而不一样的CPU只认识本身对应的指令集,javascript引擎将js代码编译成CPU认识的指令集,固然除了编译以外还要负责执行以及内存的管理。
你们都知道js是解释形语言,由引擎直接读取源码,一边编译一边执行,这样效率相对较低,而编译形语言(如c++)是把源码直接编译成可直接执行的代码执行效率更高。前端


(图片转载自https://zhuanlan.zhihu.com/p/...java

v8引擎

随着技术的发展,对JavaScript性能的要求愈来愈高,这就更快速的解析和执行JavaScript代码,V8引擎就是在此背景下产生的,它产生的目的就是为了提升性能。
为了提升性能v8向不少同时解释形语言的老前辈学习了不少经验,咱们先来看一下同是解释形语言的java的运行过程。node


参考文章:
什么是JIT:https://blog.csdn.net/qq_3604...c++

咱们再看一下V8是怎么作的正则表达式


整个过程和java的编译执行过程很是像,将javascript代码编译成抽象语法树再转化成字节码,经过解释器来执行,并经过JIT工具将部分字节码转化成可直接执行的本地代码。而java是分两个阶段完成,在编译阶段尽量的生成高效的字节码。V8更加直接的将抽象语法树经过JIT技术转换成本地代码,放弃了在字节码阶段能够进行的一些性能优化,但保证了执行速度。虽然少了生成字节码这一阶段的性能优化,但极大减小了转换时间。chrome

V8编译运行过程

接下来咱们来了解一下v8的编译过程和运行过程前端工程化

编译过程

首先咱们要了解一下在执行编译运行过程当中所用到的几个类缓存

  • Script类:表示是JavaScript代码,既包含源代码,又包含编译以后生成的本地代码,因此它既是编译入口,又是运行入口;
  • Compiler类:编译器类,辅助Script类来编译生成代码,它主要起一个协调者的做用,会调用解释器(Parser)来生成抽象语法树和全代码生成器,来为抽象语法树生成本地代码;
  • Parser类:将源代码解释并构建成抽象语法树,使用AstNode类来建立它们,并使用Zone类来分配内存;
  • AstNode类:抽象语法树节点类,是其余全部节点的基类,它包含很是多的子类,后面会针对不一样的子类生成不一样的本地代码;
  • AstVisitor类:抽象语法树的访问者类,主要用来遍历抽象语法树;
  • FullCodeGenerator:AstVisitor类的子类,经过遍历抽象语法树来为JavaScrit生成本地代码;


原始图片来源:《WebKit技术内幕》
(红色标注为笔者本身理解,若是有误差或者错误,欢迎指出和讨论)性能优化

运行过程

  • Script表示JavaScript代码,即包含源代码,又包含编译以后生成的本地代码,便是编译入口,又是运行入口;
  • Execution:运行代码的辅组类,包含一些重要函数,如Call函数,它辅组进入和执行Script代码;
  • JSFunction:须要执行的JavaScript函数表示类;
  • Runtime:运行这些本地代码的辅组类,主要提供运行时所需的辅组函数,如:属性访问、类型转换、编译、算术、位操做、比较、正则表达式等;
  • Heap:运行本地代码须要使用的内存堆类;
  • MarkCompactCollector:垃圾回收机制的主要实现类,用来标记、清除和整理等基本的垃圾回收过程;
  • SweeperThread:负责垃圾回收的线程。

执行过程以下:


原始图片来源:《WebKit技术内幕》
(红色标注为笔者本身理解,若是有误差或者错误,欢迎指出和讨论)

编译和执行的总体过程以下:


原始图片来源:《WebKit技术内幕》
(红色标注为笔者本身理解,若是有误差或者错误,欢迎指出和讨论)

总结

本文以一个宏观的角度描述了V8引擎编辑和运行的过程,可是要想真正的了解V8除了这些,咱们还须要了解不少里面的运行细节包括不限于 事件循环系统、内存管理、延迟解析、隐藏类、内联缓存等等,接下来的文章会逐一学习,敬请期待。

参考文章

《WebKit技术内幕》
认识 V8 引擎: https://zhuanlan.zhihu.com/p/...

相关文章
相关标签/搜索