Go 語言的起源,發(fā)展與普及

用更少的代碼,更短的編譯時間,創(chuàng)建運行更快的程序,享受更多的樂趣。

起源與發(fā)展

Go 語言起源 2007 年,并于 2009 年正式對外發(fā)布。它從 2009 年 9 月 21 日開始作為谷歌公司 20% 兼職項目,即相關員工利用 20% 的空余時間來參與 Go 語言的研發(fā)工作。該項目的三位領導者均是著名的 IT 工程師:Robert Griesemer,參與開發(fā) Java HotSpot 虛擬機;Rob Pike,Go 語言項目總負責人,貝爾實驗室 Unix 團隊成員,參與的項目包括 Plan 9,Inferno 操作系統(tǒng)和 Limbo 編程語言;Ken Thompson,貝爾實驗室 Unix 團隊成員,C 語言、Unix 和 Plan 9 的創(chuàng)始人之一,與 Rob Pike 共同開發(fā)了 UTF-8 字符集規(guī)范。自 2008 年 1 月起,Ken Thompson 就開始研發(fā)一款以 C 語言為目標結果的編譯器來拓展 Go 語言的設計思想。

這是一個由計算機領域 “發(fā)明之父” 所組成的黃金團隊,他們對系統(tǒng)編程語言,操作系統(tǒng)和并行都有著非常深刻的見解

在 2008 年年中,Go 語言的設計工作接近尾聲,一些員工開始以全職工作狀態(tài)投入到這個項目的編譯器和運行實現(xiàn)上。Ian Lance Taylor 也加入到了開發(fā)團隊中,并于 2008 年 5 月創(chuàng)建了一個 gcc 前端。

Russ Cox 加入開發(fā)團隊后著手語言和類庫方面的開發(fā),也就是 Go 語言的標準包。在 2009 年 10 月 30 日,Rob Pike 以 Google Techtalk 的形式第一次向人們宣告了 Go 語言的存在。

直到 2009 年 11 月 10 日,開發(fā)團隊將 Go 語言項目以 BSD-style 授權(完全開源)正式公布了 Linux 和 Mac OS X 平臺上的版本。Hector Chu 于同年 11 月 22 日公布了 Windows 版本。

作為一個開源項目,Go 語言借助開源社區(qū)的有生力量達到快速地發(fā)展,并吸引更多的開發(fā)者來使用并改善它。自該開源項目發(fā)布以來,超過 200 名非谷歌員工的貢獻者對 Go 語言核心部分提交了超過 1000 個修改建議。在過去的 18 個月里,又有 150 開發(fā)者貢獻了新的核心代碼。這儼然形成了世界上最大的開源團隊,并使該項目躋身 Ohloh 前 2% 的行列。大約在 2011 年 4 月 10 日,谷歌開始抽調員工進入全職開發(fā) Go 語言項目。開源化的語言顯然能夠讓更多的開發(fā)者參與其中并加速它的發(fā)展速度。Andrew Gerrand 在 2010 年加入到開發(fā)團隊中成為共同開發(fā)者與支持者。

在 Go 語言在 2010 年 1 月 8 日被 Tiobe(聞名于它的編程語言流行程度排名)宣布為 “2009 年年度語言” 后,引起各界很大的反響。目前 Go 語言在這項排名中的最高記錄是在 2017 年 1 月創(chuàng)下的第13名,流行程度 2.325%。

  • 時間軸:
  • 2007 年 9 月 21 日:雛形設計
  • 2009 年 11 月 10日:首次公開發(fā)布
  • 2010 年 1 月 8 日:當選 2009 年年度語言
  • 2010 年 5 月:谷歌投入使用
  • 2011 年 5 月 5 日:Google App Engine 支持 Go 語言

從 2010 年 5 月起,谷歌開始將 Go 語言投入到后端基礎設施的實際開發(fā)中,例如開發(fā)用于管理后端復雜環(huán)境的項目。有句話叫 “吃你自己的狗食”,這也體現(xiàn)了谷歌確實想要投資這門語言,并認為它是有生產(chǎn)價值的。

Go 語言的官方網(wǎng)站是 golang.org,這個站點采用 Python 作為前端,并且使用 Go 語言自帶的工具 godoc 運行在 Google App Engine 上來作為 Web 服務器提供文本內容。在官網(wǎng)的首頁有一個功能叫做 Go Playground,是一個 Go 代碼的簡單編輯器的沙盒,它可以在沒有安裝 Go 語言的情況下在你的瀏覽器中編譯并運行 Go,它提供了一些示例,其中包括國際慣例 “Hello, World!”。

