網易有道CEO周楓推薦Go語言。他認為Go很好地繼承了C語言靈活、簡單有效的思想;Go有很高的生產效率;Go精選了一些復雜事情的優秀解決辦法,通過語言功能和標準庫提供出來。
Go語言作為一個新的編程語言(8年歷史,對比C的40年,Java的20年很年輕了),很多人都挺喜歡,也寫了不少推薦,互聯網公司中在生產系統中使用Go的(主要是在云端服務中)也在逐漸增多。剛好這幾天和同事討論到這個話題,這里提供一個我的版本的推薦:
1.Go很好地繼承了C語言靈活、簡單有效的思想。我一直認為系統工程師應該讀Linux內核代碼,同一套代碼,可以跑在小到耳機,大到100核的服務器的所有設備上,而且改改配置就可以一鍵build出可跑的內核出來。這樣靈活的系統,代碼可讀性還相當不錯,歸功于C語言簡單有效的設計,讓C頗有點“增一分則太肥,減一分則太瘦”的意思。傳統的C++則是反面例子,新增語言功能的“投資回報”較差(C++11倒是解決了不少問題)。而Go繼承了C的這些風格,雖然細節不同,比如沒有指針算術,在底層系統操作方面靈活性有所下降,但在很多方面變得更強大(并發性、自動內存管理等等)。Go的關鍵詞數量甚至少于C(25 vs. 30左右),簡單性保持得很好。
2. Go有很高的生產效率。舉兩個例子,Go不需要build文件(Makefile, Java的build.xml, pom.xml這些),而是只需要執行"go build"即可,通過目錄結構自己找到項目結構。通過這樣的“約定優于配置”(convention over configuration)的設計,大大提高了效率。第二個例子是調用C代碼的cgo的設計,使用過Java的JNI(包括Android的NDK)的朋友應該知道,那來回生成.h文件,自己編譯DLL/.so的感覺是很酸爽的。而在Go這里簡單到可以把C代碼直接嵌到Go代碼同一個文件里,然后"go build"就可以。效率就是節省的生命和金錢啊。
3. Go精選了一些復雜事情的優秀解決辦法,通過語言功能和標準庫提供出來。比如并發性功能,goroutine和channels的確就是比線程和流更好的抽象。而JSON/XML/HTTP/正則表達式這些,都有標準庫的良好支持。這里Go有別于Swift,在語言特性的引入上很克制,很“精選”。對比Go,Swift感覺有點像個“學究”型的語言,引入了大批的語言特性,每個都很正確,但合起來就變得感覺繁瑣。
下面翻譯一篇“Golang的微妙的生產力”(The Subtle Productivity of Golang),作者Paul Hoehne,把這個話題再說說。
我承認我對新的編程語言很著迷(或者甚至嘗試使用對我是新的老編程語言)。但我只會對促進生產力的語言感興趣。一年前,我試了試Go,發現了一種我多年沒有感覺到的舒適感和生產力。當然,你也可以用其他語言做很多相同的事情。但是,像許多年前的C語言一樣,Go是一種在我的頭腦中我可以完全掌握的語言。可以把它看作是在灰色物質緩存中運行,而不需要因為緩存缺失而訪問stackoverflow.com。
隨著語言的發展,增加了類似于并發(C++14)或泛型(Java和C#幾年前)的特性,它們變得更大、更復雜。C有大約30個關鍵字,C#有64個,Java有53個左右,C++14個大約有80個。而Go大約有25個。關鍵詞并不是衡量語言復雜性的唯一標準。在C語言中編寫應用程序常常比在Java中更乏味。但關鍵字確實給人一種概念空間,開發人員在使用特定語言時需要處理這些概念。
我在研究生院花了很多時間用vi寫C語言,沒有自動完成功能,也很少打開手冊。我用man pages來進行系統和庫調用,但是我有足夠多的內存在我的耳朵之間,以記憶住基本的調用(open, creat, trunc, read, write等等)。有一種形式的生產力來自于“能緩存住所有東西”。
我無法想象,如果沒有支持自動完成、或立即語法檢查等功能的IDE的情況下,Java編程的生產效率。當然,Java可以做很多事情,但是它是有非常大的庫的非常大的語言。聲明main函數需要三個關鍵字(public static void),更不用說類聲明的開銷了。即使是我們認為理所當然的特性,HTTP服務,也利用了幾層庫。Java沒有HTTP服務提供者或服務使用者這樣的“內含電池”的服務,這意味著您可能需要考慮使用Netty或嵌入式Tomcat。
我可以在沒有獨特功能的文本編輯器中寫Go。它是現代的語言,具有并發性、良好的unicode支持、以及包含HTTP服務等現代特性。它感覺和C一樣舒服,但是和Java一樣高效。對于一些人來說,“舒適”的語言是一種奇怪的概念,但是語言是一種工具,一種舒適的、易于使用的工具通常是一種更好的工具。
我也覺得,長期而言,Go將成為容器化數據中心的語言。它靜態地編譯成二進制文件,因此運行時需求非常低。Java、Python、C#等要求容器具有相應的運行時安裝的正確版本。而編寫Go應用程序很容易,它只使用普通的Linux容器,而不需要額外的依賴。它從同一個代碼庫編譯到Windows, Linux, Mac OS, ARM目標。它允許我將一個應用程序作為單一的可執行的二進制文件交付。
為什么不是每個人都用它呢?首先,它是新的。我知道許多企業仍然在運行PowerBuilder應用程序和基于JDK 6的服務。哎呀,我今天早上在app上買的咖啡可能會在某個時候運行40年前的COBOL代碼。Go 1.0只有5歲。Java大約有20年的歷史,C#稍微年輕一些,但是Java和C#當年滿足了真正的需要,降低了編寫應用程序的成本。在20世紀90年代后期,人們想當然地認為你會用C++編寫應用,而用Visual Basic作為其前端。大量調試的時間花在奇怪的COM錯誤或內存損壞上。用Go代替Java的理由不像停止用C++來懲罰自己那樣強大。但是,當當我們遷移到一個基于容器的世界,而Java變得越來越臃腫,那我認為Go會獲得優勢。
隨著越來越多的開發人員使用Go,他們會發現,能夠將整個語言(以及一些關鍵的庫)保持在您的頭腦中會導致一種微妙的生產力形式。而這一特點,正是其他越來越龐大、越來越復雜的語言所缺乏的。
-
C語言
+關注
關注
180文章
7598瀏覽量
136170 -
go語言
+關注
關注
1文章
158瀏覽量
9028
原文標題:網易有道CEO周楓:Go語言繼承了C語言的靈活簡單
文章出處:【微信號:AI_era,微信公眾號:新智元】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論