成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

javascript引擎工作原理的初步了解

DevTTL / 1560人閱讀

摘要:引擎是能運(yùn)行代碼的程序或解釋器。代碼的運(yùn)行明顯的分成兩個階段,也就是編譯階段和運(yùn)行字節(jié)碼階段。它首先由編譯器編譯成字節(jié)碼文件,然后再通過虛擬機(jī)從文件中讀一行解釋執(zhí)行一行。

Javascript引擎是能運(yùn)行javascript代碼的程序或解釋器。做為前端開發(fā)人員,了解javascript底層的工作原理,可以用助于寫出高效的javascript代碼。那我們就來看一下,我們寫的代碼是如何在javascript引擎中運(yùn)行的。

javascript引擎如何解釋執(zhí)行javascript代碼

大家都知道javascript屬于解釋型語言,所謂解釋型語言就是引擎直接讀取源碼,然后出結(jié)果,這樣做效率非常低。相對的大家都知道C++代碼執(zhí)行很快,因?yàn)镃++屬于編譯型語言,所謂編譯型語言就是把源代碼編譯成可執(zhí)行程序后才可以運(yùn)行,C++就是把源代碼編譯成本地代碼后執(zhí)行的。編譯的過程沒有時間要求,所以在編譯的過程中可以做更多的優(yōu)化,生成執(zhí)行更快的代碼。

下面我們先來看一下早期JavaScript引擎的執(zhí)行過程:

再看一下C++語言的編譯過程:

開發(fā)人員開發(fā)完源代碼后,使用編譯器將源代碼編譯成本地代碼(機(jī)器碼/匯編代碼), 用戶只是使用編譯后的本地代碼,這些本地代碼被系統(tǒng)加載器加載后,由操作系統(tǒng)調(diào)度CPU直接執(zhí)行。因?yàn)榻?jīng)過編譯器源代碼被編譯成了本地代碼,可以由操作系統(tǒng)直接執(zhí)行,所以它的執(zhí)行速度飛快。

我們再來看一下另一個老牌語言——Java的運(yùn)行過程。Java代碼的運(yùn)行明顯的分成兩個階段,也就是編譯階段和運(yùn)行字節(jié)碼階段。它首先由編譯器編譯成.class(字節(jié)碼)文件,然后再通過JVM(Java虛擬機(jī))從.class文件中讀一行解釋執(zhí)行一行。也正是由于不同的操作系統(tǒng)有不同的JVM,所以實(shí)現(xiàn)了真正意義上的跨平臺。

在這里在給大家介紹一下字節(jié)碼和本地代碼的區(qū)別:

字節(jié)碼是跨平臺的一種中間表示,該字節(jié)碼與平臺無關(guān),需要借助虛擬機(jī)解釋執(zhí)行

本地代碼與操作系統(tǒng)有關(guān),不同的操作系統(tǒng)編譯成的本地代碼不同

既然Java的執(zhí)行過程是使用解釋器執(zhí)行字節(jié)碼,這樣肯定比C++直接執(zhí)行本地代碼速度上要慢,為了解決執(zhí)行的性能問題,Java引入了一個特別NB技術(shù) —— JIT(Just-In-Time)。這個為啥NB呢,因?yàn)樗闹饕饔镁褪墙鉀Q解釋性語言的性能問題。哈哈^^! 這個技術(shù)的主要思想是當(dāng)解釋器解釋代碼時,不僅僅解釋字節(jié)碼,而且將其中一些字節(jié)碼(主要是使用率高的部分)轉(zhuǎn)成本地代碼,這樣就可以被CPU直接執(zhí)行,從而極大地提高性能。這個技術(shù)被廣泛地使用在各種語言的執(zhí)行環(huán)境中,如Java虛擬機(jī),JavaScript的眾多引擎中。

隨著JavaScript越來越受歡迎,JavaScript引擎也在不斷的向前輩學(xué)習(xí),努力提高Javascript執(zhí)行速度。我們來看一下現(xiàn)在的JavaScript引擎的執(zhí)行過程:

在現(xiàn)在JavaScript引擎中,大致的執(zhí)行過程是:

編譯器將源代碼編譯成抽象語法樹,再將抽象語法樹編譯成字節(jié)碼;解釋器來接收字節(jié)碼,解釋執(zhí)行這些字節(jié)碼;JIT工具,分析這些字節(jié)碼并將其中的部分字節(jié)碼轉(zhuǎn)換成本地代碼。

