国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

V8是如何執(zhí)行JavaScript代碼的?

這篇具有很好參考價(jià)值的文章主要介紹了V8是如何執(zhí)行JavaScript代碼的?。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前言

一般來(lái)講,電腦是不能直接運(yùn)行我們的javascript代碼的,它需要一個(gè)翻譯程序?qū)⑷祟惸軌蚶斫獾木幊陶Z(yǔ)言 JavaScript,翻譯成機(jī)器能夠理解的機(jī)器語(yǔ)言。目前市面上有很多種 JavaScript 引擎,諸如 SpiderMonkey、V8、JavaScriptCore 等。而由谷歌開(kāi)發(fā)的開(kāi)源項(xiàng)目 V8 是當(dāng)下使用最廣泛的 JavaScript 虛擬機(jī),全球有超過(guò) 25 億臺(tái)安卓設(shè)備,而這些設(shè)備中都使用了 Chrome 瀏覽器,所以我們寫(xiě)的 JavaScript 應(yīng)用,大都跑在 V8 上。

如果這篇文章有幫助到你,??關(guān)注+點(diǎn)贊??鼓勵(lì)一下作者,文章公眾號(hào)首發(fā),關(guān)注 前端南玖 第一時(shí)間獲取最新文章~

什么是V8

在 V8 出現(xiàn)之前,所有的 JavaScript 虛擬機(jī)所采用的都是解釋執(zhí)行的方式,這是 JavaScript 執(zhí)行速度過(guò)慢的一個(gè)主要原因。而 V8 率先引入了即時(shí)編譯(JIT)的雙輪驅(qū)動(dòng)的設(shè)計(jì),這是一種權(quán)衡策略,混合編譯執(zhí)行和解釋執(zhí)行這兩種手段,給 JavaScript 的執(zhí)行速度帶來(lái)了極大的提升。通俗點(diǎn)理解就是:V8是一個(gè)高性能的JavaScript解析執(zhí)行引擎

V8是如何執(zhí)行JavaScript代碼的?

對(duì)與很多開(kāi)發(fā)者來(lái)說(shuō),V8就像是一個(gè)黑盒,我們將一段代碼丟給這個(gè)黑盒,它便會(huì)返回結(jié)果,我們只知道V8 的主要職責(zé)是用來(lái)編譯執(zhí)行 JavaScript 代碼的,并沒(méi)有深入了解過(guò)它的工作原理。

下面我們就來(lái)深入了解一下V8到底是如何執(zhí)行JavaScript代碼的。

為什么需要編譯這一過(guò)程?

我們先從 CPU 是怎么執(zhí)行機(jī)器代碼講起,你可以把 CPU 看成是一個(gè)非常小的運(yùn)算機(jī)器,我們可以通過(guò)二進(jìn)制的指令和 CPU 進(jìn)行溝通,比如我們給 CPU 發(fā)出“1000100111011000”的二進(jìn)制指令,這條指令的意思是將一個(gè)寄存器中的數(shù)據(jù)移動(dòng)到另外一個(gè)寄存器中,當(dāng)處理器執(zhí)行到這條指令的時(shí)候,便會(huì)按照指令的意思去實(shí)現(xiàn)相關(guān)的操作。為了能夠完成復(fù)雜的任務(wù),工程師們?yōu)?CPU 提供了一大堆指令,來(lái)實(shí)現(xiàn)各種功能,我們就把這一大堆指令稱為指令集(Instructions),也就是機(jī)器語(yǔ)言。

CPU 能直接識(shí)別匯編語(yǔ)言嗎?

顯然是不行的,如果你使用匯編編寫(xiě)了一段程序,你還需要一個(gè)匯編編譯器,其作用是將匯編代碼編程成機(jī)器代碼

計(jì)算機(jī)執(zhí)行高級(jí)語(yǔ)言的基本方式

一般來(lái)講,計(jì)算機(jī)執(zhí)行高級(jí)語(yǔ)言的方式有以下兩種:

解釋執(zhí)行

改方式需要先將輸入的源代碼通過(guò)解析器編譯成中間代碼,之后直接使用解釋器解釋執(zhí)行中間代碼,然后直接輸出結(jié)果。

