亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

首頁 web前端 js教程 什麼是 JavaScript 引擎?

什麼是 JavaScript 引擎?

Dec 27, 2024 am 09:53 AM

What are JavaScript Engines?

為網(wǎng)頁編寫程式碼有時感覺有點神奇,因為我們在文件中編寫字元序列,在瀏覽器中開啟該文件,然後觀看它的實作。但了解魔法背後的技術(shù)可以幫助你更好地磨練你作為程式設(shè)計師的手藝。

在本文中,您將透過掌握支援瀏覽器的 JavaScript 引擎的複??雜性,了解 JavaScript 驅(qū)動的 Web 或行動堆疊幕後發(fā)生的事情。讓我們來分析一下 JavaScript 引擎的作用,為什麼不同的平臺使用不同的引擎,它們多年來是如何發(fā)展的,以及為什麼我們作為開發(fā)者應(yīng)該關(guān)心。

首先,一些術(shù)語

「JavaScript 引擎」通常被稱為虛擬機器的一種。 「虛擬機器」指給定電腦系統(tǒng)的軟體驅(qū)動模擬。虛擬機器有很多類型,它們根據(jù)模擬或替??代實際實體機的精確程度進行分類。

例如,「系統(tǒng)虛擬機器」提供了可以執(zhí)行作業(yè)系統(tǒng)的平臺的完整模擬。 Mac 使用者可能熟悉 Parallels,這是一個系統(tǒng)虛擬機,可讓您在 Mac 上執(zhí)行 Windows。

另一方面,「進程虛擬機器」的功能不太齊全,只能執(zhí)行一個程式或進程。 Wine 是一個進程虛擬機,可讓您在 Linux 機器上執(zhí)行 Windows 應(yīng)用程序,但不會在 Linux 機器上提供完整的 Windows 作業(yè)系統(tǒng)。

JavaScript 引擎是一種專門用於解釋和執(zhí)行 JavaScript 程式碼的進程虛擬機器。

注意:區(qū)分透過佈局網(wǎng)頁來驅(qū)動瀏覽器的引擎與解釋和執(zhí)行程式碼的低階 JavaScript 引擎非常重要。這篇關(guān)於瀏覽器如何運作的文章提供了很好的解釋。

那麼 JavaScript 引擎到底是什麼?它有什麼作用?
總而言之,JavaScript 引擎的基本工作是獲取開發(fā)人員編寫的 JavaScript 程式碼,並將其轉(zhuǎn)換為可以由瀏覽器解釋甚至嵌入到應(yīng)用程式中的快速、優(yōu)化的程式碼。事實上,JavaScriptCore 稱自己為「優(yōu)化虛擬機器」。

更準(zhǔn)確地說,每個 JavaScript 引擎都實作一個 ECMAScript 版本,JavaScript 是其中的一種方言。隨著 ECMAScript 的發(fā)展,JavaScript 引擎也不斷發(fā)展。之所以有這麼多不同的引擎,是因為每個引擎都設(shè)計用於不同的 Web 瀏覽器、無頭瀏覽器或 Node.js 等執(zhí)行階段。

您可能熟悉網(wǎng)頁瀏覽器,但什麼是無頭瀏覽器?它是一個沒有圖形使用者介面的網(wǎng)頁瀏覽器。它們對於針對您的網(wǎng)路產(chǎn)品執(zhí)行自動化測試非常有用。從 Chrome 版本 59 和 Firefox 版本 56 開始,常規(guī)瀏覽器可以以這種方式使用,特別是用於測試。 Node.js 在哪裡適合這個? Node.js 是一個非同步、事件驅(qū)動的框架,可讓您在伺服器端使用 JavaScript。由於它們是 JavaScript 驅(qū)動的工具,因此它們由 JavaScript 引擎支援。

考慮到上面虛擬機器的定義,將 JavaScript 引擎稱為進程虛擬機器是有意義的,因為它的唯一目的是讀取和編譯 JavaScript 程式碼。這並不意味著它是一個簡單的引擎。例如,JavaScriptCore 有六個“構(gòu)建塊”,用於分析、解釋、優(yōu)化和垃圾收集 JavaScript 程式碼。

這是如何運作的?

這取決於引擎。讓我們考慮兩個重要的引擎:WebKit 的 JavaScriptCore 和 Google 的 V8 引擎。這兩個引擎處理程式碼的方式不同。

JavaScriptCore 執(zhí)行一系列步驟來解釋和最佳化腳本:

