你不得不了解的Go的歷史和現狀

jodkreaper 發佈 2023-02-02T23:08:00.688274+00:00

Go 語言是怎樣誕生的?

Go 語言是怎樣誕生的?

Go 語言的創始人有三位,分別是圖靈獎獲得者、C 語法聯合發明人、Unix 之父肯·湯普森(Ken Thompson),Plan 9 作業系統領導者、UTF-8 編碼的最初設計者羅伯·派克(Rob Pike),以及 Java 的 HotSpot 虛擬機和 Chrome 瀏覽器的 JavaScript V8 引擎的設計者之一羅伯特·格瑞史莫(Robert Griesemer)。他們可能都沒有想到,他們三個人在 2007 年 9 月 20 日下午的一次普通討論,就這麼成為了計算機程式語言領域的一次著名歷史事件,開啟了一個新程式語言的歷史。

那天下午,在谷歌山景城總部的那間辦公室里,羅伯·派克啟動了一個 C++ 工程的編譯構建。按照以往的經驗判斷,這次構建大約需要一個小時。利用這段時間,羅伯·派克和羅伯特·格瑞史莫、肯·湯普森坐在一處,交換了關於設計一門新程式語言的想法。之所以有這種想法,是因為當時的谷歌內部主要使用 C++ 語言構建各種系統,但 C++ 的巨大複雜性、編譯構建速度慢以及在編寫服務端程序時對並發支持的不足,讓三位大佬覺得十分不便,他們就想著設計一門新的語言。在他們的初步構想中,這門新語言應該是能夠給程式設計師帶來快樂、匹配未來硬體發展趨勢並適合用來開發谷歌內部大規模網絡服務程序的。趁熱打鐵!在第一天的簡短討論後,第二天這三位大佬又在谷歌總部的「雅溫得(Yaounde)」會議室里具體討論了這門新語言的設計。會後羅伯特·格瑞史莫發出了一封題為「prog lang discussion」的電郵,對這門新程式語言的功能特性做了初步的歸納總結:

這封電郵對這門新程式語言的功能特性做了歸納總結。主要思路是,在 C 語言的基礎上,修正一些明顯的缺陷,刪除一些被詬病較多的特性,增加一些缺失的功能,比如,使用 import 替代 include、去掉宏、增加垃圾回收、支持接口等。這封電郵成為了這門新語言的第一版特性設計稿,三位大佬在這門語言的一些基礎語法特性上達成了初步一致。9 月 25 日,羅伯·派克在一封回復電郵中把這門新程式語言命名為「go」:

在羅伯·派克的心目中,「go」這個單詞短小、容易輸入並且在組合其他字母後便可以用來命名 Go 相關的工具,比如編譯器(goc)、彙編器(goa)、連結器(gol)等(go 的早期版本曾如此命名 go 工具鏈,但後續版本撤銷了這種命名方式,僅保留 go 這一統一的工具鏈名稱 )。這裡我還想澄清一個誤區,很多 Go 語言初學者經常稱這門語言為 Golang,其實這是不對的:「Golang」僅應用於命名 Go 語言官方網站,而且當時沒有用 go.com 純粹是這個域名被占用了而已。

從「三人行」到「眾人拾柴」

經過早期討論,Go 語言的三位作者在語言設計上達成初步一致後,便開啟了 Go 語言疊代設計和實現的過程。2008 年初,Unix 之父肯·湯普森實現了第一版 Go 編譯器,用於驗證之前的設計。這個編譯器先將 Go 代碼轉換為 C 代碼,再由 C 編譯器編譯成二進位文件。到 2008 年年中,Go 的第一版設計就基本結束了。這時,同樣在谷歌工作的伊恩·泰勒(Ian Lance Taylor)為 Go 語言實現了一個 gcc 的前端,這也是 Go 語言的第二個編譯器。伊恩·泰勒的這一成果不僅僅是一種鼓勵,也證明了 Go 這一新語言的可行性 。有了語言的第二個實現,對 Go 的語言規範和標準庫的建立也是很重要的。隨後,伊恩·泰勒以團隊的第四位成員的身份正式加入 Go 語言開發團隊,後面也成為了 Go 語言,以及其工具設計和實現的核心人物之一。羅斯·考克斯(Russ Cox)是 Go 核心開發團隊的第五位成員,也是在 2008 年加入的。進入團隊後,羅斯·考克斯利用函數類型是「一等公民」,而且它也可以擁有自己的方法這個特性巧妙設計出了 http 包的HandlerFunc類型。這樣,我們通過顯式轉型就可以讓一個普通函數成為滿足http.Handler接口的類型了。

不僅如此,羅斯·考克斯還在當時設計的基礎上提出了一些更泛化的想法,比如io.Reader和io.Writer接口,這就奠定了 Go 語言的 I/O 結構模型。後來,羅斯·考克斯成為 Go 核心技術團隊的負責人,推動 Go 語言的持續演化。到這裡,Go 語言最初的核心團隊形成,Go 語言邁上了穩定演化的道路。

2009 年 10 月 30 日,羅伯·派克在 Google Techtalk 上做了一次有關 Go 語言的演講「The Go Programming Language」,這也是 Go 語言第一次公之於眾。十天後,也就是 2009 年 11 月 10 日,谷歌官方宣布 Go 語言項目開源,之後這一天也被 Go 官方確定為 Go 語言的誕生日。

在 Go 語言項目開源後,Go 語言也迎來了自己的「吉祥物」,是一隻由羅伯·派克夫人芮妮·弗倫奇(Renee French)設計的地鼠,從此地鼠(gopher)也就成為了世界各地 Go 程式設計師的象徵,Go 程式設計師也被暱稱為 Gopher,在後面的課程中,我會直接使用 Gopher 指代 Go 語言開發者。

Go 語言項目的開源使得 Go 語言吸引了全世界開發者的目光,再加上 Go 三位作者在業界的影響力以及谷歌這座大樹的加持,更多有才華的程式設計師加入到 Go 核心開發團隊中,更多貢獻者開始為 Go 語言項目添磚加瓦。於是,Go 在宣布開源的當年,也就是 2009 年,就成為了著名程式語言排行榜 TIOBE 的年度最佳程式語言。

2012 年 3 月 28 日,Go 1.0 版本正式發布,同時 Go 官方發布了「Go 1 兼容性」承諾:只要符合 Go 1 語言規範的原始碼,Go 編譯器將保證向後兼容(backwards compatible),也就是說我們使用新版編譯器也可以正確編譯用老版本語法編寫的代碼。

此,Go 語言發展得非常迅猛。從正式開源到現在,十一年的時間過去了,Go 語言發布了多個大版本更新,逐漸成熟。這裡,我也梳理了迄今為止 Go 語言的重大版本更新,希望能幫助你快速了解 Go 語言的演化歷史。

關鍵字: