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/...

相關文章
相關標籤/搜索