V8是如何執(zhí)行JavaScript代碼的?

編譯執(zhí)行

采用這種方式時(shí),也需要先將源代碼轉(zhuǎn)換為中間代碼,然后我們的編譯器再將中間代碼編譯成機(jī)器代碼。通常編譯成的機(jī)器代碼是以二進(jìn)制文件形式存儲(chǔ)的,需要執(zhí)行這段程序的時(shí)候直接執(zhí)行二進(jìn)制文件就可以了。還可以使用虛擬機(jī)將編譯后的機(jī)器代碼保存在內(nèi)存中,然后直接執(zhí)行內(nèi)存中的二進(jìn)制代碼。

V8是如何執(zhí)行JavaScript代碼的?

即便是JavaScript一門語(yǔ)言,也有好幾種流行的虛擬機(jī),它們之間的實(shí)現(xiàn)方式也存在著部分差異,比如Chrome使用的是V8虛擬機(jī),Safari使用的是JavaScript Core虛擬機(jī),而Firefox則使用的是TraceMonkey虛擬機(jī)。

V8是如何執(zhí)行JavaScript代碼的?

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

解釋執(zhí)行的啟動(dòng)速度快,但是執(zhí)行速度比較慢,而編譯執(zhí)行的啟動(dòng)速度慢,但是執(zhí)行速度比較快,所以為了權(quán)衡兩種方法各自的優(yōu)缺點(diǎn),V8采用的是兩種方法結(jié)合的方式進(jìn)行編譯執(zhí)行JavaScript代碼。

V8執(zhí)行JavaScript代碼流程圖

V8是如何執(zhí)行JavaScript代碼的?

  • 從這張圖的左側(cè)部分我們可以看出,V8在啟動(dòng)執(zhí)行JavaScript代碼之前,它需要初始化好執(zhí)行環(huán)境,這些環(huán)境包括:堆空間、??臻g、全局執(zhí)行上下文、全局作用域、循環(huán)系統(tǒng)??內(nèi)置函數(shù)等,這些內(nèi)容都是在JavaScript執(zhí)行過(guò)程中需要使用到的。
  • 在初始化完執(zhí)行環(huán)境后,就可以向V8提交需要執(zhí)行的JavaScript代碼了。
  • V8在接收到JavaScript代碼后,并不會(huì)立即執(zhí)行,因?yàn)閂8并不能直接理解JavaScript代碼的含義,這對(duì)于它來(lái)說(shuō)只不過(guò)就是一段字符串而已。它需要將代碼結(jié)構(gòu)化生成抽象語(yǔ)法樹(shù)(AST),在生成抽象語(yǔ)法樹(shù)的同時(shí),V8還會(huì)生成相應(yīng)的作用域。
  • 有了AST和作用域后,就可以生成字節(jié)碼了,字節(jié)碼是介于AST和機(jī)器代碼之間的中間代碼。
  • 生成字節(jié)碼后,解釋器就會(huì)按照順序解釋執(zhí)行字節(jié)碼,并輸出執(zhí)行結(jié)果。
  • 解釋器在執(zhí)行字節(jié)碼的過(guò)程中,如果發(fā)現(xiàn)某段代碼被多次重復(fù)執(zhí)行,那么這段代碼就會(huì)被標(biāo)記成熱點(diǎn)代碼。
  • 當(dāng)某段代碼被標(biāo)記成熱點(diǎn)代碼后,V8就會(huì)將這段代碼交給優(yōu)化編輯器,優(yōu)化編輯器會(huì)在后臺(tái)將字節(jié)碼編譯為二進(jìn)制代碼,然后再對(duì)編譯后的二進(jìn)制代碼進(jìn)行優(yōu)化操作,優(yōu)化后的二進(jìn)制機(jī)器代碼的執(zhí)行效率就會(huì)大幅提升。

總結(jié)

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

兩種方法各有優(yōu)缺點(diǎn),所以V8采用了一種權(quán)衡策略,在啟動(dòng)時(shí)采用解釋執(zhí)行的策略,但是如果某段代碼的執(zhí)行頻率超過(guò)某個(gè)值,V8就會(huì)采用優(yōu)化編譯器將其編譯成執(zhí)行效率更高的機(jī)器代碼。

