JavaScript代碼是如何被機器理解并執行的呢?
作為 JavaScript 開發者,通常我們不需要關心JavaScript引擎是如何執行代碼的。但是,了解 JavaScript 引擎的工作原理,知曉它如何處理我們編寫的 JS 代碼、肯定是有益的。
注意:這篇文章講述的原理,基于 Node.js 和 Chromium 的瀏覽器所使用的 V8 引擎。
HTML 解析器遇到script標簽時,會從網絡、緩存中以字節流的方式加載代碼。此階段,字節流解碼器會負責將字節轉為代碼字符。
例如,字節流中的 0066 解碼為 f,0075 解碼為 u,006e 解碼為 n,0063 解碼為 c,0074 解碼為 t,0069 解碼為 i,006f 解碼為 o,006e 解碼為 n。結合起來便是: function! JavaScript 中的一個函數關鍵字,這時會將它做為JavaScript代碼,并創建一個標記并發送給JS引擎。
JS引擎使用兩個解析器:預解析器和解析器。為了減少加載網頁所需的時間,引擎會盡量避免立即解析不必要的代碼。預解析器處理可能稍后會使用的代碼,而解析器則處理立即需要的代碼!
如果某個函數只有在用戶點擊按鈕后才會被調用,那么不必要立即編譯這段代。如果用戶最終點擊了按鈕并需要那段代碼,它才會被發送到解析器。
解析器根據從字節流解碼器接收到的代碼創建節點:創建一個抽象語法樹(AST)。
接下來,輪到解釋器了!解釋器遍歷 AST,并根據 AST 包含的信息生成字節碼。
一旦字節碼完全生成,AST 就會被刪除,從而釋放內存空間。字節碼已經是機器可以識別和處理的東西!
字節碼速度很快。
但還可以更快。當字節碼運行時,它可以檢測某些行為是否經常發生,比如你多次調用一個函數:這時便可優化它,讓它運行得更快:字節碼與行為反饋數據一起被發送到優化編譯器。優化編譯器接從這些信息中生成高度優化過的字節碼:機器碼。
總結而言,JS代碼變為機器可識別的整個過程是:
字節流 → JavaScript代碼 → 抽象語法樹(AST) → 字節碼 → 機器碼。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.