1. 程式人生 > >解釋性語言和編譯性語言&JS的事件輪詢介紹

解釋性語言和編譯性語言&JS的事件輪詢介紹

一. 解釋性語言和編譯語言介紹
JavaScript是一門解釋性語言,也是一門單執行緒語言。
何謂解釋性語言?將高階語言翻譯為機器語言有兩種方式:解釋和編譯。
----解釋性語言如Java/c#,在程式執行時開始翻譯,效率較低但可以跨平臺,只要平臺提供直譯器就可以執行原始碼。Java雖然是解釋性語言但是Java程式碼需要編譯成.class位元組碼檔案,若要執行Java程式碼還需要Jvm的解釋才可以。
可參考https://blog.csdn.net/qzc70919700/article/details/72515022
JavaScript、PHP是指令碼語言也是解釋性語言(因為指令碼語言是一種解釋性語言),指令碼語言不需要編譯,可以直接用,只要有直譯器負責解釋。JavaScript語言的直譯器是JavaScript引擎,為瀏覽器的一部分。

----編譯性語言如c/c++,將原始碼在編譯的時候先統一翻譯為機器可以執行的二進位制檔案如.exe檔案,再由機器執行。不能跨平臺,但是可以直接用.exe執行,效率高因為只翻譯了一次。
在這裡插入圖片描述
具體可參考https://blog.csdn.net/u014647208/article/details/78329187

二. 微任務和巨集任務
所謂 單執行緒是指主執行緒是單執行緒的。JS中也有非同步的概念,比如定時器執行緒、ajax執行緒等,這些非同步操作的出現就是為了解決在單執行緒下程式碼執行的等待問題,因為單執行緒下的程式碼是一行一行往下執行,萬一程式碼執行時間太久,那麼後面所有的操作都必須等待前面執行完才能進行。

javascript程式碼執行時有兩個區域,一個是同步程式碼執行區域(釋放記憶體時同步程式碼區域遵循的是先進後出);一個是非同步程式碼執行區域,非同步程式碼分為兩個佇列,巨集任務macro-task和微任務micro-task(釋放記憶體時遵循先進先出的原則)。
同步佇列的列印從上到下依次列印
遇到Promise、new Promise會立即執行
非同步佇列中分巨集任務和微任務,分到巨集任務中的一般有setTimeout、setInterval、setImmediate、messageChannel、,微任務佇列的一般有(Promise的)then方法、process.nextTick。


在這裡插入圖片描述
接下來用一個案例說明:
在這裡插入圖片描述

從主執行緒開始走:
1.程式碼整體當做巨集任務開始執行,首先遇到的是setTimeout方法,將其中的回撥函式放在巨集任務佇列中;
2.其次遇到的是new Promise,這時會立即執行console.log(“promise”)。
3.然後遇到then方法,將其放到微任務佇列中。
4.再往下走遇到console.log(‘console’),會列印console。
5.整體程式碼此時已經執行完畢,那麼此時微任務中有一個then方法,所以先執行該微任務佇列中的方法。
6.執行完畢,發現巨集任務佇列中有一個setTimeout對應的回撥函式,立即執行
7.結束所有的事件輪訓。輸出結果是:promise、console、then、setTimeout。

巨集任務執行完畢—執行微任務—再觀察是否有巨集任務—依次迴圈。可以觀察到整體程式碼執行完畢再去執行微任務,微任務執行完畢再去執行巨集任務中setTimeout的回撥函式。