為什么我用 Go 來編程

jopen 12年前發布 | 36K 次閱讀 Go語言 Google Go/Golang開發

Go 語言作為一種新穎的編程語言, 它最初是由谷歌為了服務器開發而發明出來的。 而它的發明者們,更是數位成就卓絕、技藝非常的計算機科學泰斗:像是 Ken Thompson 和 Rob Pike 這對老朋友。 我最近剛發表的一個重要的產品就使用了Go開發,從開發者產出效率和產品表現來說,Go語言很好地證明自己在這些方面的優越特性。也正因為如此,我所知的其它許多開發團隊也在準備Go to "Go" (噢,這語言的名字是有多靈動啊!)。

仔細想想看,你要多久才能遇到一項編程創新同時兼顧了開發效率以及 計算性能?

在討論GO語言之前,我想談談為什么我會喜歡上Ta. 我是在2001年開始開發小型網頁應用,并開始接觸各種各樣的語言。 那時我是C++的絕對忠實粉絲。 到了在2004年,我開始接觸PHP(非面向對象)。但沒多久,我就討厭PHP了。尤其是在沒有運行程序前,我根本不能捕捉任何的錯誤。就在那時,我認識到以下兩個編程概念非常重要:

1. “面向對象”只是一種編程方式,而并非唯一的方式。 而且有時候,它未必是最好的選擇。

2. 標量(整形,字符,字符串,浮點型,布爾類型),序列(列表、數組)和映射(名值對)這些語言內置類型,其實已經基本滿足大部分的數據結構需求。

PHP 用于小型應用的創作場景是絕對沒得說。但是它難于測試,難于調試(太多的隱式類型轉換)還有就是太慢。當我想暫時脫離PHP的時候,我在2007年和 Java偶遇了。 Java也許是我遇到過的最令人郁悶的語言。Java太嚴格,太無意義(換句話說太冗余)還有太“龐大”,包括各種的IDE,框架,編譯環境配置等等。 需要完成繁瑣的配置,我們才能開始開發。同時,我并不接受JVM(Java 虛擬機)的思想。它虛幻的便攜性會帶來沉痛的代價。

2008年,我開始接觸 Python。5年前我曾經用Ta小試牛刀,但現在我是全身心的投入其中。我喜歡Python。 它支持多范型,語言很有語義,有很多亮點的東東,例如列表解析,生成器表達式,裝飾器,關鍵字參數(**kwargs)等等。 它語義清晰,設計 緊密。它的強大力量,在寫代碼-運行-修正-運行的過程中表現的淋漓盡致... 開發周期中經常無需迭代。用Python寫的代碼經常比其他語言寫的,更能按著我的意圖去運作。

可是,Python有個突出的問題,就是它速度不快。我使用過Psyco這樣的優化器,但是效果還不夠理想。然后又嘗試了Unladen Swallow優化器,可也不夠理想。

在我開始用Python的時候,我發現Google對Ta情有獨鐘。 Python之父 -- Guido van Rossum 就是就職于Google. 過了一段時間,我聽到了一個來自Google的新語言誕生了 -- Go.如果Go背后不是借助與名聲赫赫的Rob和Ken,和誕生于世界上最偉大的IT公司,這個項目也許就在實驗階段就被解散了。

2009年Go語言發布的時候,我并未覺察到為什么它如此偉大,除了知道Go包含很多現代語言的結構和運行速度很快。


現在讓我們先暫停一下思路,換一個話題。

在2010年末,當時我剛剛在Zynga工作,重新由Python轉去使用php而使我有點時間。所以我花了一點時間去讀了一些東西。其中在我讀過的書中有一本書,在該書中一些討論中,介紹了這樣的一種概念:“數據流編程”(dataflow programming)和“聲明式并發”(declarative concurrency).你可能需要通過前面的鏈接,去簡單了解一下這個概念,因為這就是Go語言的核心特征。


在我學習數據流編程時,我想起 在yahoo的時候,當要并行地從多個數據源獲取數據時,它是一個多么龐大的協定,有一些解決策略比如:最快源獲勝(fastest-source-wins)、N/M響應 (wait-until-N-of-M responses),它們都有自己的超時處理等等。標準的方案是用一個帶XML文檔的Java守護進程去描述你想要的數據流。這種方法不是太優雅。我希望有一種語言本身就具有這種能力,并且不要像Oz語言那樣學院派。那時我沒有認識到Go語言就是我想要的。

