原文:http://www.hostingadvice.com/blog/nodejs-vs-golang/
最近有人批評(píng)了在高性能,網(wǎng)絡(luò)化的應(yīng)用環(huán)境中使用Node.js的價(jià)值,一些開發(fā)者已經(jīng)轉(zhuǎn)移到Go語(yǔ)言。
還有幾個(gè)知名的企業(yè)轉(zhuǎn)而使用Go,超越了語(yǔ)言的創(chuàng)造者,Google。 Dropbox已經(jīng)轉(zhuǎn)移到Go,聲稱性能得到顯著的提高,Docker虛擬化系統(tǒng)的開發(fā)人員也在使用Go。
需要注意的是,Node.js仍然被更廣泛的受眾使用,更多的模塊,更容易使用,并且不會(huì)隨時(shí)隨地。 此外,如果您正在制作Web應(yīng)用程序,那么您可能選擇Node.js語(yǔ)言,而Go目前更多的用來(lái)作為一個(gè)腳本語(yǔ)言,當(dāng)您需要優(yōu)先考慮并發(fā)和速度的時(shí)候。
在本文中,我們將從開發(fā)人員的角度來(lái)看一下Node.js和Go之間的差異,以揭示每個(gè)環(huán)境的優(yōu)缺點(diǎn)。
Node.js
Node.js(及其最近的fork,IO.js)是一個(gè)日益普及的平臺(tái),建立在一個(gè)基于JavaScript的快速運(yùn)行時(shí):V8。
V8是由Google創(chuàng)建的JS虛擬機(jī),旨在構(gòu)建可擴(kuò)展的聯(lián)網(wǎng)應(yīng)用程序。 它將JavaScript代碼編譯為本地機(jī)器代碼,使用一些復(fù)雜的優(yōu)化。 V8也對(duì)JS對(duì)象進(jìn)行內(nèi)存分配和垃圾收集。
雖然動(dòng)態(tài)類型語(yǔ)言的這些動(dòng)態(tài)優(yōu)化為開發(fā)人員提供了很大的靈活性,但它們有時(shí)會(huì)帶來(lái)一些性能成本。
由于Node.js是用JavaScript編寫的,它繼承了該語(yǔ)言的大部分屬性。 這些JavaScript現(xiàn)在非常受歡迎,ECMAScript標(biāo)準(zhǔn)開發(fā)主要以進(jìn)化方式完成,而不是革命性的方式。
這對(duì)JavaScript和Node開發(fā)有一些重要的副作用:
- 一些JavaScript語(yǔ)言缺陷難以解決,在不破壞向后兼容性的情況下。盡管最嚴(yán)重的問(wèn)題正在被修復(fù)。
- 有用但激進(jìn)的JS語(yǔ)言功能可能無(wú)法實(shí)現(xiàn),也可能僅作為附加語(yǔ)法進(jìn)行“修補(bǔ)”。與將功能整合到設(shè)計(jì)中的語(yǔ)言相比,這可能會(huì)導(dǎo)致語(yǔ)言設(shè)計(jì)更加混亂。一個(gè)很好的例子就是使用JS進(jìn)行并發(fā)計(jì)算。并發(fā)計(jì)算的JS最佳實(shí)踐從并發(fā)API(使用基于event的回調(diào))到promises的發(fā)展,到即將到來(lái)的 async generators 支持。這些日子回調(diào)地獄仍然是許多Node.js應(yīng)用程序的嚴(yán)重問(wèn)題;然而這會(huì)導(dǎo)致更少的可讀代碼,更慢的開發(fā),甚至更多的錯(cuò)誤。
所有這些意味著JavaScript語(yǔ)言演變得相當(dāng)緩慢(有些也會(huì)說(shuō)得不好),即使知道來(lái)自其他語(yǔ)言的好概念也能工作得更好。
Node.js還有一個(gè)龐大的社區(qū)和大量的應(yīng)用正在為它編寫, 所以我們不想嚇唬你,雖然在一小部分情況下會(huì)有一些陷阱;根據(jù)絕大多數(shù)開發(fā)者的意見, 這仍是一個(gè)很好的工作平臺(tái)。
Golang
Go,也被稱為“Golang”,是由Google在2007年開始編譯的面向系統(tǒng)的編程語(yǔ)言。Go可以被認(rèn)為是C語(yǔ)言和C ++語(yǔ)言等相當(dāng)保守的語(yǔ)言演變的結(jié)果。
Go改善這些語(yǔ)言的一些疑慮:
- 依賴管理不善
- 繁瑣的類型系統(tǒng)
- 內(nèi)存管理困難
- 缺乏并行計(jì)算支持
- 缺乏多核支持
Go比C或C ++更具表現(xiàn)力,可以減少所需的代碼量。
與C或C ++相比,Go可以更容易地編寫穩(wěn)健的網(wǎng)絡(luò)應(yīng)用程序,而不會(huì)犧牲性能方面的太多。 高性能在很大程度上是由于靜態(tài)編譯的Go代碼。 編譯器可以預(yù)先執(zhí)行所有的代碼檢查工作,而不是運(yùn)行時(shí)完成的動(dòng)態(tài)JS編譯器工作,很多優(yōu)化是可能的。
總結(jié)
選擇Node.js或Go取決于您最擅長(zhǎng)的開發(fā)套件類型以及網(wǎng)絡(luò)服務(wù)需要擴(kuò)展的規(guī)模。
Go現(xiàn)在可能還沒(méi)有像Node.js一樣擁有所有的社區(qū)包或分享, 但其語(yǔ)法上更干凈的并發(fā)模型, 更好的原始 cpu 和內(nèi)存綁定的性能, 以及它的能力, 以更好的并發(fā)負(fù)載可以為某些網(wǎng)絡(luò)應(yīng)用程序類型奠定更好的基礎(chǔ)。
如果您需要某些尚未適用于Go的Node.js軟件包,并且在Go中重新實(shí)現(xiàn)將有困難或昂貴,那么Node可能是更明智的選擇。
如果您希望在Ubuntu / Linux系統(tǒng)上安裝Go,請(qǐng)查看我們安裝Go的指南。然后訪問(wèn)GoByExample和在線Go book,了解更多精彩教程。
如果您想給Node.js一個(gè)鏡頭,請(qǐng)務(wù)必查看我們的 安裝Node.js指南,以及免費(fèi)的Node.js托管服務(wù)列表。然后前往NodeSchool.io了解一些有關(guān)Node.js編程的精彩教程。