博客 / 詳情

返回

JavaScript 引擎如何工作?💭

😘前言:要了解 JavaScript 引擎,你必須瞭解當我們編譯和執行代碼時它的內容。一旦你完全閲讀了這篇文章,你就可以寫出一段優秀的代碼。這篇文章是關於JavaScript引擎的,它將幫助你瞭解JavaScript引擎的性能及其最有價值的功能,嘎嘎嘎,看下面😍。

一、什麼是 JavaScript 引擎?🧐

JavaScript引擎是一個程序,有助於將JavaScript代碼轉換為較低級別的代碼或機器代碼。ECMAScript 標準被 JavaScript 引擎所遵循。這些標準的工作是給出一個定義,JavaScript引擎應該如何工作。它還告訴它應該具有的所有功能。🥰

如果我們籠統地説,JavaScript,C,FORTRAN等高級語言已經從機器語言中抽象出來。與 C 或 C++ 相比,JavaScript 的抽象程度要離機器級別更遠。C 和 C++ 更接近硬件,以及其他使其更快的原因。

編譯和解釋✔

編譯和解釋是通常用於編程語言實現代碼的幾種方法。

編譯器可以定義為幫助轉換代碼的程序。此轉換針對已用任何編程語言(源語言)編寫的代碼執行,轉換為你作為目標的另一種編程語言。他們通過將源代碼從高級編程語言翻譯成低級編程語言(即機器語言)來執行此任務。

解釋器逐行分析你的源代碼,逐條指令分析你的源代碼,然後直接在目標機器上執行相應的機器代碼,而無需任何第三方參與。

儘管編譯和解釋是完成編程語言實現的兩個原則,但在某些情況下它們也是相互關聯的。這種關係之所以出現,是因為大多數使用口譯的系統確實執行了一些翻譯工作。翻譯工作也由編譯器完成。

如果我們談論JavaScript的類別,那麼它屬於解釋類別,即使它已經在技術上編譯了。今天的現代 JavaScript 編譯器執行運行時發生的即時 (JIT) 編譯。

JavaScript引擎連接到瀏覽器和Web服務器,例如Node JS,因此你應該具有運行時編譯和執行JavaScript代碼的權限。

二、JavaScript 引擎剖析🧐

ECMA 腳本指定了瀏覽器應實現 JavaScript 的過程,以便該程序在每個瀏覽器中都運行相同。它沒有指定JavaScript應該如何在這些瀏覽器中運行。這取決於供應商的瀏覽器來決定這一點。每個瀏覽器都為你提供一個運行JavaScript代碼的JavaScript引擎。

Spider Monkey JavaScript引擎正在被Netscape瀏覽器使用。該引擎被定義為零優化的基本解釋器。如果你在這個引擎上運行你的JavaScript代碼,它將運行和工作,但需要更多時間。😓

它是如何工作的?✔

JavaScript引擎的工作是獲取JavaScript源代碼。然後編譯為 CPU 易於理解的二進制指令(機器代碼)。

有限的JavaScript引擎由一個基線編譯器組成,其工作是以中間表示(IR)的形式編譯代碼,換句話説,它被稱為字節碼,然後將字節碼提供給解釋器。

此外,解釋器獲取此字節碼,然後轉換為機器碼。此機器代碼將進一步在機器的硬件上運行此代碼。

“它與Java的工作方式非常相似,但字節碼的生成是由程序員完成的,字節碼已經普遍共享,而不是源代碼。

基線編譯器的工作是儘可能快地執行代碼的編譯。它還生成不太優化的字節代碼。與解釋器一樣,它沒有優化的字節碼來使用,那麼應用程序的速度將非常慢。另一方面,申請的時間會非常少。

Spider Monkey JavaScript 已被嵌入到一個複雜的機器中。這樣做是為了提高高度優化的機器代碼的效率。它目前正在Mozilla Firefox瀏覽器中使用。

如果我們可以選擇製作一個高度動態和交互式的 Web 應用程序,那麼開發人員在執行 JavaScript 時會遇到問題。這是谷歌的Chrome瀏覽器在網絡平台上顯示谷歌地圖時面臨的問題。為了提高JavaScript的性能,他們提供了一個更好的解決方案,我們將在本文後面討論。

如果缺少JavaScript中的系統,那麼JavaScript引擎將產生非常少的機器代碼。因此,基於已經提到的值,JavaScript引擎可以直觀地瞭解變量的數據類型,並生成更好的代碼。

JavaScript引擎還可以執行代碼執行的分析數據的收集。它還分析運行速度非常慢的代碼。此代碼通常稱為“熱”代碼,因為它在 CPU 中被燒燬。我們可以選擇進一步優化和替換已經優化的機器代碼。

考慮到這些事情以及由全代碼生成和曲軸引起的其他問題,V8 團隊從頭開始創建新版本的 V8 發動機。創建的新版本於2017年推出。

三、其他 JavaScript 引擎呢?🧐

我們已經研究了 V8 的工作原理,我們將在本文後面詳細討論。與此非常相似,其他一些瀏覽器供應商正在遵循另一種模型,例如Firefox中使用的Spider Monkey引擎和Internet Explorer中使用的Chakra引擎。

在查看一些 JavaScript 引擎時,由於它們的多個基線和編譯器的優化,它可能看起來很複雜,但簡而言之,它們確實遵循相同的優化現象結構。

四、知名的JavaScript引擎🧐

1. 谷歌的V8:✔

