![](http://static.javashuo.com/static/loading.gif)
微信公衆號:愛寫bugger的阿拉斯加
若有問題或建議,請後臺留言,我會盡力解決你的問題。vue
前言
此文章是我最近在看的【WebKit 技術內幕】一書的一些理解和作的筆記。java
而【WebKit 技術內幕】是基於 WebKit 的 Chromium 項目的講解。node
書接上文 瀏覽器之硬件加速機制react
本章主要講解 WebKit 中普遍使用的 JavaScriptCore 引擎和 V8 引擎。程序員
1. javaScript
簡介
JavaScript 是一種腳本語言,主要用在 Web 的客戶端,是控制網頁客戶端的邏輯,例如同用戶的交互,異步通訊等需求。web
本質上它是一種解釋語言,函數是它的第一等公民,也就是函數也可以看成參數或者返回值來傳遞。瀏覽器
JavaScript 語言的一個重大特色就是,它是一種無類型語言,或者說是動態類型語言。微信
這一特性致使咱們沒有辦法有編譯的時候知道變量的類型,因此只能在運行的時候才能肯定。架構
推進 JavaScript 運行速度提升的另外一大利器是 JIT(Just-In-Time)技術,它不是一項全新的技術,其做用是解決解釋性語言的性能問題。app
主要思想是當解釋器將代碼解釋成內部表示的時候,JavaScript 的執行環境不只是解釋這些內部表示,並且將其中一些字節碼(主要是使用率高的部分)轉成本地代碼(彙編代碼),這樣能夠被 CPU 直接執行,而不是解釋執行,從而極大提升性能。
1.2 JavaScript 引擎
JavaScript 引擎就是可以將 JavaScript 代碼處理並執行的運行環境。
![image.png](http://static.javashuo.com/static/loading.gif)
JavaScript 引擎包括如下部分:
編譯器:將源代碼編譯成抽象語法樹,在某些引擎中還包含將抽象語法樹轉換成字節碼。
解釋器:在某些引擎中,解釋器主要是接收字節碼,解釋執行這個字節碼,同時也依賴垃圾回收機制等。
JIT 工具:一個可以 JIT 的工具,將字節碼或者抽象語法樹轉換在本地代碼,固然它也須要依賴牢記。
垃圾回收器和分析工具(Profiler):負責垃圾回收和 收集引擎中的信息,幫助改善引擎的性能和功效。
1.3 JavaScript 引擎和渲染引擎
從模塊上看,它們是兩個獨立的模塊,分別負責不一樣的事情:
JavaScript 引擎負責執行 JavaScript 代碼,而渲染引擎負責渲染網頁。
JavaScript 引擎提供調用接口給渲染引擎,以便讓渲染引擎使用 JavaScript 引擎來處理JavaScript 代碼並獲取結果。
這並非所有,JavaScript 引擎須要可以訪問渲染引擎構建的 DOM 樹,因此 JavaScript 引擎一般須要提供橋接的接口,而渲染引擎則根據橋接接口來提供讓 JavaScript 訪問 DOM 的能力。
在如今衆多的 HTML5 能力中,不少是經過 JavaScript 接口提供給開發者的,因此這部分一樣須要根據橋接接口來實現具體類,以便讓 JavaScript 引擎可以回調渲染引擎的具體實現。
![](http://static.javashuo.com/static/loading.gif)
在 WebKit 中,兩種引擎經過橋接接口來訪問 DOM 結構,這對性能來講是一個重大的損失,由於每次 JavaScript 代碼訪問 DOM 都須要經過複雜和低效的橋接接口來完成。
1.2 V8 引擎
1.2.1 基礎
V8 是一個開源項目,也是一個 JavaScript 引擎的實現。
V8 支持衆多的操做系統。包括可是不限於 Windows、Liunx、Android、Mac OSX 等。同時它也可以支持衆多的硬件架構,例如 IA3二、X6四、ARM 、MIPS 等。
1.2.1.1 代碼結構
![image.png](http://static.javashuo.com/static/loading.gif)
1.2.2 V8 工做過程
V8 工做過程有兩個階段,第一是編譯,第二是運行。
鑑於 JavaScript 語言的工做方式,它們都是在用戶使用它們的時候發生。
同時,V8 還有一個特色是 延遲(deferred)思想,這使得不少 JavaScript 代碼的編譯直到運行的時候被調用到纔會發生,這樣能夠減小時間開銷。
先看編譯階段:
![image.png](http://static.javashuo.com/static/loading.gif)
從圖中能夠看出,首先它也是將源代碼轉變成抽象語法樹,V8 引擎並不將抽象語法樹轉變成字節碼或者其餘中間表示,而是經過 JIT 編譯器的全代碼生成器(full code generator)從抽象語法樹直接生成本地代碼,這樣子減小了轉換時間。
再看運行階段:
V8 支持 JavaScript 代碼運行用到了一堆類。
![image.png](http://static.javashuo.com/static/loading.gif)
V8 引擎是按照圖 9-17 中描述的過程來執行的,實際過程更爲複雜,並且還有垃圾回收等處理。
1.3 JavaScriptCore 引擎
JavaScriptCore 引擎是 WebKit 中默認的 JavaScript 引擎,也是蘋果開源 WebKit 項目以後,開源的另一個重要的項目。
1.3.2 架構和模塊
1.3.2.1 代碼結構
![image.png](http://static.javashuo.com/static/loading.gif)
演進過程:
首先是詞法和語法分析,而後使用底層解釋器來解釋那些字節碼。
以後,經過簡單的 JIT 編譯器將它們轉化成本地代碼,最後就是引入 DFG JIT 編譯器。
最後
最後送上 編寫高效JavaScript代碼
但願本文對你有點幫助。
對 全棧開發 有興趣的朋友能夠掃下方二維碼關注個人公衆號
微信公衆號:愛寫bugger的阿拉斯加
分享 web 開發相關的技術文章,熱點資源,全棧程序員的成長之路,你們一塊兒交流成長。
只要關注公衆號並回復 福利 便免費送你六套視頻資源,絕對乾貨。
福利詳情請點擊: 免費資源分享——Python、Java、Linux、Go、node、vue、react、javaScript
![愛寫bugger的阿拉斯加](http://static.javashuo.com/static/loading.gif)
本文分享自微信公衆號 - 全棧修煉(QuanZhanXiuLian)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。