go編譯器有哪些 go語言編譯器是什么語言開發的



文章插圖
go編譯器有哪些 go語言編譯器是什么語言開發的

文章插圖
2007 年 9 月 21 日,Robert Griesemer,Rob Pike 和 Ken Thompson 在一塊白板上勾勒了一個新語言,并在幾天內定下了計劃和目標,作為一個自由時間的項目進行;2008 年年中,這個項目得到 Google 的全力支持,成為了一個全職項目;2009 年 11 月,Go 語言正式開源 [1],并于三年后發布 1.0 版本 。發布 12 年至今,已有上百萬開發者成為“gopher”,已經遠超設計者最初的預期 。
# 源起 #
Go 語言的開發團隊可以說是高人云集:Ken Thompson 創造了 B 語言(C 語言前身),是 Unix 和 Plan9 操作系統的創立者之一,和 Dennis Ritchie 一起獲得了 1983 年的圖靈獎;Rob Pike 是 Unix 小組成員,也是 Limbo 語言和 UTF-8 編碼的主要設計者;Robert Griesemer 曾參與制作 Google 的 JavaScript 引擎 V8、Java 的 HotSpot 虛擬機和領域特定語言 Sawzall [2](Sawzall 最早被 Google 用于處理大批量日志,后來基本被 Go 取代[3]) 。
Go 語言的三位創始人在 Google I/O 2012 – Meet the Go Team
隨著 Go 的發展,出現了一些聲音稱 Go 語言沒什么技術優勢,而 Rob Pike 對此的態度是“你們是對的”,Go 語言本身 “并不有趣”,其設計初衷不是為了推動編程語言設計的進步,是為改善軟件工程的工作環境而生 [4] 。
當時 Google 面臨著軟件大規模增長的問題,開發方式變得緩慢而笨拙 。規?;诟鞣N維度上均存在,比如多核并行、生產需求和依賴關系等,導致硬件和軟件都非常大,很多軟件的代碼多達百萬行(大部分使用 C++、Java 或 Python) 。Go 語言的誕生解決了大規模的軟件開發中一些核心痛點,比如開發緩慢、不受控制的依賴關系、代碼理解困難和重復造輪子等 。[5]
官網描述 Go 語言可用于構建“簡單、可靠、高效的大規模軟件”,JetBrains 2021 年的最新調研報告顯示,程序員們在工作中使用 Go 語言的比例達到了 61%(Rust 語言用于工作的比例僅 16%) [6] 。
使用 Go 的場景
可見 Go 確實不是一門“有趣”的編程語言,而更看重工程實踐中的實用性,Go 語言設計中的方方面面都在體現這一點 。
# 演進 #
版本更新歷史 [7][8]:
2012 年 3 月,語言第一個正式版本 Go 1.0 發布,同時還有一份兼容性說明文檔說明未來版本會確保向后兼容性 。2013 年 5 月,Go 1.1 發布,這個版本的編譯器、垃圾回收機制、goroutine 調度器性能均有增強 。2014 年 12 月,Go 1.4 發布,堆棧大小減少了 10~30%;Android 官方支持包隨版本一起發布;同時 Go 項目從 Google Code 遷移到了 Github 。2015 年 8 月,Go 編譯器實現自舉,完全移除了 C 語言;重新設計了垃圾回收器,支持并發,垃圾回收延遲顯著降低,此后版本對垃圾回收器有更進一步的優化 。2018 年 8 月,Go 1.11 版本引入了 Go 模塊功能,以響應在當年語言調研中反饋的模塊管理問題;增加了實驗性的 WebAssembly 支持 。2019 年 9 月,Go 1.13 版本中,改進了 sync 包 Pool 組件的資源被垃圾回收器清除的機制;重寫了逃逸分析邏輯 。2020 年 8 月,Go 鏈接器得到了實質性的提高,減少了30% 的內存資源占用,提高了代碼的可維護性 。2021 年 2 月,Go 1.16 支持了 macOS ARM64;同時默認使用 Go 模塊功能(同樣來自調研報告反饋的情況) 。2021 年 8 月,Go 1.17 發布,增加了對 Windows ARM64 的支持;語言有三個小的增強(unsage 包的兩個新函數和語言類轉換規則的擴展) 。
Go 語言并沒有特別激進的新特性,而是從早期的編程語言中繼承了很多內容,并做了有效的組合 [9] 。
影響 Go 語言設計的早期編程語言
Go 語言里一些廣受開發者喜愛的特性 [10]:
并發性:這是 Go 語言最大的特色,從語言層面支持并發,goroutine 和 channel 可以非常容易的實現安全高并發 。高性能 Http Server:通過簡單的代碼調用就可以快速實現基于協程的 Web 服務[11],處理效率遠高于 PHP 。易部署:直接編譯成機器碼,除了 glibc 沒有其他外部依賴 。易學習:語言設計精簡,25 個關鍵詞表達能力強大;因為有 C 語言的基因,所以有 C 語言基礎的開發者學習 Go 語言會非常輕松 。工具鏈 & 庫:完善的工具鏈(代碼分析、依賴管理等)和出色的標準庫大大優化了開發者學習和應用的體驗 。
Go 發布至今還未正式支持泛型,甚至曾有很多人認為 Go 語言或許永遠不會加泛型,但其實關于泛型的推進工作一直在進行,從 2020 年的調研報告來看,泛型是使用 Go 語言的開發者最需要的特性 [12] 。
2020 年 Go 開發者調研報告:最需要但還缺少的特性
2021 年初 Ian Lance Taylor 正式發布了添加泛型的提案,不出意外會在下一個版本 Go 1.18 中實現 。
# 社區 ## 語言項目社區
Go 語言項目在 2009 年開源,項目的 Star 數已達到 9 萬 。根據 GitHub 提供的數據 [13],截止 2021 年 10 月 20 日共有 166 人提交了超過 5 萬次代碼,其中 Go 語言項目成員占比 28.9%,貢獻占比 64.9%,Google 員工(非語言項目成員)占比 24.7%,貢獻占比 17.83%,貢獻趨勢如下圖:
Go 語言項目代碼提交情況
從代碼提交情況來看,大部分貢獻來自 Google 內部,近三年來每年的提交人數穩定在 70~80 人 。
參與社區提交 Issue 的用戶數量也在持續增長,不過目前開啟中的 Issue 仍有超過 7000 個,有近一半為“待調查分類”,可能為無效的 Issue 。
Go 語言項目 Issue 創建情況
除了語言本身項目,語言的社區其實是更加廣義的,使用 Go 語言的開發者有一個可愛的昵稱 “Gopher” 。
# “Gophers” 社區
在 GolangUK 2015 會議上,Damian Gryski 提到了 “Gophers” 的文化,這是開發者被 Go 吸引進而成為 “Gopher” 的原因 [14] ?!癎ophers” 的社區文化:
– Code– gofmt- if err != nil { … }- go vet- go build -race- golint (CodeReviewComments)- godoc.org/github.com/user/package- go get- limited use of interface{}- Social- Simple is better than complex- Performance matters- Costs are visible
SlashData 在 2021 年初發布的開發者調研顯示 Go 開發者人數已超過 200 萬,社區人數排行第十 [15] 。
編程語言社區人數
在官方調研報告中,約半數開發者清楚了解如何給社區貢獻,而感到自己的貢獻是受歡迎的開發者比例約為 60%,這兩個比例都在逐年提升 [12] 。接受調研的開發者其實已經是相對活躍的,主觀感受會導致調研結果有誤差,但整體來看,仍有越來越多開發者愿意參與到社區貢獻中 。
Go 開發者調研報告 2020:社區滿意度
活躍于社區的開發者通過郵件、媒體論壇、固定會議等交流 [16],有約 30% 開發者會頻繁參與到開源項目中[12],但更多開發者并不會發出聲音,他們在實踐中使用 Go,也切實的從社區資源中獲益 。
郵件列表:golang-nuts、golang-dev、golang-announce用戶群和會議:GoBridge、GoDiscourse、GopherCon媒體論壇:The Go Forum、Gophers Slack Channel、Golang News、Twitter、Stack Overflow、Reddit 等# 應用 #
GitHub 上 Go 為主要語言的開源項目已超過 10 萬個,約 24 萬開發者在這些開源項目中提交 PR [17] 。
GitHub 上每月新創建的 Go 語言項目數
官方調研報告顯示,Go 應用最多的領域是 Web 開發,此外也被廣泛應用于數據庫、DevOps、網絡編程和系統編程;在科學計算、手機等方面的應用較少 [12] 。
【go編譯器有哪些 go語言編譯器是什么語言開發的】Go 開發者調研報告 2020:應用領域
這一點從開源項目中也可以了解到,2021 年截止 9 月最活躍的倉庫(根據 PR 數量排序)基本上都與數據庫、微服務平臺和容器編排相關 [17] 。Go 已成為云基礎架構的語言,這絕不是偶然,最初 Go 的設計目的就是讓 Google 工程師能更高效的編寫“云端”軟件 。
2021 年 GitHub 活躍倉庫(根據 PR 數量排序)Top 10
2013 年 Matt Stine 首次提出云原生(CloudNative)概念,2015 年云原生計算基金會(CNCF,Cloud Native Computing Foundation)成立,致力于發展推廣云原生技術 。CNCF 給云原生的定義中提到了目前的代表技術包括容器、服務網格、微服務、不可變基礎架構和聲明式 API 等 [18] 。
圖片可上下滑動
云原生基礎設施的很多代表性項目均為 Go 語言實現,這些技術的普及又帶動了 Go 語言的推廣,可以說 Go 語言和“云”是相互成就的 。
容器應用:Docker、Kubernetes數據庫應用:etcd、TiDB微服務框架:Go Kit、Go Micro、GizmoWeb 框架:Gin、Echo、Beego
國內如 PingCAP、騰訊、百度和京東等大公司均有 Go 語言的應用,2020 年 JetBrains 的開發者生態系統調研中,中國有 16% 的開發者在使用 Go 語言 [19] 。
Go 語言開發者地域分布
# 總結 #
回顧 Go 語言的發展情況,我們可以清楚地看到:
1. 針對開發痛點的語言特性:Go 從語言層面支持并行,部署簡單,很好的解決了軟件開發各維度規?;谐霈F的痛點 。
2. 低學習曲線:可以快速上手并投入實際開發工作 。
3. 開發者體驗不斷改善:開源社區運營,有完整的工具鏈、標準庫和一些不錯的開發框架 。
4. “殺手級”應用:Docker、Kubernetes 出現,云計算技術不斷完善普及,云原生概念興起 。
5. 巨頭公司支持:大量國內外公司在使用 Go 語言開發,也會作為 Go 語言發展的支持后盾 。
技術發展過程中,會順應需求出現不同的開發工具或者說材料,Go 語言所有的特點都是為了實現更加高效的大規模開發而生,至少在云原生領域,Go 語言的地位已很難動搖 。