走進 Google 的 Go 語言

jopen 12年前發布 | 21K 次閱讀 Go 語言

摘要:本文整理自Google首席工程師Rob Pike的演講Slide,主要講述的了Go的部分設計原理和初衷,也有提到Go語言在Google內外的應用現狀。但本文的目的更多的是關于軟件工程而不是編程語言的設計,更準確地說是如何設計編程語言來幫助軟件工程。

走進 Google 的 Go 語言

序言:關于Go


Go 語言是一個開源、并發、高效、簡單、有趣(但對某些人來說可能很無聊)的編程語言,支 持垃圾回收(GC),具有很好的可伸縮性。Go是從2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持開發,后來還加入了Ian Lance Taylor, Russ Cox等人,并最終于2009年11月開源,在2012年早些時候發布了Go 1穩定版本。現在Go的開發已經是完全開放的,并且擁有一個活躍的社區。

Go 最初是為了解決Google的問題而開發的,要知道Google面臨著很多大問題。Google的中服務器最主要是C++編寫的,除此之外還 有 很多Java、Python代碼。另外,Google還有數千名工程師、無數行代碼、龐大的分布式構建系統以及數不清的機器(我們認為相對于一個中等規模 的集群)。Google的開發可能很慢,甚至笨拙,但它總是很有效。

所以毫無疑問Go對“大硬件”的支持非常好,也適合“大軟件”的開發。CSDN之前也編譯了一批Rob Pike的文章——Go語言之父談Go:大道至簡,在這里Rob描述了Go的創作起源和初衷。

走進 Google 的 Go 語言

為什么應該用Go?


Go是為了幫助人們閱讀、調試和維護大型軟件系統而生的,所以目標是

  • 不再緩慢
  • 不再笨拙
  • 提高效率
  • 保持(甚至提升)擴展性

但是在使用C++或者Java開發中卻常常遇到各種問題:

  1. 構建緩慢
  2. 依賴性難以控制
  3. 每個編程語言都使用不同的語言子集
  4. 程序難以理解(文檔等原因)
  5. 重復工作
  6. 更新成本高
  7. 版本交叉
  8. 自動化不方便(工具問題)
  9. 跨語言構建

而Go語言則是為了解決這些問題而設計的。

另外,C語言的依賴一直是個大問題,包括依賴疊加、編譯時引入依賴的情況都很難處理,同時你也沒辦法查清哪些依賴是可以刪除的,那些不可以。在C++中,這一點變得更加明顯:

  • 每個類里都有#include文件
  • #include文件中有代碼(而不僅僅是聲明)
  • #ifndef的殘留

所以一直無法在一臺機器上構建大型Google二進制。(To build a large Google binary on a single computer is impractical.)

當然,工具確實很有幫助,于是做了如下改進:

  • 新的分布式構建系統
  • 不再需要Makefile(但仍然使用BUILD文件)
  • 多緩存
  • 多復雜度(大程序本身所具有的)

即使在Google的分布式構建系統的的幫助下,大型構建工程依然會花費不少時間(以其中一個二進制文件為例,在2007年花了45分鐘,現在是27分鐘)。生活質量還是太低。

走進Go語言


我們都希望擁有更高質量的生活,所以必須解決這些問題,所以就有了最初的想法:

  • 必須是可擴展的
  • 適合大型程序、大型團隊以及擁有大量依賴的應用
  • 必須易于接近,例如接近C語言那樣。
  • 現代化
  • 適合多核機器
  • 適合網絡機器
  • 適合Web開發

Go語言的設計是以軟件工程為目標,所以它有這些優點:

  • 清晰的依賴
  • 清晰的語法
  • 清晰的語義學
  • 簡單的模型(垃圾回收和并發性)
  • 便捷的工具(go tool、gofmt、godoc、gofix等)

還有那些問題?


Go 語言目前所面臨的最大問題在于,還沒有足夠的經驗來證明Go是否真的是一個成功的產 品,缺少大型應用實踐。但是在Google內部,如golang.org、油Tube.com、dl.google.com都已經開始使用Go語言開 發,除此之外還有一些其它小應用(有的是在GAE上)也選擇使用Go;而在Google之外,BBC Worldwide、Canonical、Heroku、Nokia、SoundCloud也都在嘗試Go。

總而言之,Go是由軟件工程驅動的編程語言,但富有成效并且有趣,這樣的設計非常高產。

Rob Pike演講的Slide可以在這里看到。

來自: CSDN
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!