瀏覽器工作原理及V8引擎


瀏覽器解析過程

當瀏覽器加載html資源時,會進行如下的解析過程

  • 遇見 HTML 標記,構建 DOM 樹
  • 遇見 style/link 標記調用相應解析器處理CSS標記,並構建出CSS樣式樹
  • 遇見 script 標記 調用javascript引擎 處理script標記、綁定事件、修改DOM 樹/CSS樹等
  • 將 DOM樹 與 CSS樹 合並成一個渲染樹
  • 根據渲染樹來渲染,以計算每個節點的幾何信息
  • 最終將各個節點繪制到屏幕上

用一張非常經典的圖來表示

瀏覽器引擎

瀏覽器引擎分為兩部分,渲染引擎和js引擎。

  • 渲染引擎用於解析、處理html、css文件、布局繪制
  • JavaScript引擎用於解析js文件,常見的JavaScript引擎有JavascriptCore、V8

我們知道,javascript是一門高級語言,它需要通過編譯才能被計算機識別,那么編譯的這個過程就由V8引擎來完成

V8引擎

V8處理JS文件經過以下幾個步驟

1、Parser模塊反對Javascript代碼進行詞法分析,解析成AST(抽象語法樹)

AST的生成如下圖所示,定義一個名為name的常量,解析成右邊的樹結構


這樣所有的代碼的結構都非常統一,便於處理

2、Ignition將AST解析成bytecode(字節碼),最后根據不同的操作系統/環境編譯成計算機可識別的機器碼
比如windows/macos,cpu架構不一致所能執行的機器指令是不一樣的,字節碼可以跨平台,等到執行的時候,V8引擎再將字節碼解析成機器碼

3、Ignition收集優化信息,通過Turbofan將bytecode編譯成機器碼
如果一個函數會被多次執行,AST-->bytecode-->機器碼這樣的過程比較浪費性能,為了進行優化,會標記此函數為熱點函數,此時Ignition會收集優化信息,如函數的參數,這樣直接通過Turbofan將字節碼編譯成機器碼。
如果優化信息發生的變化,比如函數入參的類型一直是 number,突然變成了string,這時候Turbofan會將機器碼反向的編譯成字節碼,再同Iginition解析成機器碼執行。

圖示如下

Parser模塊

Parser模塊解析成AST的過程中還經過了以下步驟

  • Blink(Chrome瀏覽器內核)將源碼交給V8引擎,Stream進行編碼轉換
  • Scanner進行詞法分析后,將代碼轉成token
  • PreParser(預解析),如果函數沒有調用則不會被解析
  • Parser模塊解析成AST
  • Ignition、Toburfan再解析

圖示如下


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM