在现有的javascript引擎中,V8引擎绝对是其中的佼佼者,chrome和node底层都使用了V8引擎,其中chrome的市场占有率已经达到70%,而node更是前端工程化以及扩展边界的核心支柱,V8引擎对于一个前端开发工程师来讲重要程度可想而知。咱们大部分javascript开发者也许没有机会本身开发一个javascript引擎,可是学习V8引擎绝对是咱们提高技术能力的重要途径,故专门查阅各类书籍和文章进行学习,整理出系列文章让咱们一块儿学习进步。(本文为系列文章第一篇)javascript
了解V8引擎以前咱们先要知道什么是javascript引擎。简单来讲,CPU并不认识咱们的js代码,而不一样的CPU只认识本身对应的指令集,javascript引擎将js代码编译成CPU认识的指令集,固然除了编译以外还要负责执行以及内存的管理。
你们都知道js是解释形语言,由引擎直接读取源码,一边编译一边执行,这样效率相对较低,而编译形语言(如c++)是把源码直接编译成可直接执行的代码执行效率更高。前端
(图片转载自https://zhuanlan.zhihu.com/p/...)java
随着技术的发展,对JavaScript性能的要求愈来愈高,这就更快速的解析和执行JavaScript代码,V8引擎就是在此背景下产生的,它产生的目的就是为了提升性能。
为了提升性能v8向不少同时解释形语言的老前辈学习了不少经验,咱们先来看一下同是解释形语言的java的运行过程。node
参考文章:
什么是JIT:https://blog.csdn.net/qq_3604...c++
咱们再看一下V8是怎么作的正则表达式
整个过程和java的编译执行过程很是像,将javascript代码编译成抽象语法树再转化成字节码,经过解释器来执行,并经过JIT工具将部分字节码转化成可直接执行的本地代码。而java是分两个阶段完成,在编译阶段尽量的生成高效的字节码。V8更加直接的将抽象语法树经过JIT技术转换成本地代码,放弃了在字节码阶段能够进行的一些性能优化,但保证了执行速度。虽然少了生成字节码这一阶段的性能优化,但极大减小了转换时间。chrome
接下来咱们来了解一下v8的编译过程和运行过程前端工程化
首先咱们要了解一下在执行编译运行过程当中所用到的几个类缓存
原始图片来源:《WebKit技术内幕》
(红色标注为笔者本身理解,若是有误差或者错误,欢迎指出和讨论)性能优化
执行过程以下:
原始图片来源:《WebKit技术内幕》
(红色标注为笔者本身理解,若是有误差或者错误,欢迎指出和讨论)
编译和执行的总体过程以下:
原始图片来源:《WebKit技术内幕》
(红色标注为笔者本身理解,若是有误差或者错误,欢迎指出和讨论)
本文以一个宏观的角度描述了V8引擎编辑和运行的过程,可是要想真正的了解V8除了这些,咱们还须要了解不少里面的运行细节包括不限于 事件循环系统、内存管理、延迟解析、隐藏类、内联缓存等等,接下来的文章会逐一学习,敬请期待。
《WebKit技术内幕》
认识 V8 引擎: https://zhuanlan.zhihu.com/p/...