三分鐘瞭解Go語言的前世今生

qfliweimin發表於2019-03-27

一、 為什麼需要一個新的語言

最近十年來,C/C++在計算領域沒有很好得到發展,並沒有新的系統程式語言出現。對開發程度和系統效率在很多情況下不能兼得。要麼執行效率高,但低效的開發和編譯,如C++;要麼執行低效,但擁有有效的編譯,如.NET、Java;所以需要一種擁有較高效的執行速度、編譯速度和開發速度的程式語言,Go就橫空出世了。

傳統的語言比如c++,大家花費太多時間來學習如何使用這門語言,而不是如何更好的表達寫作者的思想,同時編譯花費的時間實在太長,對於編寫-編譯-執行這個鏈條來說週期太長。動態語言如Python,由於沒有強型別的約束,很多問題需要在執行時發現,這種低階錯誤更應該交給編譯器來發現。

  • 人力成本越來越高

  • 機器越來越便宜

  • 機器的效能越來越厲害

  • 在開發效率和執行速度上達到平衡

go出現之前,無論組合語言、還是動態指令碼語言,在執行效率和開發效率上都不能兼備。

執行效率 execution speed: C/C++ > Java > PHP 開發效率 developing efficiency: PHP > Java > C/C++

二、 谷歌工程師的20%時間

谷歌的“20%時間”工作方式,允許工程師拿出20%的時間來研究自己喜歡的專案。語音服務Google Now、谷歌新聞Google News、谷歌地圖Google Map上的交通訊息等,全都是20%時間的產物。

Go語言最開始也是20%時間的產物。

三、 創始人

Go的三個作者分別是: Rob Pike(羅伯.派克),Ken Thompson(肯.湯普森)和Robert Griesemer(羅伯特.格利茨默) 。

  • Rob Pike:曾是貝爾實驗室(Bell Labs)的Unix團隊,和Plan 9作業系統計劃的成員。他與Thompson共事多年,並共創出廣泛使用的UTF-8 字元編碼。

  • Ken Thompson:主要是B語言、C語言的作者、Unix之父。1983年圖靈獎(Turing Award)和1998年美國國家技術獎(National Medal of Technology)得主。他與Dennis Ritchie是Unix的原創者。Thompson也發明了後來衍生出C語言的B程式語言。

  • Robert Griesemer:在開發Go之前是Google V8、Chubby和HotSpot JVM的主要貢獻者。

此外還有Plan 9開發者Russ Cox、和曾改善目前廣泛使用之開原碼編譯器GCC的Ian Taylor。

四、 Go的締造與發展

4.1 Go的命名

這是一封由 Rob Pike 在 2007 年 9 月 25 號,星期二,下午 3:12 回覆給 Robert Griesemer、Ken Thompson 的有關程式語言討論主題的郵件,郵件正文大意為:在開車回家的路上我得到了些靈感。1.給這門程式語言取名為“go”,它很簡短,易書寫。工具類可以命名為:goc、 gol、goa。互動式的除錯工具也可以直接命名為“go”。語言檔案字尾名為 .go 等等

這就是 Go 語言名字的來源,自此之後 Robert、Rob 和 Ken 三個人開始在 Google 內部進行了研發,一直到了 2009 年,Go 正式開源了,Go 專案團隊將 2009 年 11 月 10 日,即該語言正式對外開源的日字作為其官方生日。原始碼最初託管在 code.google.com 上,之後幾年才逐步的遷移到 GitHub 上。

4.2 Go的發展過程中的記事

第一個事情是在開發設計 Go 語言過程中的第一個重大驚喜是收到了以下這封郵件:

這是一封由 Ian Lance Taylor 在 2008 年 6月 7 日(星期六)的晚上 7:06 寫給 Robert Griesemer、Rob Pike、 Ken Thompson 的關於 Go gcc 編譯器前端的郵件。郵件正文大意如下:我的同事向我推薦了這個網站 http://…/go_lang.html 。這似乎是一門很有趣的程式語言。我為它寫了一個 gcc 編譯器前端。雖然這個工具仍缺少很多的功能,但它確實可以編譯網站上展示的那個素數篩選程式了。