V8執(zhí)行JavaScript代碼的主要流程:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-479797.html

  • 初始化執(zhí)行環(huán)境
  • 解析JavaScript代碼生成AST和作用域
  • 根據(jù)AST和作用域生成字節(jié)碼
  • 解釋執(zhí)行字節(jié)碼
  • 監(jiān)聽(tīng)熱點(diǎn)代碼
  • 優(yōu)化熱點(diǎn)代碼為二進(jìn)制的機(jī)器代碼
  • 優(yōu)化生成二進(jìn)制機(jī)器代碼

到了這里,關(guān)于V8是如何執(zhí)行JavaScript代碼的?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Python中使用execjs執(zhí)行JavaScript代碼:方法與常見(jiàn)錯(cuò)誤解決方案

    Python中使用execjs執(zhí)行JavaScript代碼:方法與常見(jiàn)錯(cuò)誤解決方案

    ?簡(jiǎn)介和背景: ???????? execjs 庫(kù)的作用和重要性是在Python中執(zhí)行JavaScript代碼。它允許開(kāi)發(fā)者在Python環(huán)境下調(diào)用JavaScript邏輯和功能,從而實(shí)現(xiàn)Python與JavaScript之間的交互。通過(guò) execjs ,Python開(kāi)發(fā)者可以利用JavaScript的強(qiáng)大功能和現(xiàn)有庫(kù),拓展Python應(yīng)用的能力,實(shí)現(xiàn)跨語(yǔ)言的靈

    2024年02月10日
    瀏覽(24)
  • [javascript核心-08] V8 內(nèi)存管理機(jī)制及性能優(yōu)化

    [javascript核心-08] V8 內(nèi)存管理機(jī)制及性能優(yōu)化

    V8 本身也是程序,它本身也會(huì)申請(qǐng)內(nèi)存,它申請(qǐng)的內(nèi)存稱為常駐內(nèi)存,而它又將內(nèi)存分為堆和棧 棧內(nèi)存介紹 棧用于存放JS 中的基本類型和引用類型指針 ??臻g是連續(xù)的,增加刪除只需要移動(dòng)指針,操作速度很快 ??臻g是有限的,若超出??臻g內(nèi)存,會(huì)拋出??臻g溢出錯(cuò)誤

    2024年02月16日
    瀏覽(30)
  • v8-tc39-ecma262:數(shù)組push執(zhí)行了什么?

    v8-tc39-ecma262:數(shù)組push執(zhí)行了什么?

    v8開(kāi)發(fā)文檔介紹 v8新特性 tc39-ecma262-push函數(shù)執(zhí)行步驟 上圖步驟,解釋如下: 如果是對(duì)象,則當(dāng)作對(duì)象調(diào)用設(shè)置該值 如果是類數(shù)組,則執(zhí)行類數(shù)組調(diào)用設(shè)置該值 如果參數(shù)有多個(gè)參數(shù),則: 如果,參數(shù)長(zhǎng)度+原數(shù)組長(zhǎng)度后,數(shù)組的總長(zhǎng)度超限,則拋出異常 否則,循環(huán)操作如下:

    2024年02月11日
    瀏覽(16)
  • DHTMLX Suite v8.3發(fā)布!深化JavaScript UI小部件庫(kù)使用體驗(yàn)

    DHTMLX Suite v8.3發(fā)布!深化JavaScript UI小部件庫(kù)使用體驗(yàn)

    DHTMLX?UI 組件庫(kù)允許您更快地構(gòu)建跨平臺(tái)、跨瀏覽器 Web 和移動(dòng)應(yīng)用程序。它包括一組豐富的即用式 HTML5 組件,這些組件可以輕松組合到單個(gè)應(yīng)用程序界面中。 DHTMLX?Suite v8.3已于近日正式發(fā)布啦!這個(gè)更新附帶了一組新特性和改進(jìn),旨在促進(jìn)您使用JavaScript UI小部件庫(kù)的體驗(yàn)。

    2024年02月02日
    瀏覽(19)
  • Node.js npm V8 React Express的運(yùn)行配合關(guān)系:構(gòu)建JavaScript應(yīng)用的基石

    目錄 Node.js 和 V8 引擎 Node.js 和 npm LTS(Long Term Support) React Node.js的作用 Express Node.js 和 V8 引擎 Node.js 使用 Google 的 V8 JavaScript 引擎 來(lái)執(zhí)行 JavaScript 代碼。V8 是一個(gè)高性能的 JavaScript 和 WebAssembly 引擎,用于在 Google Chrome 瀏覽器和 Node.js 中運(yùn)行 JavaScript。 V8 引擎的更新 通常包括

    2024年03月12日
    瀏覽(19)
  • 如何在程序main()函數(shù)前執(zhí)行代碼

    目錄 1、宏? 2、全局變量 3、C/C++中的構(gòu)造函數(shù) 4、利用GCC編譯器的構(gòu)造函數(shù)特性 5、預(yù)處理指令 #pragma startup 在程序的main()函數(shù)前執(zhí)行代碼可以通過(guò)以下方法實(shí)現(xiàn): 1、宏? 在頭文件中定義宏 ,將要在main()函數(shù)前執(zhí)行的代碼放在宏中,然后在main()函數(shù)前使用宏調(diào)用代碼。 2、全

    2024年02月05日
    瀏覽(24)
  • VSCode如何自動(dòng)補(bǔ)全JavaScript代碼

    在使用Visual Studio Code(以下簡(jiǎn)稱VSCode)進(jìn)行JavaScript開(kāi)發(fā)時(shí),自動(dòng)補(bǔ)全功能是一項(xiàng)非常有用的功能。它可以幫助開(kāi)發(fā)人員更快速地編寫(xiě)代碼,減少拼寫(xiě)錯(cuò)誤和語(yǔ)法錯(cuò)誤的出現(xiàn)。本文將介紹如何在VSCode中啟用和使用自動(dòng)補(bǔ)全功能。 安裝JavaScript插件 在開(kāi)始之前,你需要確保已經(jīng)安

    2024年02月03日
    瀏覽(25)
  • salesforce的按鈕執(zhí)行js代碼如何鏈接到apex代碼

    在Salesforce中,你可以通過(guò)自定義JavaScript按鈕或鏈接來(lái)觸發(fā)Apex代碼的執(zhí)行。這可以通過(guò)使用JavaScript Remoting或Visualforce頁(yè)面來(lái)實(shí)現(xiàn)。以下是一些步驟來(lái)將JavaScript按鈕與Apex代碼鏈接起來(lái): 使用JavaScript Remoting鏈接JavaScript按鈕到Apex代碼: 創(chuàng)建Apex類 :首先,創(chuàng)建一個(gè)Apex類,其中包

    2024年02月07日
    瀏覽(48)
  • 如何實(shí)現(xiàn)Spring中服務(wù)關(guān)閉時(shí)對(duì)象銷毀執(zhí)行代碼

    1.實(shí)現(xiàn)DisposableBean接口的destroy 2.在bean類的方法上增加@PreDestroy方法,那么這個(gè)方法會(huì)在DisposableBean.destory方法前觸發(fā) 3.實(shí)現(xiàn)SmartLifecycle接口的stop方法 那么這個(gè)時(shí)候我們?nèi)?dòng)一個(gè)spring容器 這個(gè)時(shí)候其實(shí)銷毀方法是不會(huì)執(zhí)行的,我們可以通過(guò),調(diào)用close方法觸發(fā)或者調(diào)用register

    2024年02月01日
    瀏覽(17)
  • python,如何設(shè)置定時(shí)執(zhí)行python代碼-windows本地

    python,如何設(shè)置定時(shí)執(zhí)行python代碼-windows本地

    最近寫(xiě)了一個(gè)python小程序,希望能每天定時(shí)執(zhí)行,但是又不想用jenkins這樣的工具,后來(lái)發(fā)現(xiàn)windows本地就可以設(shè)置,而且很好用,具體步驟如下: 首先,需確保本地python代碼已編寫(xiě)好,環(huán)境變量已配置好,能運(yùn)行成功; 1)依次進(jìn)入:控制面板-大圖標(biāo)-管理工具-任務(wù)計(jì)劃程序

    2024年02月10日
    瀏覽(26)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包