它執(zhí)行詞法分析,將原始程式碼分解為一系列標(biāo)記或具有已識別含義的字串。

然後解析器會分析標(biāo)記的語法並建構(gòu)到語法樹。

然後啟動四個 JIT(即時)進程,分析並執(zhí)行解析器產(chǎn)生的字節(jié)碼。

簡單來說,這個JavaScript 引擎取得您的原始程式碼,將其分解為字串(也稱為詞法分析),取得這些字串並將它們轉(zhuǎn)換為編譯器可以理解的字節(jié)碼,然後執(zhí)行它。

Google 的 V8 引擎用 C 語言編寫,也編譯和執(zhí)行 JavaScript 原始碼、處理記憶體分配以及垃圾收集剩餘部分。它的設(shè)計由一個編譯器管道組成,可將原始程式碼直接編譯為機器碼:

  • Ignition,產(chǎn)生字節(jié)碼的解釋器

  • TurboFan,一種最佳化編譯器,可將位元組碼編譯為機器碼

  • SparkPlug,一個補充 TurboFan 的編譯器

如果您對歷史感興趣,這個新管道取代了 V8 之前使用的較舊的 Full-codegen 和 Crankshaft 雙編譯器設(shè)計。

編譯過程產(chǎn)生機器碼後,引擎會將ECMA 標(biāo)準(zhǔn)中指定的所有資料類型、運算子、物件和函數(shù)公開給瀏覽器或任何需要使用它們的執(zhí)行時間,例如Node.js, Deno 或Electron(由Visual Studio Code 使用)。

一點繞道:運行時

如果 JavaScript 引擎在後臺悄悄運行,解析程式碼並將其分解為可讀字串,以便編譯器可以讀取和編譯它,那麼運行時往往會吸引更多關(guān)注。這是為什麼?

眾所周知的運行時在 JavaScript 引擎之上工作,擴展了它們的功能。最知名的是 Node,但 Deno 和 Bun 是這個領(lǐng)域的新人。 Node 和 Deno 嵌入了 V8,Bun 嵌入了 JavaScriptCore。

Bun 聲稱比 Node 或 Deno 運行得更快,因為 JavaScriptCore 比 V8 更快,每秒處理 69,845 個 http 請求,而 Node 為 16,288 個,Deno 為 12,926 個。

正如Bun 的文檔所述,這些運行時的目標(biāo)是「在瀏覽器之外運行世界上大部分JavaScript,為未來的基礎(chǔ)設(shè)施帶來效能和複雜性增強,並透過更好、更簡單的工具提高開發(fā)人員的生產(chǎn)力。

NativeScript 是專門為使用 JavaScript 建置的跨平臺本機行動應(yīng)用程式開發(fā)而建置的執(zhí)行時間的一個很好的範(fàn)例。

這些運行時也是為了解決 JavaScript 單執(zhí)行緒架構(gòu)帶來的一些固有問題而建構(gòu)的。例如,Node 優(yōu)先考慮例程的非同步、無執(zhí)行緒執(zhí)行。所有這些運行時都提供了精心策劃的開發(fā)人員體驗,包括對深受喜愛的 API(如 fetch、websocket,甚至是 React 開發(fā)人員喜愛的 JSX)的內(nèi)建支援。這可能是它們?nèi)菀孜_發(fā)者註意的原因。

整體而言,執(zhí)行階段解決了標(biāo)準(zhǔn)瀏覽器架構(gòu)及其驅(qū)動引擎的效能差距。隨著引擎的發(fā)展,這些運行時肯定也會發(fā)展。

有哪些 JavaScript 引擎?

有多種 JavaScript 引擎可用於分析、解析和執(zhí)行客戶端程式碼。隨著每個瀏覽器版本的發(fā)布,JavaScript 引擎可能會發(fā)生變更或最佳化,以跟上 JavaScript 程式碼執(zhí)行的最新技術(shù)水平。

在被這些引擎的名稱完全混淆之前,請記住,大量的行銷活動都投入到了這些引擎及其背後的瀏覽器中,這是很有用的。在這篇對JavaScript 編譯的有用分析中,作者諷刺地指出:「如果你不知道,編譯器大約37% 是由行銷組成的,而品牌重塑是你可以對編譯器做的為數(shù)不多的事情之一,從行銷角度來看,因此列車名稱為:SquirrelFish、Nitro、SFX...」

在牢記命名和重命名這些引擎的起起落落的同時,注意 JavaScript 引擎歷史上的一些重大事件也是很有用的。我為您整理了一個方便的圖表:

