跳至主要内容

[Session6] Node, V8, libuv, 和非阻塞式處理(Unit44)

本筆記非原創筆記,內容整理自 Learn and Understand NodeJS @ Udemy

V8

V8 是一個 JavaScript 引擎,主要是透過 C++ 所寫成,它可以幫助我們把 JavaScript 程式語言中所規範的程式碼,轉換成其他電腦可以理解的機器語言(machine language)

img

V8 可以獨立執行,同時也可以嵌入在任何的 C++ 的程式中。因此,在實際應用上,我們可以把 V8 嵌入在其他的 C++ 的程式中,如此除了 V8 原本提供的 JavaScript 標準規範中可用的功能外,透過 C++ ,還可以擴充 JavaScript 的功能。也就是說,幾乎任何 C++ 可以做到的事情,我們就可以透過 JavaScript 來執行。

img

Node

NodeJS 就是透過 V8 所提供的 JavaScript 標準規範語法,再加上 C++ 所能提供的功能來擴充 JavaScript 的語法。Joyent 則是一開始開發和贊助 Node 的公司。在 Node 中使用 Joyent 所開發的 libuv 來處理非同步事件。

事件(events)

在 Node 中主要包含兩種不同的事件,一種是處理電腦系統的事件,它是以 C++ 為核心,採用的是 libuv 這個非同步處理的函式庫(以 C 語言為主)。另一種則是我們可以客制化自己定義的事件類型,它是以 JS 為核心,利用 Event Emitter 的方式,當事件發生時發出事件通知。但因為所有的 code 都會被包裝成 JS 的方式,所以在使用時一般我們不會去做區分。

另外在 JS 中實際上是沒有 event emitter 這樣的東西,因此在 Node 中利用一些方式來幫助我們做出 event emitter 這樣的行為。

img

我們知道 JavaScript 本身是同步的程式語言(synchronous),V8 也是,程式會逐行執行,一次做一件事;但是 Node 則是非同步的(Asynchronous),之所以能夠達到非同步的效果,是透過 Node 當中的所採用的 libuv,它可以向我們的系統發出請求,並且將事件放在排程(queue)中,這裡面有一個稱作 event loop 的東西,它會不斷的檢查排程中有沒有未完成的事件,當系統的事件完成時,libuv 會使用觸發這個事件的 callback ,表示這個事件完成了,我們可以做這個事件完成後要執行的函式。

event driven non-blocking I/O

整個事件處理的流程像是這樣:我們發出請求要去執行某些事件,並且在這個事件完成時獲取通知。於是我們把這個事件放到 Node libuv 的排程(queue)當中,event loop 則會不斷地幫我們檢查 queue 中有哪些為處理的事件。由於這時候我們的 JavaScript 可以繼續執行程式的其他部分,因此稱作非阻塞(non-blocking),也就是在不讓程式語言停下來的情況下去處理其他的事。

在 Node 中,JS 可以交代 Node 要做的事情,然後再繼續執行其他的程式指令。

img