當前位置:
首頁 > 最新 > 從 Node到Go:一個粗略的比較

從 Node到Go:一個粗略的比較

這個帖子不是為了證明一種語言比另一種語言更好。由於各種原因,每種編程語言都在軟體開發社區中佔有一席之地。 我的意圖是強調 Go 和 Node 之間的差異,並且促進展示一種新的 Web 開發語言。

-- John Stamatakos

本文導航

大體上的差異

08%

語法

14%

社區

44%

性能

53%

循環/算術

61%

I/O

66%

冒泡排序

74%

判決

84%

結論

89%

資料

95%

編譯自https://medium.com/xo-tech/from-node-to-go-a-high-level-comparison-56c8b717324a#.byltlz535

作者John Stamatakos

譯者trnhoe

在 XO 公司,我們最初使用 Node 和 Ruby 構建相互連接的服務系統。我們享受 Node 帶來的明顯性能優勢,以及可以訪問已有的大型軟體包倉庫。我們也可以輕鬆地在公司內部發布並復用已有的插件和模塊。極大地提高了開發效率,使得我們可以快速編寫出可拓展的和可靠的應用。而且,龐大的 Node 社區使我們的工程師向開源軟體貢獻更加容易(比如BunnyBus

[1]

和Felicity

[2]

)。

雖然我在大學時期和剛剛工作的一些時間在使用更嚴謹的編譯語言,比如 C++ 和 C#,而後來我開始使用 JavaScript。我很喜歡它的自由和靈活,但是我最近開始懷念靜態和結構化的語言,因為當時有一個同事讓我對 Go 語言產生了興趣。

我從寫 JavaScript 到寫 Go,我發現兩種語言有很多相似之處。兩者學習起來都很快並且易於上手,都具有充滿表現力的語法,並且在開發者社區中都有很多工作機會。沒有完美的編程語言,所以你應該總是選擇一個適合手頭項目的語言。在這篇文章中,我將要說明這兩種語言深層次上的關鍵區別,希望能鼓勵沒有用過 Go 語言的用戶可以有機會使用 Go 。

大體上的差異

在深入細節之前,我們應該先了解一下兩種語言之間的重要區別。

Go,或稱 Golang,是 Google 在 2007 年創建的自由開源編程語言。它以快速和簡單為設計目標。Go 被直接編譯成機器碼,這就是它速度的來源。使用編譯語言調試是相當容易的,因為你可以在早期捕獲大量錯誤。Go 也是一種強類型的語言,它有助於數據完整,並可以在編譯時查找類型錯誤。

另一方面,JavaScript 是一種弱類型語言。除了忽略驗證數據的類型和真值判斷陷阱所帶來的額外負擔之外,使用弱類型語言也有自己的好處。比起使用介面interfaces和范型generics,柯里化currying和可變的形參個數flexible arity讓函數變得更加靈活。JavaScript 在運行時進行解釋,這可能導致錯誤處理和調試的問題。Node 是一款基於 Google V8 虛擬機的 JavaScript 運行庫,這使它成為一個輕量和快速的 Web 開發平台。

語法

作為原來的 JavaScript 開發者,Go 簡單和直觀的語法很吸引我。由於兩種語言的語法可以說都是從 C 語言演變而來的,所以它們的語法有很多相同之處。Go 被普遍認為是一種「容易學習的語言」。那是因為它的對開發者友好的工具、精簡的語法和固守慣例(LCTT 譯註:慣例優先)。

Go 包含大量有助於簡化開發的內置特性。你可以用標準 Go 構建工具把你的程序用 命令編譯成二進位可執行文件。使用內置的測試套件進行測試只需要運行 即可。 諸如原生支持的並發等特性甚至在語言層面上提供。

Google 的 Go 開發者

[3]

認為,現在的編程太複雜了,太多的「記賬一樣,重複勞動和文書工作」。這就是為什麼 Go 的語法被設計得如此簡單和乾淨,以減少混亂、提高效率和增強可讀性。它還鼓勵開發人員編寫明確的、易於理解的代碼。Go 只有25 個保留關鍵字

