V8引擎詳解(四)——字節碼是如何執行的

前言

本文是V8引擎詳解系列的第四篇,重點內容是關於V8是如何解釋執行字節碼的,關於字節碼的執行在V8中所處的環節能夠先看一下做者以前的V8引擎詳解(三)——從字節碼看V8的演變,本文會經過描述一個官方的例子來幫助你們理解,文末會有已經完成的系列文章的連接,本系列文章還在不斷更新歡迎持續關注。前端

字節碼的執行

簡單來講V8引擎一般會通過一下流程:源碼 --> AST --> 字節碼 --> 二進制代碼,源碼經過 Parse 轉成AST的過程已經在系列V8引擎詳解(二)——AST 中描述過了,接下來會經過v8 BytecodeGenerator類根據抽象語法樹將AST結構轉換成字節碼的結構,字節碼是機器碼的抽象,字節碼的相關內容能夠看一下從字節碼看V8的演變, 而Ignition引擎對生成的字節碼進行解釋執行。node

1、基於寄存器

Ignition引擎能夠對字節碼進行解釋執行,那就是說他的功能相似於Java的JVM,本質上就是一個虛擬機。 虛擬機一般有兩種分別是基於Stack(棧)的和基於Register(寄存器)的, 好比基於Stack的虛擬機有JVM,是一種比較普遍的實現方法,而咱們V8引擎中的Ignition是基於Register的,也就是基於寄存器的虛擬機,一般基於Register的虛擬機比基於Stack的虛擬機執行的更快,可是指令相對較長。程序員

Ignition是一個帶有累加器(accumulator)的寄存器,我舉一個小例子你們就明白了。 咱們先拋開字節碼看這段簡單的代碼如何計算出結果。面試

var x = 100;
var y = x +10;
x = x * y;
複製代碼

運用累加寄存器的大體運行流程以下:緩存

這種就是咱們基於寄存器虛擬機運行的一個大體流程,簡單來講就是建立一塊虛擬空間來保存參數、中間計算結果。bash

2、經過官方案例解讀字節碼

接下來會經過Google官方PPT上面的一段案例來解讀V8上字節碼的執行。我會逐圖配上一些文字註解幫助你們閱讀。babel

  • 先將源碼轉換成字節碼 框架

  • 進行函數 f 的初始化工做 ide

  • 將小整數 -100 存儲到累加器中,LdaSmi 能夠理解爲一個定義好的handle函數 後面接的 #100 就是這個函數的參數 函數

  • 將a2中存儲的150和累加器中的值求和,並將結果存於累加器 。

  • 將累加器中存儲的50保存到寄存器r0中,此時r0的值爲50。

  • 將寄存器a1也就是參數b的值存儲到累加器中,此時累加器值爲2。(a0、a一、a2 也是寄存器)

  • 將寄存器r0中的值和累加器中的值求乘積,並將結果存於累加器。

  • 將寄存器a0中的值和累加器中的值求和,並將結果存於累加器。

  • Return (包括上面的語句)自己都是定義好的handle函數,Return表明的就是將累加器中的值返回。

(隨着v8版本的更新,不一樣的版本生成的字節碼結構可能有細微差異,可是這些定義好的函數通常不會有太大變化)

經過這個例子相信你們能夠大概瞭解字節碼的執行,可是v8定義的關鍵字可不止例子中這一點(完整的放在附錄中了),在學習的過程當中開始不少關鍵字也確實很差理解,不過咱們能夠經過本身寫一些簡單的js代碼而後生成字節碼,由於咱們已知js的執行結果,能夠經過倒推的方式來理解字節碼。

總結

本文主要帶你們簡單瞭解了v8是如何解釋執行字節碼的。

有人問我,做爲一個前端學習這些東西到底有什麼用?這些東西還沒那麼容易理解,有這個時間不如多刷兩道題、看看面試問題、看看框架。
從短時間來看學習V8引擎並不能明顯的提升面試的能力,可是萬丈高樓平地起,想成爲一個優秀的前端程序員v8引擎的學習能幫助你更加深入的理解js中的一些事情,好比經過對AST的學習更加了解了babel的工做原理,爲何一個頁面第二次加載比第一次快(不只僅是靜態資源的緩存哦),爲何node選擇了v8做爲js引擎,若是不能深刻的瞭解一下,也只是在複述別人得出的結論而已。

我在寫本章的時候,想起來我面試被問的一道問題switch爲何比if else快,當時回家查了一下相關文章發現有人說switch跳錶巴拉巴拉的,我專門轉成了字節碼看了一下,發現起碼在正常的v8環境中switch比if else快純屬扯淡,從字節碼上發現,絕大部分條件下兩個幾乎都是同樣快,若是有興趣能夠本身玩一下。

V8字節碼錶

參考文章

docs.google.com/presentatio…
time.geekbang.org/column/arti…

系列文章

V8引擎詳解(一)——概述
V8引擎詳解(二)——AST
V8引擎詳解(三)——從字節碼看V8的演變
V8引擎詳解(四)——字節碼是如何執行的
V8引擎詳解(五)——內聯緩存
V8引擎詳解(六)——內存結構

相關文章
相關標籤/搜索