這個過程和Java的編譯和執(zhí)行過程很像,只是Java語言中這兩個階段是分開執(zhí)行的,編譯階段可以盡可能的生成高效的字節(jié)碼,這樣在執(zhí)行階段可以執(zhí)行的更快。而對于Javascript而言,它的編譯階段是在網(wǎng)頁和JavaScript文件下載后同執(zhí)行階段一起在網(wǎng)頁的加載和渲染過程中來實(shí)施的,所以對于JavaScript引擎執(zhí)行過程中的每個階段時間越少越好。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/94049.html

相關(guān)文章

  • 前端周報:前端面試題及答案總結(jié);JavaScript參數(shù)傳遞深入理解

    摘要:前端面試題及答案總結(jié)掘金技術(shù)征文金三銀四,金九銀十,用來形容求職最好的幾個月。因?yàn)榈拇嬖冢辽僭诒粯?biāo)準(zhǔn)化的那一刻起,就支持異步編程了。然而異步編程真正發(fā)展壯大,的流行功不可沒。 showImg(https://segmentfault.com/img/bVVQOH?w=640&h=319); 1、2017前端面試題及答案總結(jié) |掘金技術(shù)征文 金三銀四,金九銀十,用來形容求職最好的幾個月...

    ermaoL 評論0 收藏0
  • 學(xué)Java編程需要注意地方

    摘要:學(xué)編程真的不是一件容易的事不管你多喜歡或是多會編程,在學(xué)習(xí)和解決問題上總會碰到障礙。熟練掌握核心內(nèi)容,特別是和多線程初步具備面向?qū)ο笤O(shè)計(jì)和編程的能力掌握基本的優(yōu)化策略。   學(xué)Java編程真的不是一件容易的事,不管你多喜歡或是多會Java編程,在學(xué)習(xí)和解決問題上總會碰到障礙。工作的時間越久就越能明白這個道理。不過這倒是一個讓人進(jìn)步的機(jī)會,因?yàn)槟阋恢辈粩嗟膶W(xué)習(xí)才能很好的解決你面前的難題...

    leanxi 評論0 收藏0
  • JavaScript 是如何工作:編寫自己 Web 開發(fā)框架 + React 及其虛擬 DOM

    摘要:與大多數(shù)全局對象不同,沒有構(gòu)造函數(shù)。為什么要設(shè)計(jì)更加有用的返回值早期寫法寫法函數(shù)式操作早期寫法寫法可變參數(shù)形式的構(gòu)造函數(shù)一般寫法寫法當(dāng)然還有很多,大家可以自行到上查看什么是代理設(shè)計(jì)模式代理模式,為其他對象提供一種代理以控制對這個對象的訪問。 這是專門探索 JavaScript 及其所構(gòu)建的組件的系列文章的第 19 篇。 如果你錯過了前面的章節(jié),可以在這里找到它們: 想閱讀更多優(yōu)質(zhì)文章請...

    余學(xué)文 評論0 收藏0
  • JavaScript 工作原理之一-引擎,運(yùn)行時,調(diào)用堆棧(譯)

    摘要:本章會對語言引擎,運(yùn)行時,調(diào)用棧做一個概述。調(diào)用棧只是一個單線程的編程語言,這意味著它只有一個調(diào)用棧。查看如下代碼當(dāng)引擎開始執(zhí)行這段代碼的時候,調(diào)用棧會被清空。之后,產(chǎn)生如下步驟調(diào)用棧中的每個入口被稱為堆棧結(jié)構(gòu)。 原文請查閱這里,本文采用知識共享署名 4.0 國際許可協(xié)議共享,BY Troland。 本系列持續(xù)更新中,Github 地址請查閱這里。 這是 JavaScript 工作原...

    Betta 評論0 收藏0
  • JavaScript 工作原理之一-引擎,運(yùn)行時,調(diào)用堆棧(譯)

    摘要:本章會對語言引擎,運(yùn)行時,調(diào)用棧做一個概述。調(diào)用棧只是一個單線程的編程語言,這意味著它只有一個調(diào)用棧。查看如下代碼當(dāng)引擎開始執(zhí)行這段代碼的時候,調(diào)用棧會被清空。之后,產(chǎn)生如下步驟調(diào)用棧中的每個入口被稱為堆棧結(jié)構(gòu)。 原文請查閱這里,本文采用知識共享署名 4.0 國際許可協(xié)議共享,BY Troland。 本系列持續(xù)更新中,Github 地址請查閱這里。 這是 JavaScript 工作原...

    Alex 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<