在現有的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/...