去年年初一段時間,我們討論并嘗試尋找其他比PHP更為具體、性能更出色的編程語言--編譯型語言。 去年年中,當我再一次去了解Go,發現它已經擁有Google大量的支持并且以已經發布了1.0版本的GA版本時,我們在構思一個新的需要處理并發的項目。PHP的無共享架構并不能很好地支持項目所需。我想,現在是個好時機去使用Go語言來突破。

基于Go的實踐

在使用Go開發一些項目原型后,我有了更確切的實踐感受:

  1. 來自編譯器的強大功能: 使用編譯型語言編程是一件愉快的事情。編譯器不僅僅檢查可能導致運行時異常的代碼,而且最大程度上不允許這些代碼的存在。當然,這不是Go語言的特性,但是Go語言編譯器也提供這種功能。
  2. 標準的代碼格式化功能:在團隊開發中,代碼實施統一格式化標準是非常必要的,所以代碼格式化工具是很受歡迎的一項功能,它能降低“不是我的代碼”的心理障礙。
  3. 精簡語言特性:Go是一種非常緊湊的語言,語言特性也非常精簡,在語言層面,它只保留了必要、成熟、確定的語言特性,在這點上它更類似于C語言,所以它易于學習和適合寫程序。
  4. 內置強勁特性: 不管你是寫web服務器程序、原始套接字服務器程序還是其它需要調用OS內置函數的程序Go標準庫有大量相應的包。
  5. 簡潔的并發庫: Go的channel 和 goroutine能很好地處理并發,使用這2個特性,你不用像Node.js、Twisted那樣編寫整個程序的事件處理函數,就可以處理并發了。
  6. 入門簡單:和其它需要配置復雜框架和IDE的語言相比,Go語言的入門時間會少很多。
  7. 快速開發:Go的生產率很高,它內置了大量服務器編程需要使用的組件,因此你能在很短時間內寫好你的服務器端代碼。更少的代碼意味著更快速的排錯。
  8. 適用于多核高性能環境 Go的rumtime在運行時出奇地速和穩定,對于這點,那些用Python寫服務器代碼的程序員將更有感受。不像Python和Node.js這些語言,Go的runtime能產生多個OS線程,且并行地運行它們。

在產品中使用 Go

某些 Go 語言的特性你只有在產品中才能體會,我真正喜歡 Go 語言的幾個方面如下:

  1. 單個二進制文件: Go 生成靜態鏈接的二進制文件,可在任意構建目標平臺上運行。這對基于云的發布環境來說特別的棒,因為你只需要一個簡單的 OS 映像就夠了。相比之下,其他需要精心制作的依賴設置則差很多。
  2. 跨平臺編譯: 早些時候我提到關于 JVM 因為可移植性方面所做的權衡。實際上只是很少的 Java 程序需要移植到不同的系統。因為需要與目標系統的依賴管理耦合,使得 Java 變得有點流氓。而 Go 語言可以在任何機器上開發,只需要到目標平臺上編譯即可。我所需要做的就是復制交叉編譯的二進制文件來實現可移植性。
  3. 內建剖析: 只需少數幾行代碼,你就可以實現一個 HTTP 服務來提供實時的 CPU、內存、go 程序、OS 線程、鎖爭用等信息。你可以可以使用 go 語言的工具鏈來訪問 URL 并在應用內提供剖析的數據。真了不起!
  4. 可共享的代碼: 代碼共享最大的障礙就是項目的大小,或者是是代碼量。即使人們可以訪問一些代碼庫,它并不容易深入理解代碼。因為它使用少數幾行代碼去實現 C/C++ 或者 Java 中同樣的功能,使得代碼更具備可讀性,更易于分享。有限的語言規范也意味著它是不太可能會讓有些人陷入晦澀的構造或“高級功能”。

總結

總之,我發現Go是迄今為止最好用的sever端編程語言,它具有Python語言優雅性和C/C++高性能的優點,退一步來說,即使它只具有Python 90%的易用性和C/C++ 90%的高性能,那也是不錯的,而且它的優點不止這些:1)基于Go語言的程序比其他語言更容易在異構平臺和虛擬環境下進行開發和部署;2)Go語言有利于分享和協作開發,因為它有單一的標準、精簡的語言特性。


注:

翻譯轉自http://www.oschina.net/translate/why-program-in-go

原文轉自http://tech.t9i.in/2013/01/why-program-in-go/

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