概述
JavaScript引擎是執(zhí)行 JavaScript 代碼的程序或解釋器。JavaScript引擎可以實現為標準解釋器,或者以某種形式將JavaScript編譯為字節(jié)碼的即時編譯器。
以為實現JavaScript引擎的流行項目的列表:
V8 — 開源,由 Google 開發(fā),用 C ++ 編寫 Rhino — 由 Mozilla 基金會管理,開源,完全用 Java 開發(fā) SpiderMonkey — 是第一個支持 Netscape Navigator 的 JavaScript 引擎,目前正供 Firefox 使用 JavaScriptCore — 開源,以Nitro形式銷售,由蘋果為Safari開發(fā) KJS — KDE 的引擎,最初由 Harri Porten 為 KDE 項目中的 Konqueror 網頁瀏覽器開發(fā) Chakra (JScript9) — Internet Explorer Chakra (JavaScript) — Microsoft Edge Nashorn, 作為 OpenJDK 的一部分,由 Oracle Java 語言和工具組編寫 JerryScript — 物聯網的輕量級引擎為什么要創(chuàng)建V8引擎?
由谷歌構建的V8引擎是開源的,使用c++編寫。這個引擎是在谷歌Chrome中使用的,但是,與其他引擎不同的是 V8 也用于流行的 node.js。
V8最初被設計用來提高web瀏覽器中JavaScript執(zhí)行的性能。為了獲得速度,V8 將 JavaScript 代碼轉換成更高效的機器碼,而不是使用解釋器。它通過實現 JIT (Just-In-Time) 編譯器將 JavaScript 代碼編譯為執(zhí)行時的機器碼,就像許多現代 JavaScript 引擎(如SpiderMonkey或Rhino (Mozilla)) 所做的那樣。這里的主要區(qū)別是 V8 不生成字節(jié)碼或任何中間代碼。
V8 曾有兩個編譯器
在 V8 的 5.9 版本出來之前,V8 引擎使用了兩個編譯器:
full-codegen — 一個簡單和非常快的編譯器,產生簡單和相對較慢的機器碼。 Crankshaft — 一種更復雜(Just-In-Time)的優(yōu)化編譯器,生成高度優(yōu)化的代碼。V8 引擎也在內部使用多個線程:
主線程執(zhí)行你所期望的操作:獲取代碼、編譯代碼并執(zhí)行它 還有一個單獨的線程用于編譯,因此主線程可以在前者優(yōu)化代碼的同時繼續(xù)執(zhí)行 一個 Profiler 線程,它會告訴運行時我們花了很多時間,讓 Crankshaft 可以優(yōu)化它們 一些線程處理垃圾收集器當第一次執(zhí)行 JavaScript 代碼時,V8 利用 full-codegen 編譯器,直接將解析的 JavaScript 翻譯成機器代碼而不進行任何轉換。這使得它可以非常快速地開始執(zhí)行機器代碼。請注意,V8 不使用中間字節(jié)碼,從而不需要解釋器。
當代碼已經運行一段時間后,分析線程已經收集了足夠的數據來判斷應該優(yōu)化哪個方法。
接下來,Crankshaft 從另一個線程開始優(yōu)化。它將 JavaScript 抽象語法樹轉換為被稱為 Hydrogen 的高級靜態(tài)單分配(SSA)表示,并嘗試優(yōu)化 Hydrogen 圖,大多數優(yōu)化都是在這個級別完成的。
內聯代碼
新聞熱點
疑難解答
圖片精選