了解JavaScript 是如何運行的,以及的它的運行機制,首先,我們要了解瀏覽器的內核:
瀏覽器內核
了解過的都知道:不同的瀏覽器是由不同的內核組成,那么有哪些內核以及我們常用的瀏覽器都使用了那些內核:
- Gecko:早期被Netscape和Mozilla Firefox瀏覽器瀏覽器使用;
- Trident:微軟開發,被IE4~IE11瀏覽器使用,但是Edge瀏覽器已經轉向Blink;
- Webkit:蘋果基于KHTML開發、開源的,用于Safari,Google Chrome之前也在使用;
- Blink:是Webkit的一個分支,Google開發,目前應用于Google Chrome、Edge、Opera等;
所謂瀏覽器內核,指的是瀏覽器的排版引擎,即瀏覽器引擎,引擎的作業執行流程如下:

但是在這個執行程序中,HTML決議的時候遇到了JavaScript標簽,應該怎么辦呢?
會停止決議HTML,而去加載和執行JavaScript代碼;
當然,為什么不直接異步去加載執行JavaScript代碼,而要在這里停止掉呢?
所以瀏覽器希望將HTML決議的DOM和JavaScript操作之后的DOM放到一起來生成最終的DOM樹,而不是頻繁的去生成新的DOM樹;
那么,JavaScript代碼由誰來執行呢?
答案:JavaScript 引擎
JavaScript 引擎
為什么需要JavaScript引擎呢?
- 事實上我們撰寫的JavaScript無論你交給瀏覽器或者Node執行,最后都是需要被CPU執行的;
- 但是CPU只認識自己的指令集,實際上是機器語言,才能被CPU所執行;
- 所以我們需要JavaScript引擎幫助我們將JavaScript代碼翻譯成CPU指令來執行;
常見的JavaScript 引擎有哪些呢?
- SpiderMonkey:第一款JavaScript引擎,由Brendan Eich開發(也就是JavaScript作者);
- Chakra:微軟開發,用于IE瀏覽器;
- JavaScriptCore:WebKit中的JavaScript引擎,Apple公司開發;
- V8:Google開發的強大JavaScript引擎,也幫助Chrome從眾多瀏覽器中脫穎而出;
V8 是一個強大的JavaScript 引擎,
V8 引擎
-
V8是用C ++撰寫的Google開源高性能JavaScript和WebAssembly引擎,它用于Chrome和Node.js等,
-
它實作ECMAScript和WebAssembly,并在Windows 7或更高版本,macOS 10.12+和使用x64,IA-32,ARM或MIPS處理器的Linux系統上運行,
-
V8可以獨立運行,也可以嵌入到任何C ++應用程式中,
V8 引擎執行JavaScript 代碼的原理:
- Parse模塊會將JavaScript代碼轉換成AST(抽象語法樹),這是因為解釋器并不直接認識- JavaScript代碼;
- 如果函式沒有被呼叫,那么是不會被轉換成AST的;
- Parse的V8官方檔案:https://v8.dev/blog/scanner
- Ignition是一個解釋器,會將AST轉換成ByteCode(位元組碼)
- 同時會收集TurboFan優化所需要的資訊(比如函式引數的型別資訊,有了型別才能進行真實的運算);
- 如果函式只呼叫一次,Ignition會執行解釋執行ByteCode;
- Ignition的V8官方檔案:https://v8.dev/blog/ignition-interpreter
- TurboFan是一個編譯器,可以將位元組碼編譯為CPU可以直接執行的機器碼;
- 如果一個函式被多次呼叫,那么就會被標記為熱點函式,那么就會經過TurboFan轉換成優化的機器碼,提高代碼的執行性能;
- 但是,機器碼實際上也會被還原為ByteCode,這是因為如果后續執行函式的程序中,型別發生了變化(比如sum函式原來執行的是number型別,后來執行變成了string型別),之前優化的機器碼并不能正確的處理運算,就會逆向的轉換成位元組碼;
- TurboFan的V8官方檔案:https://v8.dev/blog/turbofan-jit
上面是JavaScript代碼的執行程序
學習,記錄,共勉!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/296976.html
標籤:其他
上一篇:node事件回圈中事件執行順序