Browser, Headless Browser, or Runtime JavaScript Engine
Mozilla Spidermonkey
Chrome V8
IE Chakra
Safari JavaScriptCore*
Node.js V8
Deno V8
Bun JavaScriptCore
Edge** Blink and V8

*JavaScriptCore 重寫為 SquirrelFish,更名為 SquirrelFish Extreme,也稱為 Nitro。然而,將 JavaScriptCore 稱為 WebKit 實作(例如 Safari)底層的 JavaScript 引擎仍然是正確的說法。

**Edge 最初使用 Chakra 引擎,其中部分引擎被微軟開源。然後,Edge 被重建為 Chromium 瀏覽器,底層則有 Blink 和 V8 JavaScript 引擎。

我們?yōu)槭颤N要關(guān)心?

JavaScript 引擎的程式碼解析和執(zhí)行過程的目標(biāo)是在最短的時間內(nèi)產(chǎn)生最優(yōu)化的程式碼。
最重要的是,這些引擎的發(fā)展與我們對發(fā)展網(wǎng)路和行動環(huán)境以使其盡可能高效能的追求是並行的。要追蹤這一演變,您可以在基準(zhǔn)測試圖表中查看各種引擎的表現(xiàn),例如 arewefastyet.com 上產(chǎn)生的圖表。

任何 Web 開發(fā)人員都需要了解瀏覽器中固有的差異,這些瀏覽器顯示我們努力產(chǎn)生、偵錯和維護的程式碼。為什麼某些腳本在一種瀏覽器上運行緩慢,但在另一種瀏覽器上運行速度更快?

類似地,行動開發(fā)人員,尤其是那些使用 webview 來顯示其內(nèi)容編寫混合行動應(yīng)用程式的開發(fā)人員,會想知道哪些引擎正在解釋他們的 JavaScript 程式碼。所有關(guān)心使用者體驗的 Web 開發(fā)人員都應(yīng)該了解小型裝置上各種瀏覽器固有的限制和提供的可能性。跟上
的變化 隨著您成為 Web、行動或應(yīng)用程式開發(fā)人員,JavaScript 引擎將是值得花時間的。

本文最初於 2015 年出現(xiàn)在 Telerik 開發(fā)者網(wǎng)路上,此後已針對 2022 年及以後進行了修訂和更新。維基百科的 JavaScript 引擎條目中引用了原始文章。
?

以上是什麼是 JavaScript 引擎?的詳細內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
如何在node.js中提出HTTP請求? 如何在node.js中提出HTTP請求? Jul 13, 2025 am 02:18 AM

在Node.js中發(fā)起HTTP請求有三種常用方式:使用內(nèi)置模塊、axios和node-fetch。 1.使用內(nèi)置的http/https模塊無需依賴,適合基礎(chǔ)場景,但需手動處理數(shù)據(jù)拼接和錯誤監(jiān)聽,例如用https.get()獲取數(shù)據(jù)或通過.write()發(fā)送POST請求;2.axios是基於Promise的第三方庫,語法簡潔且功能強大,支持async/await、自動JSON轉(zhuǎn)換、攔截器等,推薦用於簡化異步請求操作;3.node-fetch提供類似瀏覽器fetch的風(fēng)格,基於Promise且語法簡單

JavaScript數(shù)據(jù)類型:原始與參考 JavaScript數(shù)據(jù)類型:原始與參考 Jul 13, 2025 am 02:43 AM

JavaScript的數(shù)據(jù)類型分為原始類型和引用類型。原始類型包括string、number、boolean、null、undefined和symbol,其值不可變且賦值時復(fù)制副本,因此互不影響;引用類型如對象、數(shù)組和函數(shù)存儲的是內(nèi)存地址,指向同一對象的變量會相互影響。判斷類型可用typeof和instanceof,但需注意typeofnull的歷史問題。理解這兩類差異有助於編寫更穩(wěn)定可靠的代碼。

React與Angular vs Vue:哪個JS框架最好? React與Angular vs Vue:哪個JS框架最好? Jul 05, 2025 am 02:24 AM

選哪個JavaScript框架最好?答案是根據(jù)需求選擇最適合的。 1.React靈活自由,適合需要高度定制、團隊有架構(gòu)能力的中大型項目;2.Angular提供完整解決方案,適合企業(yè)級應(yīng)用和長期維護的大項目;3.Vue上手簡單,適合中小型項目或快速開發(fā)。此外,是否已有技術(shù)棧、團隊規(guī)模、項目生命週期及是否需要SSR也都是選擇框架的重要因素??傊?,沒有絕對最好的框架,適合自己需求的就是最佳選擇。

