JavaScript 如何打敗眾語言,成為 Node 的實現(xiàn)語言?
Node.js 是一種將 JS 放在服務(wù)器端實現(xiàn)的平臺,而為什么要把js放到服務(wù)器端實現(xiàn),JS 最初設(shè)計是在瀏覽器端解釋執(zhí)行,后來為什么搞Node.js 把他放在服務(wù)器端執(zhí)行呢?
關(guān)于這個問題,近日有網(wǎng)友解釋道:
Node.js 的作者 Ryan Dahl 是一名資深的 C/C++ 程序員,在創(chuàng)造出 Node 之前,他的主要工作都是圍繞高性能 Web 服務(wù)器進(jìn)行的。經(jīng)歷過一些嘗試和失敗之后,他找到了設(shè)計高性能,Web 服務(wù)器的幾個要點:事件驅(qū)動、非阻塞I/O。
Ryan Dahl 最初的目標(biāo)是寫一個基于事件驅(qū)動、非阻塞 I/O的 Web 服務(wù)器,以達(dá)到更高的性能,提供 Apache 等服務(wù)器之外的選擇。他提到,大多數(shù)人不設(shè)計一種更簡單和更有效率的程序的主要原因是他們用到了阻塞 I/O 的庫。寫作 Node 的時候,Ryan Dahl 曾經(jīng)評估過 C、Lua、Haskell、Ruby 等語言作為備選實現(xiàn),結(jié)論為:
-
C 的開發(fā)門檻高,可以預(yù)見不會有太多的開發(fā)者能將它用于日常的業(yè)務(wù)開發(fā),所以舍棄它;
-
Ryan Dahl 覺得自己還不足夠玩轉(zhuǎn)Haskell,所以舍棄它;
-
Lua 自身已經(jīng)含有很多阻塞 I/O 庫,為其構(gòu)建非阻塞 I/O 庫也不能改變?nèi)藗兝^續(xù)使用阻塞 I/O 庫的習(xí)慣,所以也舍棄它;
-
而 Ruby 的虛擬機由于性能不好而落選。
相比之下,JavaScript 比 C 的開發(fā)門檻要低,比Lua的歷史包袱要少。盡管服務(wù)器端 JavaScript 存在已經(jīng)很多年了,但是后端部分一直沒有市場,可以說歷史包袱為零,為其導(dǎo)入非阻塞 I/O 庫沒有額外阻力。
另外,JavaScript 在瀏覽器中有廣泛的事件驅(qū)動方面的應(yīng)用,暗合 Ryan Dahl 喜好基于事件驅(qū)動的需求。當(dāng)時,第二次瀏覽器大戰(zhàn)也漸漸分出高下,Chrome 瀏覽器的 JavaScript 引擎 V8 摘得性能***的桂冠,而且其基于新 BSD 許可證發(fā)布,自然受到 Ryan Dahl 的歡迎??紤]到高性能、符合事件驅(qū)動、沒有歷史包袱這3個主要原因,JavaScript 成為了 Node 的實現(xiàn)語言。