Ian Lance Taylor 的加入以及第二個編譯器 (gcc go) 的實現 在帶來震驚的同時,也伴隨著喜悅。這對 Go 專案來說不僅僅是鼓勵,更是一種對可行性的證明。語言的第二次實現對制定語言規範和確定標準庫的過程至關重要,同時也有助於保證其高可移植性,這也是 Go 語言承諾的一部分。自此之後 Ian Lance Taylor 成為了設計和實現 Go 語言及其工具的核心人物。

第二件事情是 Russ Cox 在2008年帶著他的語言設計天賦和程式設計技巧加入了剛成立不久的 Go 團隊。Russ 發現 Go 方法的通用性意味著函式也能擁有自己的方法,這直接促成了 http.HandlerFunc 的實現,這是一個讓 Go 一下子變得無限可能的特性。Russ 還提出了更多的泛化性的想法,比如 io.Reader 和 io.Writer 介面,奠定了所有 I/O 庫的整體結構。

第三件事情是聘請了安全專家 Adam Langley 幫助 Go 走向 Google 外面的世界。Adam 為 Go 團隊做了許多不為外人知曉的工作,包括建立最初的 golang.org 網站以及 build dashboard。不過他最大的貢獻當屬建立了 cryptographic 庫。起先,在我們中的部分人看來,這個庫無論在規模還是複雜度上都不成氣候。但是就是這個庫在後期成為了很多重要的網路和安全軟體的基礎,並且成為了 Go 語言開發歷史的關鍵組成部分。許多網路基礎設施公司,比如 Cloudflare,均重度依賴 Adam 在 Go 專案上的工作,網際網路也因它變得更好。我記得當初 beego 設計的時候,session 模組設計的時候也得到了 Adam 的很多建議,因此,就 Go 而言,我們由衷地感謝 Adam。

第四個事情就是一家叫做 Docker 的公司。就是使用 Go 進行專案開發,並促進了計算機領域的容器行業,進而出現了像 Kubernetes 這樣的專案。現在,我們完全可以說 Go 是容器語言,這是另一個完全出乎意料的結果。

除了大名鼎鼎的Docker,完全用GO實現。業界最為火爆的容器編排管理系統kubernetes完全用GO實現。之後的Docker Swarm,完全用GO實現。除此之外,還有各種有名的專案,如etcd/consul/flannel,七牛雲端儲存等等 均使用GO實現。有人說,GO語言之所以出名,是趕上了雲時代。但為什麼不能換種說法?也是GO語言促使了雲的發展。

除了雲專案外,還有像今日頭條、UBER這樣的公司,他們也使用GO語言對自己的業務進行了徹底的重構。

五、最後

Go語言是谷歌2009年釋出的第二款開源程式語言(系統開發語言),它是基於編譯、垃圾收集和併發的程式語言。 Go語言專門針對多處理器系統應用程式的程式設計進行了優化,使用Go編譯的程式可以媲美 C / C++程式碼的速度,而且更加安全、支援並行程式。作為出現在21世紀的語言,其近C的執行效能和近解析型語言的開發效率,以及近乎於完美的編譯速度,已經風靡全球。特別是在雲專案中,大部分都使用了Golang來開發。不得不說,Golang早已深入人心。而對於一個沒有歷史負擔的新專案,Golang或許就是個不二的選擇。 很多人將Go語言稱為21世紀的C語言,因為Go不僅擁有C的簡潔和效能。而且還很好的提供了21世紀網際網路環境下服務端開發的各種實用特性。被稱為Go語言之父的羅勃·派克(Rob Pike)就曾說過,你是否同意Go語言,取決於你是認可少就是多,還是少就是少(Less is more or less is less)。Go語言的整個設計哲學就是:將簡單、實用體現得淋漓盡致。 如今 Go 已經是雲端計算程式語言,GO語言背靠Google這棵大樹,又不乏牛人坐鎮,是名副其實的“牛二代”。想象一下:一個只有十幾年發展經歷的程式語言,已經成為了如此巨大而且正在不斷髮展的行業的主導者,這種成功是每個人都無法想象的。



相關文章