[4]

和一種循環( 循環),而不像 JavaScript 有大約 84 個關鍵字

[5]

(包括保留關鍵字字、對象、屬性和方法)。

為了說明語法的一些差異和相似之處,我們來看幾個例子:

標點符號: Go 去除了所有多餘的符號以提高效率和可讀性。儘管 JavaScript 中需要符號的地方也不多(參見:Lisp

[6]

),而且經常是可選的,但我更加喜歡 Go 的簡單。

JavaScript 中的標點

Go 中的標點

賦值:由於 Go 是強類型語言,所以你在初始化變數時可以使用 操作符來進行類型推斷,以避免重複聲明

[7]

,而 JavaScript 則在運行時聲明類型。

JavaScript 中的賦值

Go 的賦值

導出:在 JavaScript 中,你必須從某個模塊中顯式地導出。 在 Go 中,任何大寫的函數將被默認導出。

JavaScript 中的導出

Go 中的導出

導入:在 JavaScript 中 庫是導入依賴項和模塊所必需的,而 Go 則利用原生的 關鍵字通過包的路徑導入模塊。另一個區別是,與 Node 的中央 NPM 存儲庫不同,Go 使用 URL 作為路徑來導入非標準庫的包,這是為了從包的源碼倉庫直接克隆依賴。

JavaScript 的導入

Go 的導入

返回值:通過 Go 的多值返回特性可以優雅地傳遞和處理返回值和錯誤,並且通過傳遞引用減少了不正確的值傳遞。在 JavaScript 中需要通過一個對象或者數組來返回多個值。

JavaScript 的返回

Go 的返回

錯誤處理:Go 推薦在錯誤出現的地方捕獲它們,而不是像 Node 一樣在回調中讓錯誤冒泡。

JavaScript 的錯誤處理

Go 的錯誤處理

可變參數函數:Go 和 JavaScript 的函數都支持傳入不定數量的參數。

JavaScript 中的可變參數函數

Go 中的可變參數函數

社區

當比較 Go 和 Node 提供的編程範式哪種更方便時,兩邊都有不同的擁護者。Node 在軟體包數量和社區的大小上完全勝過了 Go。Node 包管理器(NPM),是世界上最大的軟體倉庫,擁有超過 410,000 個軟體包,每天以 555 個新軟體包的驚人速度增長

[8]

。這個數字可能看起來令人吃驚(確實是),但是需要注意的是,這些包許多是重複的,且質量不足以用在生產環境。 相比之下,Go 大約有 13 萬個包。

Node 和 Go 包的數量

儘管 Node 和 Go 歲數相仿,但 JavaScript 使用更加廣泛,並擁有巨大的開發者和開源社區。因為 Node 是為所有人開發的,並在開始的時候就帶有一個強壯的包管理器,而 Go 是特地為 Google 開發的。下面的Spectrum 排行榜

[9]

顯示了當前流行的的頂尖 Web 開發語言。

Web 開發語言排行榜前 7 名

JavaScript 的受歡迎程度近年來似乎保持相對穩定,而Go 一直在保持上升趨勢

[10]

編程語言趨勢

性能

如果你的主要關注點是速度呢?當今似乎人們比以前更重視性能的優化。用戶不喜歡等待信息。 事實上,如果網頁的載入時間超過 3 秒,40% 的用戶會放棄訪問您的網站

[11]

因為它的非阻塞非同步 I/O,Node 經常被認為是高性能的語言。另外,正如我之前提到的,Node 運行在針對動態語言進行了優化的 Google V8 引擎上。而 Go 的設計也考慮到速度。Google 的開發者們

[3]

通過建立了一個「充滿表現力而輕量級的類型系統;並發和垃圾回收機制;強制地指定依賴版本等等」,達成了這一目標。

