日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
詳解JavaScript引擎的相關(guān)概念和工作原理

朋友,您在編譯和執(zhí)行代碼時,是否曾考慮過JavaScript背后的引擎?作為一名程序員,我建議您通過本文來了解JavaScript引擎的工作原理。這將有益于您編寫出更加流暢且高質(zhì)量的JavaScript代碼。

站在用戶的角度思考問題,與客戶深入溝通,找到扎賚特網(wǎng)站設(shè)計(jì)與扎賚特網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站建設(shè)、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、申請域名、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋扎賚特地區(qū)。

什么是JavaScript引擎?

JavaScript引擎遵循的是ECMAScript標(biāo)準(zhǔn)。此類標(biāo)準(zhǔn)定義了JavaScript引擎的工作機(jī)制和所有功能。因此,JavaScript引擎是一個程序,它可以幫助您將JavaScript代碼轉(zhuǎn)換為較低級別的機(jī)器代碼。

總的說來,諸如JavaScript和FORTRAN等高級語言都是從機(jī)器語言中抽象出來的。與C或C++相比,JavaScript的抽象程度更高。而C和C++更接近于硬件,因此運(yùn)行效率也會更高一些。

編譯(compilation)與解釋(interpretation)

編程語言通常通過編譯(compilation)和解釋(interpretation)來實(shí)現(xiàn)代碼的功能。其中,

  • 編譯器可以被定義為協(xié)助轉(zhuǎn)換代碼的程序。它可以將由任何編程語言(源語言)所編寫的代碼,轉(zhuǎn)換為另一種目標(biāo)語言的代碼。例如:將源代碼從高級編程語言轉(zhuǎn)換為低級編程語言(即機(jī)器語言),來執(zhí)行既定的任務(wù)。
  • 而解釋器則是通過逐行、逐條指令地分析源代碼,在無需第三方參與的情況下,直接在目標(biāo)機(jī)器上執(zhí)行相應(yīng)機(jī)器代碼。

盡管編譯和解釋是完成編程語言的兩個方面,但是由于使用解釋的大多數(shù)系統(tǒng)都需要由編譯器完成的翻譯工作,因此在某些情況下兩者之間是存在交集的。就JavaScript而言,其技術(shù)上的編譯,也屬于解釋類別。也就是說,JavaScript編譯器在運(yùn)行的時候,其執(zhí)行的就是Just-In-Time(JIT)編譯。在此,JavaScript引擎恰好可以連接到瀏覽器和Node JS之類的Web服務(wù)器,以便用戶具有運(yùn)行時(run-time)編譯、以及執(zhí)行JavaScript代碼的權(quán)限。

JavaScript引擎剖析

ECMA腳本通過指定瀏覽器實(shí)施JavaScript的過程,以便程序在每個單一瀏覽器中都能運(yùn)行一致。當(dāng)然,每個瀏覽器都為提交過的JavaScript代碼提供了一個運(yùn)行所需的JavaScript引擎。例如:Netscape瀏覽器使用的是Spider Monkey JavaScript引擎。該引擎被定義為帶有零優(yōu)化(zero optimizations)的基本解釋器。它雖然可以運(yùn)行提交過來的JavaScript代碼,但是耗時較長。

工作原理

JavaScript引擎工作的基本工作流程是:獲取JavaScript源代碼,然后使用易于CPU理解的二進(jìn)制指令(機(jī)器代碼)進(jìn)行編譯。

JavaScript引擎主要由基線編譯器組成,該編譯器以中間表示(intermediate representation,IR)的形式編譯代碼。換言之,它被字節(jié)碼所調(diào)用,然后將字節(jié)碼提供給解釋器。解釋器使用字節(jié)代碼,將代碼轉(zhuǎn)換為機(jī)器代碼,以適合在硬件上運(yùn)行。其實(shí),這與Java的工作原理非常相似,只不過字節(jié)代碼的生成是由程序員完成的,而字節(jié)代碼則可以被普遍共享。

雖然基線編譯器的使命是盡可能快地執(zhí)行代碼編譯,但是它還是會生成未經(jīng)優(yōu)化的字節(jié)碼。在解釋器中,這些字節(jié)碼會導(dǎo)致應(yīng)用程序的速度變慢。為此,Mozilla Firefox瀏覽器將Spider Monkey JavaScript進(jìn)行了嵌入,以優(yōu)化并提高機(jī)器代碼的效率。例如:JavaScript引擎會直觀地了解到變量的數(shù)據(jù)類型,進(jìn)而更好地生成少量的機(jī)器代碼。

此外,JavaScript引擎還可以根據(jù)代碼的執(zhí)行情況,通過收集和分析數(shù)據(jù),發(fā)現(xiàn)代碼運(yùn)行緩慢的原因,進(jìn)而給出優(yōu)化并替換的建議。

知名的JavaScript引擎

除了前面介紹過Firefox正在使用的Spider Monkey引擎,還有Internet Explorer正在使用的Chakra引擎,而Google使用的是V8引擎。雖然它們用到了不同的編譯器,但是它們所遵循的優(yōu)化結(jié)構(gòu)是相似的。

Google的V8:

由Lark Bak創(chuàng)建的The Chromium項(xiàng)目開發(fā)了開源的Javascript引擎。該項(xiàng)目為Google Chrome和Chromium網(wǎng)絡(luò)瀏覽器提供了開發(fā)服務(wù)。Chrome的V8引擎幾乎是在Chrome的首個版本誕生(2008年9月2日)的同時,就應(yīng)運(yùn)而生了。V8能夠很好地兼容Node.js和MongoDB等服務(wù)器端技術(shù)。

