成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

V8是如何執行JavaScript代碼的?

開發 前端
一般來講,電腦是不能直接運行我們的javascript代碼的,它需要一個翻譯程序將人類能夠理解的編程語言 JavaScript,翻譯成機器能夠理解的機器語言。

前言

一般來講,電腦是不能直接運行我們的javascript代碼的,它需要一個翻譯程序將人類能夠理解的編程語言 JavaScript,翻譯成機器能夠理解的機器語言。目前市面上有很多種 JavaScript 引擎,諸如 SpiderMonkey、V8、JavaScriptCore 等。而由谷歌開發的開源項目 V8 是當下使用最廣泛的 JavaScript 虛擬機,全球有超過 25 億臺安卓設備,而這些設備中都使用了 Chrome 瀏覽器,所以我們寫的 JavaScript 應用,大都跑在 V8 上。

什么是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虛擬機。

V8是如何執行JavaScript代碼的?

作為JavaScript的主流虛擬機,V8是如何編譯執行JavaScript代碼的呢?它采用的是我們上面介紹的解釋執行、編譯執行中的哪一種呢?

解釋執行的啟動速度快,但是執行速度比較慢,而編譯執行的啟動速度慢,但是執行速度比較快,所以為了權衡兩種方法各自的優缺點,V8采用的是兩種方法結合的方式進行編譯執行JavaScript代碼。

V8執行JavaScript代碼流程圖

圖片

  • 從這張圖的左側部分我們可以看出,V8在啟動執行JavaScript代碼之前,它需要初始化好執行環境,這些環境包括:「堆空間」、「棧空間」、「全局執行上下文」、「全局作用域」、「循環系統??」、「內置函數」等,這些內容都是在JavaScript執行過程中需要使用到的。
  • 在初始化完執行環境后,就可以向V8提交需要執行的JavaScript代碼了。
  • V8在接收到JavaScript代碼后,并不會立即執行,因為V8并不能直接理解JavaScript代碼的含義,這對于它來說只不過就是一段字符串而已。它需要將代碼結構化生成抽象語法樹(AST),在生成抽象語法樹的同時,V8還會生成相應的作用域。
  • 有了AST和作用域后,就可以生成字節碼了,字節碼是介于AST和機器代碼之間的中間代碼。
  • 生成字節碼后,解釋器就會按照順序解釋執行字節碼,并輸出執行結果。
  • 解釋器在執行字節碼的過程中,如果發現某段代碼被多次重復執行,那么這段代碼就會被標記成熱點代碼。
  • 當某段代碼被標記成熱點代碼后,V8就會將這段代碼交給優化編輯器,優化編輯器會在后臺將字節碼編譯為二進制代碼,然后再對編譯后的二進制代碼進行優化操作,優化后的二進制機器代碼的執行效率就會大幅提升。

總結

由于計算機只能識別二進制指令,所以一般需要將高級代碼編譯成計算機能夠識別的二進制指令才能執行,一般有兩種方法:編譯執行和解釋執行。

兩種方法各有優缺點,所以「V8采用了一種權衡策略,在啟動時采用解釋執行的策略,但是如果某段代碼的執行頻率超過某個值,V8就會采用優化編譯器將其編譯成執行效率更高的機器代碼。」

V8執行JavaScript代碼的主要流程:

  • 初始化執行環境
  • 解析JavaScript代碼生成AST和作用域
  • 根據AST和作用域生成字節碼
  • 解釋執行字節碼
  • 監聽熱點代碼
  • 優化熱點代碼為二進制的機器代碼
  • 優化生成二進制機器代碼
責任編輯:華軒 來源: 前端南玖
相關推薦

2022-09-16 08:32:25

JavaC++語言

2019-05-28 10:24:31

V8JavaScript延遲

2020-10-12 06:35:34

V8JavaScript

2022-06-02 12:02:12

V8C++JavaScript

2023-10-10 10:23:50

JavaScriptV8

2020-10-30 10:15:21

Chrome V8JavaScript前端

2020-10-12 14:59:31

V8引擎如何執行Jav

2014-11-26 09:51:24

GithubGoogleV8

2021-05-28 05:30:55

HandleV8代碼

2017-12-17 16:34:18

JavaScript代碼V8

2020-09-27 07:32:18

V8

2010-07-20 16:35:52

V8JavaScript瀏覽器

2021-07-05 22:13:09

Node內存控制

2022-06-21 08:52:47

Node.js服務端JavaScript

2022-02-25 08:32:07

nodemon搭Node.jsJavascript

2009-07-20 09:36:04

谷歌瀏覽器安全漏洞

2022-04-29 08:00:51

V8垃圾回收

2010-08-31 11:42:03

DB2MDC

2022-11-04 07:12:24

JavaScript基準測試

2011-10-19 13:47:57

ibmdwRationalWAS
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久天堂| 欧美精品福利 | 久久精品视频一区二区 | 99re在线播放| 黄网站涩免费蜜桃网站 | 国产欧美一区二区三区国产幕精品 | 欧美电影一区 | 欧美日韩国产一区二区三区 | 麻豆av片 | 久久在线 | 国产一区二区日韩 | 国产精品久久久久久久久久久久冷 | 中文字幕在线第一页 | 99久久久无码国产精品 | 欧美99| 久久大陆| 老子午夜影院 | 欧美精品一区二区三区在线 | 激情国产视频 | 国产精品一区二区在线 | 国产a一区二区 | 香蕉超碰| 欧美成人免费在线视频 | 天天干天天色 | 国产三区在线观看视频 | 日韩视频一区在线观看 | 国产精品亚洲成在人线 | 国产极品91| 99国产精品久久久久老师 | 丝袜一区二区三区 | 男女啪啪网址 | 中文字幕亚洲一区二区va在线 | 日韩高清在线观看 | 免费av毛片| 国产精品视频网站 | 国产精品69毛片高清亚洲 | 在线观看日韩av | 91精品国产色综合久久不卡蜜臀 | 福利一区二区在线 | 91久久国产精品 | 免费影视在线观看 |