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