认识 V8 引擎

前言JAVAScript绝对是最火的编程语言之一,一直具有很大的用户群,随着在服务端的使用(NodeJs),更是爆发了极强的生命力 。编程语言分为编译型语言和解释型语言两类,编译型语言在执行之前要先进行完全编译,而解释型语言一边编译一边执行,很明显解释型语言的执行速度是慢于编译型语言的,而JavaScript就是一种解释型脚本语言,支持动态类型、弱类型、基于原型的语言,内置支持类型 。鉴于JavaScript都是在前端执行,而且需要及时响应用户,这就要求JavaScript可以快速的解析及执行 。
随着Web相关技术的发展,JavaScript所要承担的工作也越来越多,早就超越了“表单验证”的范畴,这就更需要快速的解析和执行JavaScript脚本 。V8引擎就是为解决这一问题而生,在node中也是采用该引擎来解析JavaScript 。
V8是如何使得JavaScript性能有大幅提升的呢?通过对一些书籍和文章的学习,梳理了V8的相关内容,本文将带你认识 V8 。(该文在 17 年整理后发布到知乎,也被知乎编辑进行了推荐,现在也同步到头条号上,希望帮助更多的人了解 V8 引擎 。)
1.渲染引擎及网页渲染浏览器自从上世纪80年代后期90年代初期诞生以来,已经得到了长足的发展,其功能也越来越丰富,包括网络、资源管理、网页浏览、多页面管理、插件和扩展、书签管理、历史记录管理、设置管理、下载管理、账户和同步、安全机制、隐私管理、外观主题、开发者工具等 。在这些功能中,为用户提供网页浏览服务无疑是最重要的功能,下面将对相关内容进行介绍 。
1.1.渲染引擎渲染引擎:能够将html/css/JavaScript文本及相应的资源文件转换成图像结果 。渲染引擎的主要作用是将资源文件转化为用户可见的结果 。在浏览器的发展过程中,不同的厂商开发了不同的渲染引擎,如Tridend(IE)、Gecko(FF)、WebKit(Safari,Chrome,Andriod浏览器)等 。WebKit是由苹果2005年发起的一个开源项目,引起了众多公司的重视,几年间被很多公司所采用,在移动端更占据了垄断地位 。更有甚者,开发出了基于WebKit的支持HTML5的web操作系统(如:Chrome OS、Web OS) 。
下面是WebKit的大致结构:

认识 V8 引擎

文章插图
webkit架构图
上图中实线框内模块是所有移植的共有部分,虚线框内不同的厂商可以自己实现 。下面进行介绍:
  • 操作系统:是管理和控制计算机硬件与软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才能运行 。WebKit也是在操作系统上工作的 。
  • 第三方库,为了WebKit提供支持,如图形库、网络库、视频库等 。
  • WebCore 是各个浏览器使用的共享部分,包括HTML解析器、CSS解析器、DOM和SVG等 。JavaScriptCore是WebKit的默认引擎,在谷歌系列产品中被替换为V8引擎 。WebKit Ports是WebKit中的非共享部分,由于平台差异、第三方库和需求的不同等原因,不同的移植导致了WebKit不同版本行为不一致,它是不同浏览器性能和功能差异的关键部分 。
  • WebKit嵌入式编程接口,供浏览器调用,与移植密切相关,不同的移植有不同的接口规范 。
  • 测试用例,包括布局测试用例和性能测试用例,用来验证渲染结果的正确性 。
1.2.网页渲染流程上面介绍了渲染引擎的各个模块,那么一张网页,要经历怎样的过程,才能抵达用户面前?
认识 V8 引擎

文章插图
渲染流程
首先是网页内容,输入到HTML解析器,HTML解析器解析,然后构建DOM树,在这期间如果遇到JavaScript代码则交给JavaScript引擎处理;如果来自CSS解析器的样式信息,构建一个内部绘图模型 。该模型由布局模块计算模型内部各个元素的位置和大小信息,最后由绘图模块完成从该模型到图像的绘制 。在网页渲染的过程中,大致可分为下面3个阶段 。
1.2.1.从输入URL到生成DOM树
  1. 地址栏输入URL,WebKit调用资源加载器加载相应资源;
  2. 加载器依赖网络模块建立连接,发送请求并接收答复;
  3. WebKit接收各种网页或者资源数据,其中某些资源可能同步或异步获取;
  4. 网页交给HTML解析器转变为词语;
  5. 解释器根据词语构建节点,形成DOM树;
  6. 如果节点是JavaScript代码,调用JavaScript引擎解释并执行;
  7. JavaScript代码可能会修改DOM树结构;
  8. 如果节点依赖其他资源,如图片css、视频等,调用资源加载器加载它们,但这些是异步加载的,不会阻碍当前DOM树继续创建;如果是JavaScript资源URL(没有标记异步方式),则需要停止当前DOM树创建,直到JavaScript加载并被JavaScript引擎执行后才继续DOM树的创建 。


    推荐阅读