「 Go will be the server language of the future.」 — Tobias Lütke, Shopify
在過去幾年,有一門崛起的新語言:Go 或者 GoLang。沒有什麼比一門新的編程語言更令開發者興奮了,不是麼? 所以,我在 四、5 個月以前開始學習 Go。在這裏我將告訴你,你爲何也要學習這門新語言。html
在這篇文章中,我不打算教你怎樣寫 「Hello World!!」。網上有許多其餘的文章會教你。我將闡述軟硬件發展的現狀以及爲何咱們要學習像 Go 這樣的新語言?由於若是沒有任何問題,咱們就不須要解決方案,不是麼?前端
摩爾定律正在失效。android
英特爾公司在 2004 年推出了第一款具備 3.0 GHz時鐘速度的奔騰 4 處理器。現在,個人 2016款 MacBook Pro 的時鐘速度爲 2.9 GHz。所以,差很少十年,原始處理能力都沒有太多的增長。你能夠在下圖中看處處理能力的增加與時間的關係。ios
從上面的圖表能夠看出,單線程的性能和處理器的頻率在近十年幾乎保持穩定。若是你認爲添加更多的晶體管是一種解決問題的方法,那你就錯了。這是由於在微觀尺度上,量子特性開始顯現(例如:量子隧道穿越),放更多的晶體管代價也會越多(爲何?),並且,每美圓能夠添加晶體管的數量也開始降低。git
因此,針對上述問題的解決方案以下:github
可是,以上方案也有它們自身的限制。咱們沒法向處理器添加更多的緩存以提高性能,由於緩存具備物理限制:緩存越大,速度越慢。添加更多的內核處處理器也有它的成本。並且,這也沒法無限擴展。這些多核處理器能同時運行多個線程,同時也能帶來併發能力。咱們稍後會討論它。golang
所以,若是咱們不能依賴於硬件的改進,惟一的出路就是找到一個高效的軟件來提高性能,但遺憾的是,現代編程語言都不是那麼高效。算法
「現代處理器就像一輛有氮氧加速系統的直線競速賽車,它們在直線競速賽中表現優異。不幸的是,現代編程語言卻像蒙特卡羅賽道,它們有大量的彎道。」 - David Ungar
如上所述,硬件提供商正在向處理器添加更多的內核以提高性能。全部的數據中心都在這些處理器上運行,咱們應該期待在將來幾年內核數量的增加。更重要的是,現在的應用程序都是使用多個微服務來維持數據庫的鏈接、消息隊列和緩存的維護。所以,咱們開發的軟件和編程語言能夠更容易的支持併發,而且它們應該隨着內核數量的增加而可擴展。數據庫
可是大多數現代編程語言(如 Java、Python 等)都來自於 90 年代的單線程環境。這些語言大多數都支持多線程。但真正的問題是併發執行,線程鎖、競爭條件和死鎖。這些問題都使得很難在這些語言上建立一個多線程的應用程序。編程
例如,在 Java 中建立新的線程會消耗大量內存。由於每個線程都會消耗大約 1 MB 大小的堆內存,若是你運行上千個線程,他們會對堆形成巨大的壓力,最終會因爲內存不足而宕機。此外,你想要在兩個或者多個線程之間通訊也是很是困難的。
另外一方面,Go 於 2009 年發佈,那時多核處理器已經上市了。這也是爲何 Go 是在考慮併發的基礎上構建的。Go 用 goroutine 來替代線程,它們從堆中消耗了大約 2 KB 的內存。所以你能夠隨時啓動上百萬個 goroutine。
其餘的好處:
你能在 Rob Pike 的優秀演講 併發不是並行中獲取更深入理解。
以上這些點,能使 Go 能像 Java、C 或者 C++ 同樣擁有強大的併發處理能力,同時在保證併發執行代碼嚴謹性的基礎上,像 Erlang 同樣優美。
與其餘現代高級語言(如 Java/Python)相比,使用 C、C++ 的最大好處就是它的性能,由於 C/C++ 是編譯型語言而不是解釋型語言。
處理器能理解二進制文件。一般來講,當你編譯一個用 Java 或者其餘基於 JVM 的語言構建的應用程序,它將人類可讀的代碼編譯爲字節代碼,這能夠被 JVM 或者在底層操做系統之上運行的其餘虛擬機所理解。當執行的時候,虛擬機解釋這些字節碼而且將他們轉化爲處理器能理解的二進制文件。
而另外一個方面,C/C++ 不會在 VM 上執行,而且從執行週期中刪除(編譯爲字節代碼)這一步提升性能。它直接將人類可讀的代碼編譯爲二進制文件。
可是,在這些語言中釋放和分配變量是一件極其痛苦的事情。雖然大部分編程語言都使用垃圾回收器或者引用計數的算法來處理對象的分配和移除。
Go 作到了一箭雙鵰,Go 像一些低級別的語言(如: C/C++ )同樣是一門編譯型語言,這意味着它的性能幾乎接近於低級別語言,它還用垃圾回收來分配和刪除對象。所以,再也不須要 malloc() 和 free() 聲明瞭!!!這太酷了!!!
我告訴你一件事,Go 沒有像其餘語言同樣瘋狂於編程語法,它的語法很是整潔。
Go 的的設計者在谷歌建立這門語言的時候就考慮到了這一點,因爲谷歌擁有很是強大的代碼庫,成千上萬的開發者都工做在相同的代碼庫上,代碼應該易於其餘開發者理解,一段代碼應該對另外一段代碼有最小的影響。這些都會使得代碼易於維護,易於修改。
Go 有意的忽視了許多現代面嚮對象語言的一些特性。
以上這些改變使得 Go 與其餘語言大相徑庭,這使得用 Go 編程與其餘語言很不同。你可能不喜歡以上的一些觀點。可是,並非說沒有上述這些特性,你就沒法對你的應用程序編碼。你要作的就是多寫幾行代碼,但從積極的一面,它將使你的代碼更加清晰,爲代碼添加更多的清晰度。
如上圖所示,Go 幾乎與 C/C++ 同樣高效,同時像 Ruby、Python 以及其餘一些語言同樣保持代碼語法的簡潔,對於人類和處理器來講,這是一個共贏的局面!!!
與 Swift 等這些新的語言不同,Go 的語法很是穩定。自從 2012 年首次公開發布 1.0 版本以來,它保持不變而且向後兼容。
~若是你喜歡這篇文章,點擊下方的💚以便於更多的人看到它!此外,你也能夠在 Medium 或者個人博客關注我,以便於你及時獲取 Go 的更新的文章!!~
若是發現譯文存在錯誤或其餘須要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可得到相應獎勵積分。文章開頭的 本文永久連接 即爲本文在 GitHub 上的 MarkDown 連接。
掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 Android、 iOS、 前端、 後端、 區塊鏈、 產品、 設計、 人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃、 官方微博、 知乎專欄。