Google 大佬們為什麼要開發 Go 這門新語言?

煎魚發表於2022-01-20

大家好,我是煎魚。

大家平時都是在用 Go 語言,那以往已經有了 C、C++、Java、PHP。Google 的大佬們為什麼還要再開發一門新的語言呢?

難不成是造輪子,其他語言不香嗎?

背景

Go 程式語言構思於 2007 年底,構思的目的是:為了解決在 Google 開發軟體基礎設施時遇到的一些問題。

Go 語言之父

圖上三位是 Go 語言最初的設計者,功力都非常的深厚,按序從左起分別是:

  • Robert Griesemer:參與過 Google V8 JavaScript 引擎和 Java HotSpot 虛擬機器的研發。
  • Rob Pike:Unix 作業系統早期開發者之一,UTF-8 創始人之一,Go 語言吉祥物設計者是 Rob Pike 的媳婦。
  • Ken Thompson:圖靈獎得主,Unix 作業系統早期開發者之一,UTF-8 創始人之一,C 語言(前身 B 語言)的設計者。

遇到的問題

曾經在早期的採訪中,Google 大佬們反饋感覺 "程式設計" 太麻煩了,他們很不喜歡 C++,對於現在工作所用的語言和環境感覺比較沮喪,充滿著許多不怎麼好用的特性。

具體遭遇到的問題。如下:

  • 軟體複雜:多核處理器、網路系統、大規模計算叢集和網路程式設計模型所帶來的問題只能暫時繞開,沒法正面解決。
  • 軟體規模:軟體規模也發生了變化,今天的伺服器程式由數千萬行程式碼組成,由數百甚至數千名程式設計師進行工作,而且每天都在更新(據聞 Go 就是在等編譯的 45 分鐘中想出來的)。
  • 編譯耗時:在大型編譯叢集中,構建時間也延長到了幾分鐘,甚至幾小時。

設計目的

為了實現上述目標,在既有語言上改造的話,需要解決許多根本性的問題,因此需要一種新的語言。

這門新語言需要符合以下需求:

  • 目的:設計和開發 Go 是為了使在這種環境下能夠提高工作效率
  • 設計:在 Go 的設計上,除了比較知名的方面:如內建併發和垃圾收集。還考慮到:嚴格的依賴性管理,隨著系統的發展,軟體架構的適應性,以及跨越元件之間邊界的健壯性。

這門新語言就是現在的 Go。

Go 在 Google

Go 是 Google 設計的一種程式語言,用於幫助解決谷歌的問題,而 Google 的問題很大。

Google 整體的應用軟體很龐大,硬體也很龐大,有數百萬行的軟體,伺服器主要是 C++ 語言,其他部分則是大量的 Java 和 Python。

數以千計的工程師在程式碼上工作,在一個由所有軟體組成的單一樹的 "頭 " 上工作,所以每天都會對該樹的所有層次進行重大改變。

一個大型的定製設計的分散式構建系統使得這種規模的開發是可行的,但它仍然很大。

當然,所有這些軟體都在幾十億臺機器上執行,這些機器被視為數量不多的獨立、聯網的計算叢集。

簡而言之,Google 的開發規模很大,速度可能是緩慢的,而且往往是笨拙的。但它是有效的。

Go 專案的目標是:消除 Google 軟體開發的緩慢和笨拙,從而使這個過程更富有成效和可擴充套件。這門語言是由編寫、閱讀、除錯和維護大型軟體系統的人設計的,也是為他們設計的

因此 Go 的目的不是為了研究程式語言的設計,而是為了改善其設計者及其同事的工作環境。

Go 更多的是關於軟體工程而不是程式語言研究。或者換個說法,它是為軟體工程服務的語言設計。

痛點

當 Go 釋出時,有些人聲稱它缺少被認為是現代語言的必要條件的特定功能或方法。在缺乏這些設施的情況下,Go怎麼可能有價值?

我們的答案是:Go 所擁有的特性可以解決那些使大規模軟體開發變得困難的問題。

這些問題包括:

  • 構建速度緩慢。
  • 不受控制的依賴關係。
  • 每個程式設計師使用不同的語言子集。
  • 對程式的理解不透徹(程式碼可讀性差,文件不全等)。
  • 工作的重複性。
  • 更新的成本。
  • 版本偏移(version skew)。
  • 編寫自動工具的難度。
  • 跨語言的構建。

純粹一門語言的單個功能並不能解決這些問題,我們需要對軟體工程有一個更大的看法。因此在 Go 的設計中,我們試圖把重點放在這些問題的解決方案上。

總結

軟體工程指導了 Go 的設計。

與大多數通用程式語言相比,Go 的設計是為了解決我們在構建大型伺服器軟體時接觸到的一系列軟體工程問題。這可能會使 Go 聽起來相當沉悶和工業化。

但事實上,整個設計過程中對清晰、簡單和可組合性的關注反而導致了一種高效、有趣的語言,許多程式設計師發現它的表現力和力量。

為此產生的 Go 特性包括:

  • 清晰的依賴關係。
  • 清晰的語法。
  • 清晰的語義。
  • 相對於繼承的組合。
  • 程式設計模型提供的簡單性(垃圾收集、併發)。
  • 簡單的工具(Go工具、gofmt、godoc、gofix)。

這就是為什麼要開發 Go 的由來,以及為什麼會產生如此的設計和特性的原因。

你學會了嗎?:)

若有任何疑問歡迎評論區反饋和交流,最好的關係是互相成就,各位的點贊就是煎魚創作的最大動力,感謝支援。

文章持續更新,可以微信搜【腦子進煎魚了】閱讀,本文 GitHub github.com/eddycjy/blog 已收錄,學習 Go 語言可以看 Go 學習地圖和路線,歡迎 Star 催更。

參考

相關文章