一般來講,電腦是不能直接執行我們的javascript
程式碼的,它需要一個翻譯程式將人類能夠理解的程式語言 JavaScript,翻譯成機器能夠理解的機器語言。目前市面上有很多種 JavaScript 引擎,諸如 SpiderMonkey、V8、JavaScriptCore 等。而由谷歌開發的開源專案 V8 是當下使用最廣泛的 JavaScript 虛擬機器器,全球有超過 25 億檯安卓裝置,而這些裝置中都使用了 Chrome 瀏覽器,所以我們寫的 JavaScript 應用,大都跑在 V8 上。
如果這篇文章有幫助到你,❤️關注+點贊❤️鼓勵一下作者,文章公眾號首發,關注 前端南玖
第一時間獲取最新文章~
在 V8 出現之前,所有的 JavaScript 虛擬機器器所採用的都是解釋執行的方式,這是 JavaScript 執行速度過慢的一個主要原因。而 V8 率先引入了即時編譯(JIT)的雙輪驅動的設計,這是一種權衡策略,混合編譯執行和解釋執行這兩種手段,給 JavaScript 的執行速度帶來了極大的提升。通俗點理解就是:V8是一個高效能的JavaScript解析執行引擎
對與很多開發者來說,V8就像是一個黑盒,我們將一段程式碼丟給這個黑盒,它便會返回結果,我們只知道V8 的主要職責是用來編譯執行 JavaScript 程式碼的,並沒有深入瞭解過它的工作原理。
下面我們就來深入瞭解一下V8到底是如何執行JavaScript
程式碼的。
我們先從 CPU 是怎麼執行機器程式碼講起,你可以把 CPU 看成是一個非常小的運算機器,我們可以通過二進位制的指令和 CPU 進行溝通,比如我們給 CPU 發出「1000100111011000」的二進位制指令,這條指令的意思是將一個暫存器中的資料移動到另外一個暫存器中,當處理器執行到這條指令的時候,便會按照指令的意思去實現相關的操作。為了能夠完成複雜的任務,工程師們為 CPU 提供了一大堆指令,來實現各種功能,我們就把這一大堆指令稱為指令集(Instructions),也就是機器語言。
CPU 能直接識別組合語言嗎?
顯然是不行的,如果你使用組合編寫了一段程式,你還需要一個組合編譯器,其作用是將組合程式碼程式設計成機器程式碼
一般來講,計算機執行高階語言的方式有以下兩種:
改方式需要先將輸入的原始碼通過解析器編譯成中間程式碼,之後直接使用直譯器解釋執行中間程式碼,然後直接輸出結果。
採用這種方式時,也需要先將原始碼轉換為中間程式碼,然後我們的編譯器再將中間程式碼編譯成機器程式碼。通常編譯成的機器程式碼是以二進位制檔案形式儲存的,需要執行這段程式的時候直接執行二進位制檔案就可以了。還可以使用虛擬機器器將編譯後的機器程式碼儲存在記憶體中,然後直接執行記憶體中的二進位制程式碼。
即便是JavaScript
一門語言,也有好幾種流行的虛擬機器器,它們之間的實現方式也存在著部分差異,比如Chrome使用的是V8虛擬機器器,Safari使用的是JavaScript Core虛擬機器器,而Firefox則使用的是TraceMonkey虛擬機器器。
作為JavaScript的主流虛擬機器器,V8是如何編譯執行JavaScript程式碼的呢?它採用的是我們上面介紹的解釋執行、編譯執行中的哪一種呢?
解釋執行的啟動速度快,但是執行速度比較慢,而編譯執行的啟動速度慢,但是執行速度比較快,所以為了權衡兩種方法各自的優缺點,V8採用的是兩種方法結合的方式進行編譯執行JavaScript程式碼。
由於計算機只能識別二進位制指令,所以一般需要將高階程式碼編譯成計算機能夠識別的二進位制指令才能執行,一般有兩種方法:編譯執行和解釋執行。
兩種方法各有優缺點,所以V8採用了一種權衡策略,在啟動時採用解釋執行的策略,但是如果某段程式碼的執行頻率超過某個值,V8就會採用優化編譯器將其編譯成執行效率更高的機器程式碼。
V8執行JavaScript程式碼的主要流程:
-------------------------------------------
如果這篇文章有幫助到你,❤️關注+點贊❤️鼓勵一下作者,文章公眾號首發,關注 前端南玖 第一時間獲取最新的文章~
掃描下方二維條碼關注公眾號,回覆進群,拉你進前端學習交流群(WX),這裡有一群志同道合的前端小夥伴,交流技術、生活、內推、面經、摸魚,這裡都有哈,快來加入我們吧~ 回覆資料,獲取前端大量精選前端電子書及學習視訊~