Go語言的誕生與發展:從Google內部到雲端革命的核心
挑戰與靈感
在21世紀中期,Google的工程師們面臨著一個令人沮喪的現實。僅僅為了測試一個單一的變更,代碼編譯就需要45分鐘或更長時間。Google的代碼庫已經變得像一張網,數千名工程師在一個龐大的存儲庫中工作,而他們的工具卻在崩潰。C++編譯耗時極長,Java佔用大量內存,Python對於系統工作來說速度太慢。多核處理器到處都是,但現有的語言使得並行編程成為一場噩夢。
在這樣的背景下,三位傳奇工程師——Robert Grezma、Rob Pike和Ken Thompson,決心打造一種新的編程語言。Pike曾在Unix和Plan 9上工作,Thompson共同創建了Unix並設計了導致C語言誕生的B語言,而Griezma在Sun公司構建了Java的虛擬機。他們不僅擁有深厚的計算機歷史背景,還擁有Google的全力支持。
他們的目標很明確:消除影響開發人員生產力的緩慢問題。正如Pike所說,Go更多地關注軟件工程,而不是編程語言研究。
語言的誕生
經過兩年的開發,2009年11月,第一個公開版本的Go發布了。它簡單、高效,旨在解決長期以來困擾工程師的挑戰。
在創建過程中,他們面臨著經典的雞和蛋問題:需要編譯器來編譯語言,但語言本身還不存在。Thompson的秘密武器是Plan 9,這是一個來自貝爾實驗室的分布式操作系統,其編譯器工具鏈精簡、快速且經過代碼測試。
團隊從用C語言編寫第一個Go編譯器開始。這個編譯器很簡單,幾乎是粗糙的,但它可以解析Go代碼並生成機器代碼。然後,他們使用這個基於C的編譯器來編譯一個用Go編寫的自身版本,這種方法稱為自舉。到2015年的Go 1.5,整個工具鏈都用Go本身編寫。
創新的運行時
Go的真正工程奇蹟在於其運行時。大多數語言要么編譯為本地代碼,速度快但複雜;要么在虛擬機上運行,如Java,靈活但速度慢。Go選擇了第三條路,構建了一個既本地又智能的運行時。
Go直接編譯為彙編代碼,但該彙編代碼鏈接到一個複雜的運行時,處理複雜的事情。運行時管理跨CPU核心的Go例程,並行運行垃圾收集,使網絡IO非阻塞,而無需編程員編寫一行線程代碼。
當Go程序發出網絡請求時,它不會阻塞整個線程。運行時會暫停該Go例程,並在等待數據時運行其他例程。這一切都是自動發生的,無需回調或asyncate關鍵字。
Go還可以交叉編譯,在Mac上編寫代碼,可以為Linux服務器、Windows機器甚至不同的CPU架構編譯。編譯器為每個目標生成正確的彙編代碼。
簡化的設計哲學
Go的創建者們採取了獨特的方法,將一切不必要的東西都去掉,將其剝離到構建大型系統所需的絕對最低限度。沒有繼承層次結構,沒有函數重載,沒有異常,甚至泛型也被砍掉了。
每個功能都必須根據一個問題來證明其存在的合理性:這對在同一代碼庫上工作的數千名團隊成員有幫助還是有害?Go最終只有25個關鍵字,而Python有35個,Java有50個,C++有60多個。
並行處理的優勢
Go將並發性作為第一公民。團隊借鑒了Tony的通信順序進程,Go程序通過輕量級Go例程之間的通道傳遞數據,而不是在線程之間共享內存。
一個Go例程只佔用2KB的棧空間,而一個Java線程佔用2MB。可以輕鬆地生成數百萬個Go例程。標準庫包括一個並行運行的垃圾收集器,在程序繼續運行時清理內存。
開源與接受度
2009年11月10日,Google將Go開源。團隊不確定編程界是否會接受這門語言,但他們希望他們關於並發性和簡單性的想法可能會影響其他語言。
反應分裂了編程世界。一些開發人員為比周圍複雜性更乾淨的東西的到來而歡呼,而另一些人則將其視為只是另一種語言,或抱怨缺少功能。但早期採用者看到了C++級別的性能和Python級別的易用性。
在Google內部,團隊開始用Go版本替換舊工具。編譯時間從幾分鐘縮短到幾秒鐘。
雲端革命的核心
2013年,Docker推出,完全用Go構建。容器在整個行業中爆發,突然間,每個人都在運行Go代碼。2014年,Google推出了同樣用Go編寫的Kubernetes。Docker和Kubernetes的組合使Go成為雲端革命的中心。
隨後,Prometheus用於監控,CD用於分布式存儲,ISTTO用於服務網格,Terraform用於基礎設施。到2024年,Go在GitHub十大語言中保持著自己的地位,為現代雲端基礎設施提供支持。
遲來的泛型
十多年來,每個Go會議都有一個問題:Go什麼時候會有泛型?團隊的回答從未改變:當我們能做好的時候。
其他語言有泛型編程,如C++中的模板和Java中的泛型。Go依靠接口和代碼生成。社區在那些錯過泛型的人和那些欣賞Go簡單性的人之間分裂。
Go團隊拒絕匆忙。他們看到了語言不小心添加功能時發生的事情。最終,在2022年3月15日,Go 1.18引入了泛型。經過13年,Go的第一個主要語言功能到來了。
與AI的結合
Go的卡通吉祥物——一個由Renee French設計的微笑藍色地鼠,成為科技界最知名的符號之一。
在2024年,37%的Go開發人員從事ML AI系統的數據管道工作,41%構建AI模型的API端點。雖然Python在AI研究中佔主導地位,但Go悄悄地為AI系統背後的基礎設施提供支持。
Go的API流量份額在2024年從8.4%躍升至12%,因為公司正在構建AI驅動的服務。
未來展望
Go的路線圖包括對現代硬件的優化,更好的CPU向量化,針對多核機器的更智能垃圾收集,以及AI工作負載的性能改進。
團隊堅持其核心原則:謹慎發展。任何新功能都必須使開發人員的生活更輕鬆,而不是更困難。
從Google內部的走廊抱怨到雲端計算的支柱,Go證明了在編程中,少即是多。這門語言的成功不是因為它有最多的功能,而是因為它有正確的功能。
在一個充滿無盡複雜性的世界中,Go將繼續發展,同時忠於使其偉大的簡單性。