由于V8帶有Ignition解釋器,因此它能夠通過低級字節(jié)碼完成解釋與執(zhí)行。盡管這些低級字節(jié)碼比起機(jī)器碼來說既小又慢,但它們需要編譯的時間會更少。我們可以使用Full-Codegen編譯器,來生成未優(yōu)化的代碼。該編譯器的運(yùn)行速度比其他編譯器要快一些。JIT編譯器—Turbofan不但可以編譯代碼,并且能夠密切注意代碼是否會在整個JavaScript執(zhí)行的過程中被多次用到。也就是說,它的垃圾收集器會觀察各種對象中不再引用到的數(shù)據(jù)。而且這種數(shù)據(jù)的收集工作是由收集器來完成的。值得一提的是,在執(zhí)行垃圾回收的周期內(nèi),V8引擎將會自動停止程序的運(yùn)行。

CHAKRA:

由Microsoft開發(fā)的Chakra JavaScript引擎,被用在了Microsoft Edge Web瀏覽器中。它是Internet Explorer中Jscript引擎的一個分支。我們可以簡單地理解為:Chakra提高了Internet Explorer中JavaScript的執(zhí)行質(zhì)量。由于是用新的JavaScript編譯器組成,因此Chakra可以幫助用戶將JavaScript代碼編譯成為高級機(jī)器代碼。通過提供全新的解釋器,Chakra不但能夠在傳統(tǒng)的網(wǎng)頁上執(zhí)行腳本,而且能夠改進(jìn)JavaScript的運(yùn)行時和各種庫。

SPIDER MONKEY:

由Netscape Communications的Brendan Eich使用C和C++語言編寫的Spider Monkey,最終被發(fā)布成為了開源的JavaScript引擎。目前,它被用在包括Firefox在內(nèi)的許多享有Mozilla公共許可證(2.0版)的產(chǎn)品中。它將類型推斷(type inference)與JIT編譯器—Jaegermonkey相連接,以生成有效的代碼。

在結(jié)構(gòu)上,Spider Monkey是由一個解釋器、幾個JIT編譯器、一個反編譯器、以及一個垃圾收集器所組成。

RHINO:

由Mozilla Foundation管理的Rhino JavaScript引擎,是一款完全由Java編寫的開源軟件。它同樣可以被使用在Mozilla Firefox中。

JavaScript運(yùn)行時

與其他編程語言不同的是,JavaScript是一種單線程的語言運(yùn)行時(language runtime),且只能一次性執(zhí)行并完成程序代碼。由于代碼是按照順序被執(zhí)行的,因此那些需要花費(fèi)較長時間的代碼,可能會阻塞后續(xù)有待執(zhí)行的其他代碼。例如:當(dāng)您在瀏覽器(如:Google Chrome)上打開某個網(wǎng)站時,它會調(diào)用JavaScript的一個執(zhí)行線程,用來處理諸如滾動網(wǎng)頁,在網(wǎng)頁上打印部分內(nèi)容,偵聽DOM事件,以及執(zhí)行某項(xiàng)操作等。然而,如果JavaScript一旦停止執(zhí)行,瀏覽器就會自動停止所有各項(xiàng)操作。這就意味著瀏覽器在完成某項(xiàng)任務(wù)之前,并不會響應(yīng)其他的任何內(nèi)容。

根據(jù)概念,JavaScript運(yùn)行時是指JavaScript代碼所處的環(huán)境或條件。因此,當(dāng)JavaScript在Google Chrome上執(zhí)行時,JavaScript運(yùn)行時便是v8;如果在Mozilla上,它就是Spider Monkey;如果在IE上,則為Chakra。

JavaScript運(yùn)行時的API提供了一種執(zhí)行桌面與服務(wù)器端應(yīng)用的方法。由于這些API在Windows 10和任何版本的Windows操作系統(tǒng)上可用,因此Windows操作系統(tǒng)可以通過使用Chakra的相關(guān)標(biāo)準(zhǔn),向應(yīng)用程序添加不同的腳本功能。當(dāng)然,目標(biāo)系統(tǒng)上也需要安裝好Internet Explorer 11。

內(nèi)聯(lián)緩存(Inline Caching)

內(nèi)聯(lián)緩存的概念源于經(jīng)驗(yàn)觀察。也就是說,通過觀察并記住以前直接在調(diào)用站點(diǎn)處那些相同方法的查詢結(jié)果,來加快運(yùn)行時方法的綁定速度,并提高查找的性能。同時,為了簡化此過程,我們可以為調(diào)用站點(diǎn)分配不同的狀態(tài)。例如:將最初的站點(diǎn)分配為“未初始化(uninitialized)”狀態(tài)。那么,語言運(yùn)行時到達(dá)未初始化的特定調(diào)用站點(diǎn)時,將執(zhí)行動態(tài)查找,并將結(jié)果存儲到調(diào)用站點(diǎn)中,同時將其狀態(tài)更改為“單態(tài)(monomorphic)”。后續(xù),如果語言運(yùn)行時再次到達(dá)同一調(diào)用站點(diǎn)時,它會從現(xiàn)有的存儲中進(jìn)行檢索,并直接予以調(diào)用,而無需再次執(zhí)行任何其他的查找。此外,為了解決不同類型的對象可能出現(xiàn)在同一調(diào)用站點(diǎn)的可能性,語言運(yùn)行時還必須在代碼中插入保護(hù)條件(guard conditions)。

至此,希望您已經(jīng)對JavaScript引擎的相關(guān)概念和工作原理有所了解。希望您能更好地將其運(yùn)用到項(xiàng)目編程中。


分享名稱:詳解JavaScript引擎的相關(guān)概念和工作原理
本文來源:http://www.dlmjj.cn/article/dpihpsg.html