語言的主要特性與發(fā)展的環(huán)境和影響因素

  • 影響 Go 語言發(fā)展的早期編程語言
  • 正如 “21 世紀的 C 語言” 這句話所說,Go 語言并不是憑空而造的,而是和 C++、Java 和 C# 一樣屬于 C 系。不僅如此,設計者們還汲取了其它編程語言的精粹部分融入到 Go 語言當中。
  • 在聲明和包的設計方面,Go 語言受到 Pascal、Modula 和 Oberon 系語言的影響;在并發(fā)原理的設計上,Go 語言從同樣受到 Tony Hoare 的 CSP(通信序列進程 Communicating Squential Processes)理論影響的 Limbo 和 Newsqueak 的實踐中借鑒了一些經(jīng)驗,并使用了和 Erlang 類似的機制。
  • 這是一門完全開源的編程語言,因為它使用 BSD 授權許可,所以任何人都可以進行商業(yè)軟件的開發(fā)而不需要支付任何費用。
  • 盡管為了能夠讓目前主流的開發(fā)者們能夠對 Go 語言中的類 C 語言的語法感到非常親切而易于轉型,但是它在極大程度上簡化了這些語法,使得它們比 C/C++ 的語法更加簡潔和干凈。同時,Go 語言也擁有一些動態(tài)語言的特性,這使得使用 Python 和 Ruby 的開發(fā)者們在使用 Go 語言的時候感覺非常容易上手。
  • 為什么要創(chuàng)造一門編程語言
  • C/C++ 的發(fā)展速度無法跟上計算機發(fā)展的腳步,十多年來也沒有出現(xiàn)一門與時代相符的主流系統(tǒng)編程語言,因此人們需要一門新的系統(tǒng)編程語言來彌補這個空缺,尤其是在計算機信息時代。
  • 相比計算機性能的提升,軟件開發(fā)領域不被認為發(fā)展得足夠快或者比硬件發(fā)展得更加成功(有許多項目均以失敗告終),同時應用程序的體積始終在不斷地擴大,這就迫切地需要一門具備更高層次概念的低級語言來突破現(xiàn)狀。
  • 在 Go 語言出現(xiàn)之前,開發(fā)者們總是面臨非常艱難的抉擇,究竟是使用執(zhí)行速度快但是編譯速度并不理想的語言(如:C++),還是使用編譯速度較快但執(zhí)行效率不佳的語言(如:.NET、Java),或者說開發(fā)難度較低但執(zhí)行速度一般的動態(tài)語言呢?顯然,Go 語言在這 3 個條件之間做到了最佳的平衡:快速編譯,高效執(zhí)行,易于開發(fā)。
  • Go 語言的發(fā)展目標
  • Go 語言的主要目標是將靜態(tài)語言的安全性和高效性與動態(tài)語言的易開發(fā)性進行有機結合,達到完美平衡,從而使編程變得更加有樂趣,而不是在艱難抉擇中痛苦前行。
  • 因此,Go 語言是一門類型安全和內存安全的編程語言。雖然 Go 語言中仍有指針的存在,但并不允許進行指針運算。
  • Go 語言的另一個目標是對于網(wǎng)絡通信、并發(fā)和并行編程的極佳支持,從而更好地利用大量的分布式和多核的計算機,這一點對于谷歌內部的使用來說就非常重要了。設計者通過 goroutine 這種輕量級線程的概念來實現(xiàn)這個目標,然后通過 channel 來實現(xiàn)各個 goroutine 之間的通信。他們實現(xiàn)了分段棧增長和 goroutine 在線程基礎上多路復用技術的自動化。
  • 這個特性顯然是 Go 語言最強有力的部分,不僅支持了日益重要的多核與多處理器計算機,也彌補了現(xiàn)存編程語言在這方面所存在的不足。
  • Go 語言中另一個非常重要的特性就是它的構建速度(編譯和鏈接到機器代碼的速度),一般情況下構建一個程序的時間只需要數(shù)百毫秒到幾秒。作為大量使用 C++ 來構建基礎設施的谷歌來說,無疑從根本上擺脫了 C++ 在構建速度上非常不理想的噩夢。這不僅極大地提升了開發(fā)者的生產(chǎn)力,同時也使得軟件開發(fā)過程中的代碼測試環(huán)節(jié)更加緊湊,而不必浪費大量的時間在等待程序的構建上。
  • 依賴管理是現(xiàn)今軟件開發(fā)的一個重要組成部分,但是 C 語言中“頭文件”的概念卻導致越來越多因為依賴關系而使得構建一個大型的項目需要長達幾個小時的時間。人們越來越需要一門具有嚴格的、簡潔的依賴關系分析系統(tǒng)從而能夠快速編譯的編程語言。這正是 Go 語言采用包模型的根本原因,這個模型通過嚴格的依賴關系檢查機制來加快程序構建的速度,提供了非常好的可量測性。
  • 整個 Go 語言標準庫的編譯時間一般都在 20 秒以內,其它的常規(guī)項目也只需要半秒鐘的時間來完成編譯工作。這種閃電般的編譯速度甚至比編譯 C 語言或者 Fortran 更加快,使得編譯這一環(huán)節(jié)不再成為在軟件開發(fā)中困擾開發(fā)人員的問題。在這之前,動態(tài)語言將快速編譯作為自身的一大亮點,像 C++ 那樣的靜態(tài)語言一般都有非常漫長的編譯和鏈接工作。而同樣作為靜態(tài)語言的 Go 語言,通過自身優(yōu)良的構建機制,成功地去除了這個弊端,使得程序的構建過程變得微不足道,擁有了像腳本語言和動態(tài)語言那樣的高效開發(fā)的能力。
  • 另外,Go 語言在執(zhí)行速度方面也可以與 C/C++ 相提并論。
  • 由于內存問題(通常稱為內存泄漏)長期以來一直伴隨著 C++ 的開發(fā)者們,Go 語言的設計者們認為內存管理不應該是開發(fā)人員所需要考慮的問題。因此盡管 Go 語言像其它靜態(tài)語言一樣執(zhí)行本地代碼,但它依舊運行在某種意義上的虛擬機,以此來實現(xiàn)高效快速的垃圾回收(使用了一個簡單的標記-清除算法)。
  • 盡管垃圾回收并不容易實現(xiàn),但考慮這將是未來并發(fā)應用程序發(fā)展的一個重要組成部分,Go 語言的設計者們還是完成了這項艱難的任務。
  • Go 語言還能夠在運行時進行反射相關的操作。
  • 使用 go install 能夠很輕松地對第三方包進行部署。
  • 此外,Go 語言還支持調用由 C 語言編寫的海量庫文件,從而能夠將過去開發(fā)的軟件進行快速遷移。
  • 指導設計原則
  • Go語言通過減少關鍵字的數(shù)量(25 個)來簡化編碼過程中的混亂和復雜度。干凈、整齊和簡潔的語法也能夠提高程序的編譯速度,因為這些關鍵字在編譯過程中少到甚至不需要符號表來協(xié)助解析。
  • 這些方面的工作都是為了減少編碼的工作量,甚至可以與 Java 的簡化程度相比較。
  • Go 語言有一種極簡抽象藝術家的感覺,因為它只提供了一到兩種方法來解決某個問題,這使得開發(fā)者們的代碼都非常容易閱讀和理解。眾所周知,代碼的可讀性是軟件工程里最重要的一部分。代碼是寫給人看的,不是寫給機器看的。
  • 這些設計理念沒有建立其它概念之上,所以并不會因為牽扯到一些概念而將某個概念復雜化,他們之間是相互獨立的。
  • Go 語言有一套完整的編碼規(guī)范,不像 Ruby 那樣通過實現(xiàn)過程來定義編碼規(guī)范。作為一門具有明確編碼規(guī)范的語言,它要求可以采用不同的編譯器如 gc 和 gccgo進行編譯工作,這對語言本身擁有更好的編碼規(guī)范起到很大幫助。LALR是 Go 語言的語法標準,這種語法標準在編譯時不需要符號表來協(xié)助解析。
  • 語言的特性
  • Go 語言從本質上(程序和結構方面)來實現(xiàn)并發(fā)編程。因為 Go 語言沒有類和繼承的概念,所以它和 Java 或 C++ 看起來并不相同。但是它通過接口(interface)的概念來實現(xiàn)多態(tài)性。Go 語言有一個清晰易懂的輕量級類型系統(tǒng),在類型之間也沒有層級之說。因此可以說這是一門混合型的語言。
  • 在傳統(tǒng)的面向對象語言中,使用面向對象編程技術顯得非常臃腫,它們總是通過復雜的模式來構建龐大的類型層級,這違背了編程語言應該提升生產(chǎn)力的宗旨。
  • 函數(shù)是 Go 語言中的基本構件,它們的使用方法非常靈活。在第六章,我們會看到 Go 語言在函數(shù)式編程方面的基本概念。
  • Go 語言使用靜態(tài)類型,所以它是類型安全的一門語言,加上通過構建到本地代碼,程序的執(zhí)行速度也非常快。
  • 作為強類型語言,隱式的類型轉換是不被允許的,記住一條原則:讓所有的東西都是顯式的。
  • Go 語言其實也有一些動態(tài)語言的特性(通過關鍵字 var),所以它對那些逃離 Java 和 .Net 世界而使用 Python、Ruby、PHP 和 JavaScript 的開發(fā)者們也具有很大的吸引力。
  • Go 語言支持交叉編譯,比如說你可以在運行 Linux 系統(tǒng)的計算機上開發(fā)運行 Windows 下運行的應用程序。這是第一門完全支持 UTF-8 的編程語言,這不僅體現(xiàn)在它可以處理使用 UTF-8 編碼的字符串,就連它的源碼文件格式都是使用的 UTF-8 編碼。Go 語言做到了真正的國際化!
  • 語言的用途
  • Go 語言被設計成一門應用于搭載 Web 服務器,存儲集群或類似用途的巨型中央服務器的系統(tǒng)編程語言。對于高性能分布式系統(tǒng)領域而言,Go 語言無疑比大多數(shù)其它語言有著更高的開發(fā)效率。它提供了海量并行的支持,這對于游戲服務端的開發(fā)而言是再好不過了。
  • Go 語言一個非常好的目標就是實現(xiàn)所謂的復雜事件處理(CEP),這項技術要求海量并行支持,高度的抽象化和高性能。當我們進入到物聯(lián)網(wǎng)時代,CEP 必然會成為人們關注的焦點。
  • 但是 Go 語言同時也是一門可以用于實現(xiàn)一般目標的語言,例如對于文本的處理,前端展現(xiàn),甚至像使用腳本一樣使用它。
  • 值得注意的是,因為垃圾回收和自動內存分配的原因,Go 語言不適合用來開發(fā)對實時性要求很高的軟件。
  • 越來越多的谷歌內部的大型分布式應用程序都開始使用 Go 語言來開發(fā),例如谷歌地球的一部分代碼就是由 Go 語言完成的。
  • 如果你想知道一些其它組織使用Go語言開發(fā)的實際應用項目,你可以到 使用 Go 的組織頁面進行查看。出于隱私保護的考慮,許多公司的項目都沒有展示在這個頁面。我們將會在第 21 章討論到一個使用 Go 語言開發(fā)的大型存儲區(qū)域網(wǎng)絡(SAN)案例。
  • 在 Chrome 瀏覽器中內置了一款 Go 語言的編譯器用于本地客戶端(NaCl),這很可能會被用于在 Chrome OS 中執(zhí)行 Go 語言開發(fā)的應用程序。
  • Go 語言可以在 Intel 或 ARM 處理器上運行,因此它也可以在安卓系統(tǒng)下運行,例如 Nexus 系列的產(chǎn)品。
  • 關于特性缺失

