網易有道CEO周楓:Go語言繼承了C語言的靈活簡單
新智元推薦
來源:周楓
轉載編輯:常佩琦
【新智元導讀】網易有道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感覺有點像個「學究」型的語言,引入了大批的語言特性,每個都很正確,但合起來就變得感覺繁瑣。
參考「Javascript是兒童編程好的語言選擇」。
-------------------
下面翻譯一篇「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,他們會發現,能夠將整個語言(以及一些關鍵的庫)保持在您的頭腦中會導致一種微妙的生產力形式。而這一特點,正是其他越來越龐大、越來越複雜的語言所缺乏的。
----------
頭圖當然是Go的吉祥物gopher(北美囊地鼠)
本文經授權轉載自公眾號「周楓」。
加入社群
新智元AI技術+產業社群招募中,歡迎對AI技術+產業落地感興趣的同學,加小助手微信號: aiera2015_1 入群;通過審核後我們將邀請進群,加入社群後務必修改群備註(姓名-公司-職位;專業群審核較嚴,敬請諒解)。
此外,新智元AI技術+產業領域社群(智能汽車、機器學習、深度學習、神經網路等)正在面向正在從事相關領域的工程師及研究人員進行招募。
加入新智元技術社群 共享AI+開放平台
TAG:新智元 |