什麼是JS引擎?(每個瀏覽器都有自己的引擎...)
JS引擎,主要任務是將JS程式碼轉換為可執行的機器代碼,並在計算機上運行它,以便用戶可以與網頁進行互動;每個瀏覽器都有自己的JS引擎,然後最有名的是Google V8 引擎。
- 最有名Google V8 引擎:給了google chrome瀏覽器提供動力,也給了Node.js提供動力。Node.js使我們可以利用JS構建server端(脫離了瀏覽器)
JS引擎的基本組成(call stack & heap)
- 調用堆疊中的程式碼又是如何被編譯成電腦能懂的機器語言(0與1)呢,才能在編譯後執行?
- 每一個計算機程序最終都需要轉換成“機器碼”,也就是0和1。可以透過『編譯』和『解譯』來實現。
先談談 編譯(Compilation)和 解譯(Interpretation)的區別
先看ChatGPT定義:
編譯(Compilation):編譯是一種將高級程式語言代碼轉換為低級機器碼(機器碼)或其他可執行代碼的過程。編譯器(Compiler)負責處理整個程式,並在執行之前將其翻譯為機器碼。一旦程式編譯完成,就可以多次執行,而不需要再次編譯。經過編譯的程式執行速度通常較快。
解譯(Interpretation):解譯是一種運行高級程式語言代碼的方式,而不是事先將其轉換為低級機器碼。解譯器(Interpreter)逐行解釋並執行程式碼,每次執行都需要重新解釋。這意味著解譯程式
通常執行速度較慢
,但更靈活,因為可以根據不同環境和平台運行相同的程式。
現代的JS -> JIT語言
- 稍微分析一下在瀏覽器引擎中編譯->執行的過程:
生成的AST抽象語法樹:舉例
JS在瀏覽器中所運行時的環境
JS runtime就像是大盒子,包含了我們在瀏覽器中使用JS所需要的所有東西。在JS運行時,最重要的仍然是JS引擎(發動機),當我們在講到JS運行環境就一定會講到JS引擎
,但光有引擎是不夠的,還需要Web APIs
Web APIs
是提供給引擎的功能,不是JS本身的東西,JS是透過globe window object物件來訪問這些API的
callback queue
回調列隊(這是一種數據結構),包含了所有準備執行的回調列隊,事件監聽器中的回調函式
event loop
,就像是這運行環境的指揮官,event loop會等到call stack中的(同步)函式都執行完畢清空之後,它會調度callback queue回調列隊中的callback function到call stack去執行。
圖片擷取自 Udemy-The Complete JavaScript Course 2023: From Zero to Expert!
講師Jonas 這門課協助我立下了很好的JS基礎!!!
這是在node運行時的環境
圖片擷取自 Udemy-The Complete JavaScript Course 2023: From Zero to Expert!
以下為補充資料:
強烈推薦這個影片!event loop到底是什麼玩意兒?
event loop是使JS可以實現非同步行為的原因
圖片擷取自 Udemy-The Complete JavaScript Course 2023: From Zero to Expert!
圖片擷取自 Udemy-The Complete JavaScript Course 2023: From Zero to Expert!