JavaScript時間對象,某人構(gòu)建了一個eactexe,在Google Chrome上更快的網(wǎng)站等等 JavaScript時間對象,某人構(gòu)建了一個eactexe,在Google Chrome上更快的網(wǎng)站等等 Jul 08, 2025 pm 02:27 PM

JavaScript開發(fā)者們,大家好!歡迎閱讀本週的JavaScript新聞!本週我們將重點關(guān)注:Oracle與Deno的商標(biāo)糾紛、新的JavaScript時間對象獲得瀏覽器支持、GoogleChrome的更新以及一些強大的開發(fā)者工具。讓我們開始吧! Oracle與Deno的商標(biāo)之爭Oracle試圖註冊“JavaScript”商標(biāo)的舉動引發(fā)爭議。 Node.js和Deno的創(chuàng)建者RyanDahl已提交請願書,要求取消該商標(biāo),他認(rèn)為JavaScript是一個開放標(biāo)準(zhǔn),不應(yīng)由Oracle

什麼是緩存API?如何與服務(wù)人員使用? 什麼是緩存API?如何與服務(wù)人員使用? Jul 08, 2025 am 02:43 AM

CacheAPI是瀏覽器提供的一種緩存網(wǎng)絡(luò)請求的工具,常與ServiceWorker配合使用,以提升網(wǎng)站性能和離線體驗。 1.它允許開發(fā)者手動存儲如腳本、樣式表、圖片等資源;2.可根據(jù)請求匹配緩存響應(yīng);3.支持刪除特定緩存或清空整個緩存;4.通過ServiceWorker監(jiān)聽fetch事件實現(xiàn)緩存優(yōu)先或網(wǎng)絡(luò)優(yōu)先等策略;5.常用於離線支持、加快重複訪問速度、預(yù)加載關(guān)鍵資源及後臺更新內(nèi)容;6.使用時需注意緩存版本控制、存儲限制及與HTTP緩存機制的區(qū)別。

處理諾言:鏈接,錯誤處理和承諾在JavaScript中 處理諾言:鏈接,錯誤處理和承諾在JavaScript中 Jul 08, 2025 am 02:40 AM

Promise是JavaScript中處理異步操作的核心機制,理解鍊式調(diào)用、錯誤處理和組合器是掌握其應(yīng)用的關(guān)鍵。 1.鍊式調(diào)用通過.then()返回新Promise實現(xiàn)異步流程串聯(lián),每個.then()接收上一步結(jié)果並可返回值或Promise;2.錯誤處理應(yīng)統(tǒng)一使用.catch()捕獲異常,避免靜默失敗,並可在catch中返回默認(rèn)值繼續(xù)流程;3.組合器如Promise.all()(全成功才成功)、Promise.race()(首個完成即返回)和Promise.allSettled()(等待所有完成)

利用Array.Prototype方法用於JavaScript中的數(shù)據(jù)操作 利用Array.Prototype方法用於JavaScript中的數(shù)據(jù)操作 Jul 06, 2025 am 02:36 AM

JavaScript數(shù)組內(nèi)置方法如.map()、.filter()和.reduce()可簡化數(shù)據(jù)處理;1).map()用於一對一轉(zhuǎn)換元素生成新數(shù)組;2).filter()按條件篩選元素;3).reduce()用於聚合數(shù)據(jù)為單一值;使用時應(yīng)避免誤用導(dǎo)致副作用或性能問題。

JS綜述:深入研究JavaScript事件循環(huán) JS綜述:深入研究JavaScript事件循環(huán) Jul 08, 2025 am 02:24 AM

JavaScript的事件循環(huán)通過協(xié)調(diào)調(diào)用棧、WebAPI和任務(wù)隊列來管理異步操作。 1.調(diào)用棧執(zhí)行同步代碼,遇到異步任務(wù)時交由WebAPI處理;2.WebAPI在後臺完成任務(wù)後將回調(diào)放入相應(yīng)的隊列(宏任務(wù)或微任務(wù));3.事件循環(huán)檢查調(diào)用棧是否為空,若為空則從隊列中取出回調(diào)推入調(diào)用棧執(zhí)行;4.微任務(wù)(如Promise.then)優(yōu)先於宏任務(wù)(如setTimeout)執(zhí)行;5.理解事件循環(huán)有助於避免阻塞主線程並優(yōu)化代碼執(zhí)行順序。

See all articles