它是一個開源的Javascript引擎,由Chromium項目開發。它是為Google Chrome和Chromium網絡瀏覽器開發的。這個項目是由Lark Bak介紹和創建的。當chrome的第一個版本發佈時,即2年2008月8日。與此同時,Chrome V8引擎上的第一個版本應運而生。此版本在使用Node.js和MongoDB等服務器端技術時也兼容。

解釋和執行是在低級字節碼中完成的,因為它有一個點火解釋器。儘管這些低級字節碼比機器碼更慢、更小,但它們需要的編譯時間更少。要生成未優化的代碼,可以使用全代碼生成編譯器,與其他編譯器相比,它的運行速度更快。Turbofan,JIT編譯器將編譯代碼,並且還會關注代碼,如果在整個JavaScript執行過程中多次使用。

垃圾回收器觀察其中的對象,包括不再引用的數據。此類數據的收集由該收集器完成。在執行垃圾回收週期時,V8 引擎會自動停止程序的執行。

2. Chakra:✔

Chakra JavaScript引擎由Microsoft開發,用於其Microsoft Edge網絡瀏覽器。它可以説是Internet Explorer中使用的Jscript引擎的一個分支。如果我們用簡單的話來説,Chakra 會改變 Internet Explorer 中 JavaScript 的執行質量。Chakra 由一個新的 JavaScript 編譯器組成,可幫助你將 JavaScript 代碼編譯為高級機器代碼。它為你提供了一個新的解釋器,用於在傳統網頁上執行腳本,並改進了 JavaScript 運行時和庫。

3. 蜘蛛猴:✔

這個名字是JavaScript引擎的代號,由Netscape Communications的Brendan Eich編寫。然後它後來被髮布為將其定義為開源。這目前正在由Mozilla基金會Spider Monkey維護,該Spider Monkey是用C和C++編程語言編寫的。它被用於許多Mozilla產品,包括Firefox,這在Mozilla公共許可證版本2.0下可用。它將類型推斷與 Jaegermonkey、JITcompiler 連接起來,以生成高效的代碼。

Spider Monkey 由一個解釋器、幾個 JIT 編譯器、一個反編譯器和一個垃圾回收器組成。

4. Rhino:✔

Rhino JavaScript引擎完全是用Java編寫的,它也由Mozilla基金會管理。這是作為開源軟件管理的。如果我們將其與同樣由Mozilla開發的SpiderMonkey JavaScript引擎進行比較,但是它是用C++編寫的,並且正在Mozilla Firefox中使用。

五、JavaScript 運行時

如此多的開發人員對他們的工作充滿熱情。他們完全致力於前端或後端應用程序的工作,以保護JavaScript的真正含義。

如果我們將JavaScript與其他編程語言進行比較,它與它們並不相似。它在運行時是一種單線程語言。這意味着代碼的執行已完成,但一次只能執行一段。由於代碼是按順序執行的,因此任何需要較長時間的代碼都會像往常一樣阻塞之後需要執行的其他代碼的路徑。因此,有時你會在使用谷歌瀏覽器時觀察到以下屏幕。

當你在瀏覽器上打開任何網站時,它會使用JavaScript,一個單一的執行線程。該線程負責處理所有內容,例如滾動網頁,在網頁上打印某些內容,偵聽DOM事件以及執行其他操作。

一旦 JavaScript 的執行停止,瀏覽器將自動停止執行這些操作。這意味着它將簡單地在某一點停止,換句話説,在某一點凍結,並且在該任務完成之前不會響應任何內容。

JavaScript 運行時是指 JavaScript 代碼所在的條件或環境。話雖如此,JavaScript 可以在 Google chrome 上執行,在這種情況下,你的 JavaScript 運行時是 v8,如果在 Mozilla 上 - 它是 Spider Monkey,如果是 IE - 那麼它的脈輪,如果在節點上,它又是它的 v8。

JavaScript 運行時 API 為桌面和服務器端應用程序提供了一種執行方式。這在 Windows 操作系統上運行,該操作系統使用 Chakra 標準嚮應用程序添加腳本功能。這些 API 在 Windows 10 和任何版本的 Windows 操作系統上可用。這是在計算機上安裝了 Internet Explorer 版本 11.0。

六、內聯緩存🧐

內聯緩存的概念基於經驗觀察。這意味着在特定調用站點上發生的對象通常屬於同一類型。在這些情況下,通過將方法查找的結果“內聯”(即直接存儲在調用站點)可以大大提高性能。為了簡化此過程,呼叫站點被分配了不同的狀態。最初,呼叫站點被視為“未初始化”

一旦語言運行庫到達特定的未初始化調用站點,它將執行動態查找,將結果存儲在調用站點,並將其狀態更改為“單態”。如果語言運行時再次到達同一調用站點。它從中檢索調用並直接調用它,而無需執行任何更多查找。為了考慮不同類型的對象可能出現在同一調用站點的可能性,語言運行庫還必須在代碼中插入保護條件。

好了,今天就説到這裏了,希望掘友們清楚JavaScript引擎是如何工作的。

感謝瀏覽本文🤞,若有更好的建議,歡迎評論區討論哈🌹。

如果覺得這篇乾貨很有用,加個關關🥰,點個贊贊🥰,後面我會繼續卷,分享更多幹貨!感謝支持!😍

本文參與了SegmentFault 思否寫作挑戰賽活動,歡迎正在閲讀的你也加入。
user avatar zzd41 頭像 xiangjiaochihuanggua 頭像 peter-wilson 頭像 ivyzhang 頭像 ziyeliufeng 頭像 hightopo 頭像 shaochuancs 頭像 susouth 頭像 buxia97 頭像 jianqiangdepaobuxie 頭像 weirdo_5f6c401c6cc86 頭像 ailim 頭像
56 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.