我運行了一些測試來比較 Node 和 Go 之間的性能。這些測試注重於語言提供的初級能力。如果我準備測試例如 HTTP 請求或者 CPU 密集型運算,我會使用 Go 語言級別的並發工具(goroutines/channels)。但是我更注重於各個語言提供的基本特性(參見三種並發方法

[12]

了解關於 goroutines 和 channels 的更多知識)。

我在基準測試中也加入了 Python,所以無論如何我們對 Node 和 Go 的結果都很滿意。

循環/算術

迭代十億項並把它們相加:

Node

Go

Python

結果

這裡的輸家無疑是 Python,花了超過 7 秒的 CPU 時間。而 Node 和 Go 都相當高效,分別用了 900 ms 和 408 ms。

修正:由於一些評論表明 Python 的性能還可以提高。我更新了結果來反映這些變化。同時,使用 PyPy 大大地提高了性能。當使用 Python 3.6.1 和 PyPy 3.5.7 運行時,性能提升到 1.234 秒,但仍然不及 Go 和 Node 。

I/O

遍歷一百萬個數字並將其寫入一個文件。

Node

Go

Python

結果

Python 以 7.82 秒再次排名第三。 這次測試中,Node 和 Go 之間的差距很大,Node 花費大約 1.172 秒,Go 花費了 213 毫秒。真正令人印象深刻的是,Go 大部分的處理時間花費在編譯上。如果我們將代碼編譯,以二進位運行,這個 I/O 測試僅花費 78 毫秒——要比 Node 快 15 倍。

修正:修改了 Go 代碼以實現緩存 I/O。

冒泡排序

將含有十個元素的數組排序一千萬次。

Node

Go

Python

結果

像剛才一樣,Python 的表現是最差的,大約花費 15 秒完成了任務。 Go 完成任務的速度是 Node 的 16 倍。

判決

Go 無疑是這三個測試中的贏家,而 Node 大部分表現都很出色。Python 也表現不錯。要清楚,性能不是選擇編程語言需要考慮的全部內容。如果您的應用不需要處理大量數據,那麼 Node 和 Go 之間的性能差異可能是微不足道的。 有關性能的一些其他比較,請參閱以下內容:

Node Vs. Go

[13]

Multiple Language Performance Test

[14]

Benchmarks Game

[15]

結論

這個帖子不是為了證明一種語言比另一種語言更好。由於各種原因,每種編程語言都在軟體開發社區中佔有一席之地。 我的意圖是強調 Go 和 Node 之間的差異,並且促進展示一種新的 Web 開發語言。 在為一個項目選擇語言時,有各種因素需要考慮,比如開發人員的熟悉程度、花費和實用性。 我鼓勵在決定哪種語言適合您時進行一次徹底的底層分析。

正如我們所看到的,Go 有如下的優點:接近底層語言的性能,簡單的語法和相對簡單的學習曲線使它成為構建可拓展和安全的 Web 應用的理想選擇。隨著 Go 的使用率和社區活動的快速增長,它將會成為現代網路開發中的重要角色。話雖如此,我相信如果 Node 被正確地實現,它正在向正確的方向努力,仍然是一種強大而有用的語言。它具有大量的追隨者和活躍的社區,使其成為一個簡單的平台,可以讓 Web 應用在任何時候啟動和運行。

資料

如果你對學習 Go 語言感興趣,可以參閱下面的資源:

Golang 網站

[16]

Golang Wiki

[17]

Golang Subreddit

[18]

via:https://medium.com/xo-tech/from-node-to-go-a-high-level-comparison-56c8b717324a#.byltlz535

作者:John Stamatakos

[20]

譯者:trnhoe校對:wxy

本文由LCTT原創編譯,Linux中國榮譽推出

LCTT 譯者

trnhoe

共計翻譯:2篇

貢獻時間:235 天


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Linux中國 的精彩文章:

Docker 引擎的 Swarm 模式:添加工作者節點教程
開發一個 Linux 調試器(七):源碼級斷點
Docker 引擎的 Swarm 模式:入門教程
創建更好的災難恢復計劃
使用 OctoDNS 啟用 DNS 分割權威

TAG:Linux中國 |