許多能夠在大多數(shù)面向對象語言中使用的特性 Go 語言都沒有支持,但其中的一部分可能會在未來被支持。

  • 為了簡化設計,不支持函數(shù)重載和操作符重載
  • 為了避免在 C/C++ 開發(fā)中的一些 Bug 和混亂,不支持隱式轉換
  • Go 語言通過另一種途徑實現(xiàn)面向對象設計(第 10-11 章)來放棄類和類型的繼承
  • 盡管在接口的使用方面(第 11 章)可以實現(xiàn)類似變體類型的功能,但本身不支持變體類型
  • 不支持動態(tài)加載代碼
  • 不支持動態(tài)鏈接庫
  • 不支持泛型
  • 通過 recover 和 panic 來替代異常機制
  • 不支持靜態(tài)變量
  • 使用 Go 語言編程
  • 如果你有其它語言的編程經(jīng)歷(面向對象編程語言,如:Java、C#、Object-C、Python、Ruby),在你進入到 Go 語言的世界之后,你將會像迷戀你的 X 語言一樣無法自拔。Go 語言使用了與其它語言不同的設計模式,所以當你嘗試將你的X語言的代碼遷移到 Go 語言時,你將會非常失望,所以你需要從頭開始,用 Go 的理念來思考。
  • 如果你在至高點使用 Go 的理念來重新審視和分析一個問題,你通常會找到一個適用于 Go 語言的優(yōu)雅的解決方案。
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容