為何 Go 依然遠遠沒有 Python 流行?
為何GO沒有PYTHON流行, 在QUORA看到了去年10月的這個問題:Why is Python still preferred over GO?
補充一句: 我問題說的是「遠遠」……沒有嘲諷就沒有傷害,好好回答問題吧,別水……我們知道Go一直在上升,但是現在Python對於Go還是有絕對優勢的。但是看了一些報告和測試,舉個例子,不見得權威:https://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=golang2=python3我看到的很多這類測試都表現出Go相比於Python的性能優越性。
但是從流行度和排名上看Go依然遠遠落後於Python,甚至達不到接近。順便搜索了一些非權威排名, Interactive: The Top Programming Languages 2016.Python位列第3,評分97.9,Go第十。https://www.tiobe.com/tiobe-index/Python 第4, Go第16。Programming language rankings: Which ones matter? | TechBeacon搜索引擎頻率排名,Python 5, Go18。http://spectrum.ieee.org/static/interactive-the-top-programming-languages-2016
當前 Web 產品的開發產出的不是成品,而是一批接一批的實驗原型+數據。Python 作為業界公認的「原型語言」,和這個目的非常的匹配。
Go 的目的是降低系統開發的門檻和提升效率,許多特性還是受了系統開發制約。系統開發講究可靠行為可預期,所以編譯器檢查必不可少,錯誤需要顯式返回並處理。但產品開發底線其實是能夠還原產品經理設計,工程師的程序能通過編譯器檢查但不一定能通過產品驗收,寫得再嚴謹也沒用。而對於錯誤要求可控或最終用戶無感知,後者已經融合在現代 Web 後端架構的各類分散式系統里了,不需要語言來承擔。有意思的是,達成這一目標的各類基礎系統,Go 的存在感越來越高。
近五年來業界對效率的要求倒逼語言創新,新興語言的學習成本已經大幅下降。一家公司所有團隊用統一語言的必要性已經沒有那麼高了。在不同的場景應用不同的語言,把各環節追求的效果最大化才是王道。別腰了.... 在知乎上我一向不願意回答這種問題,因為學的尚淺,Python不精通,Golang也做不到信手拈來,沒資格回答這個問題(哪怕我有自己的觀點也不想嘮出來誤人子弟),所以只喜歡坐在角落磕著瓜子看別人嘮。
就說2點吧,現在談這個話題,為時尚早; 脫離場景談對比都是耍流氓
Python非常容易入門,發展了這麼久,在各個領域都有Python的身影,現在越來越多學習編程的第一門語言是Python了,這也可能是Python火熱的原因之一吧。
golang語法也很簡單,但現在並沒有很多學習編程的用golang來入門。我身邊學習golang的很多都是有一定的編程功底的,對於編程初學者也不會貿然推薦golang。
golang誕生不足10年,但是現在很多公司已經開始在新項目上使用golang了,上升速度非常快。性能高,同時開發效率也不俗,golang還是很有前景的。
作為一個用了12年Python的程序員,我打算不談Python,反過來講講為何Go流行不起來。
1990年為分水嶺,其後能夠進入TIOBE前10並且站穩腳跟的編程語言,只有Java一種。至於Java為啥能火起來,見仁見智,但不可否認的一點,在現代Java擁有了大量的開發人員和第三方庫,哪個編程語言如果妄想替換掉Java那可真是開玩笑。
進入TIOBE前10而沒能站穩,最終冷掉的編程語言倒是很多。比如Ruby。這類語言的共性是在當時擁有一些領先的特性,但這些特性不足以建立起足夠高的門檻,再直接一點說,就是這些特性是沒法擋住其他語言使用庫來實現的。當一個更流行的語言使用庫實現了類似的功能,那麼這些語言又能靠什麼來維持自己的優勢呢?
再舉個例子,perl早期是語言集成了正則表達式,使得程序員可以方便的用上。依靠這個特性也是火了好多年,但後來正則表達式成為一種庫,各種編程語言都爭相將其集成進去,perl的優勢就逐漸喪失了。至少在現代,我相信不會有人再去推薦新人學perl了。
擁有第三方庫的多少決定了一種編程語言能夠做多少事情。所以當前這些歷史悠久的語言,可以不斷的依靠第三方庫來支持更多的功能和範式。這裡最特別的就是各種C語言的第三方庫,尤其是涉及很多OS層級的API。所以一位致力於設計新編程語言的作者,應該優先考慮的是如何迅速的用上C語言已有的各種庫,而如果這位作者追求純粹,堅決不去支持這些C的第三方庫,就要面臨缺乏啟動用戶的困境,最終早早死掉。
在1990年之前的那些編程語言,對C第三方庫的重視就遠超現代,甚至一些做法在現代來看可以說是絞盡腦汁去貼C第三方庫。那個年代的編程語言往往都會讓自己的編譯器可以生成標準的obj文件,且確保這些obj文件可以與C的obj直接連接到同一個可執行文件里。至於編寫標準的動態庫當然也是必不可少的。
反觀最近這些年的新編程語言,也就Lua比較有sense的去最大化支持與C的對接,其他語言對C擴展的支持真的很爛,或者乾脆裝死不去兼容。就連早期的Java都在追求純粹性,好在後來覺醒,引入了JNI來支持C第三方庫。
回頭來對比Go和Python。
1、第三方庫的數量:這就沒得比了,Python的庫實在太豐富
2、對C庫的調用:Python的支持雖然不算完美,但也還算是各種語言里較好的;Go的做法是make sense的,就是主動與C做互操作,儘管語法有點怪,對應Python里Cython的水平,就是可以湊合,但不好用3、微線程、高並發、非同步支持:這部分Python里也有一堆的第三方庫支持,eventlet,gevent,twisted等等所以,就以這些狀況來看,Go想要超越Python還真是不容易,也有較大可能是像過去這些年出現的無數曇花一現的語言一樣,最終冷掉。
能用庫解決的,就別沒事瞎寫編譯器。快並不是全部,互聯網研發最重要的不是運行速度而是開發速度,Go有幾個特性是挺鬧心的:沒有異常系統很容易漏掉該處理的錯誤;並發訪問map處理不好動不動就panic;第三方庫的版本不好控制等。雖然良好的設計很大程度上能解決這些問題,但一般的程序員水平都是不夠的,結果就是反而浪費了很多時間在調試上。而高並發高性能的優勢沒太多人能用好。對於優秀的程序員來說Go的這些短板可以克服,但現實情況是不優秀的才是大多數。
Python 出現於上世紀 90 年代初,到本世紀第一個十年末才開始流行。Python 開始流行的時候,Go 才剛剛出現,至今不到十年。Python 比 Go 流行是很正常的事情,這不是執行性能可以改變的。
再說了,排名高低、流行與否這些事情,有啥意義么?
=====
@gashero 的回答里有這麼一段
在1990年之前的那些編程語言,對C第三方庫的重視就遠超現代,甚至一些做法在現代來看可以說是絞盡腦汁去貼C第三方庫。那個年代的編程語言往往都會讓自己的編譯器可以生成標準的obj文件,且確保這些obj文件可以與C的obj直接連接到同一個可執行文件里。至於編寫標準的動態庫當然也是必不可少的。
反觀最近這些年的新編程語言,也就Lua比較有sense的去最大化支持與C的對接,其他語言對C擴展的支持真的很爛,或者乾脆裝死不去兼容。就連早期的Java都在追求純粹性,好在後來覺醒,引入了JNI來支持C第三方庫。
下面我來演示下,怎樣用 go 寫一個靜態鏈接庫,讓 C 程序可以鏈接。動態鏈接庫同理。
lib.go
package main
import "C"
func main() {
}
//export Foo
func Foo(i int) int {
return i + 42
}
編譯成 .a
go build -buildmode=c-archive -o lib.a lib.go
main.c
#include &
extern int Foo(int);
int main() {
printf("%d
", Foo(8));
}
編譯並鏈接 go 寫的庫
clang main.c lib.a -lpthread
運行
&> ./a.out
50
和 C 的兼容性是這個水平了,還想要怎樣?
===
go 還能寫 Python 擴展:go-python/gopy
本質就是編譯出一個動態鏈接庫給 Python 的 vm 用,go 自然可以。其他通過動態鏈接庫來擴展的 vm,如 lua、CRuby 等都可以用 go 寫擴展。
go 對 C 的兼容,不是 Python 可以拿來比較的東西。
go要搶的也不是python的飯碗,這倆語言一起比意義不大
我喜歡python無非兩個原因
語法簡單,一兩天即可入門
非常非常非常非常豐富的第三方庫,你幾乎可以用python做一切你能想到的事情,而且都有庫能用我想說,咱們爭論這倆語言的時間拿去學C++早就學會了。
流行?排名?我現在就把話筒交給李易峰和楊冪。
好吧,寧願用Go也不要用Python。我是看重執行效率與靜態編譯型安全的語言。我估計就算再過十年,Go依然沒有Python流行,因為流行這東西本身就不代表是更好的,VB在印度非常流行,用的人很多,這是歷史原因造成的, 但是你能說VB是好的么?
Python我覺得還是比Go更容易學習和使用,也更成熟。
關於性能,其實不需要性能的地方比比皆是,你可以用Python快速寫個自動化處理的腳本,用完即仍,這時候編譯型或者性能更好沒什麼優勢和必要。
Go最好的方面可能是後台服務,高並發,但是你寫個自己用的程序用得著高並發么?倒是Go生成的文件太大,寫個HelloWorld要1.5M(1.8版Linux),我知道這是因為什麼,但是這也說明了,Go並不適合寫小程序。
語言的好壞不能看流行度,在合適的場合能發揮最大的效果這樣就行了。
是什麼給了你這樣的錯覺,go這個新兵蛋子憑什麼能比python流行,也就是國內幾個所謂的程序大牛鼓吹,加上Google這個爹讓你覺得這玩意好用。作為編譯型的語言也就天生支持高並發這個賣點,它競爭對手是c++,Java,c#,Python作為腳本語言的領域go根本插不上腳。
以前被PHP繁瑣的配置和過於鬆散的語法,搞得項目難以重構,嘗試和接觸了很多新語言,第一次發現Go語言時,確實激動了一把。但後來還是放棄了。
Go 語言,強類型,編寫程序時不容易出錯,編譯對第三方的依賴低,又自帶包管理,編譯速度還很快,而且,編譯後只有一個文件,容易部署。
可問題是,Go語言的功能性庫,質量參差不齊,有些方面熱情度很高,一大堆選擇,有些細末枝節,無人問津,即便有也是生硬翻譯其他語言的實現方式,並沒有充分運用Go語言的特性。
而說到非同步,並發,如果開發網站,如果是開發大型的,業務邏輯繁雜的商業網站,Java和C#,再用C++加持,有成千上萬成功的案例和源代碼可以參考。如果是小網站,PHP和NodeJS,比起Go語言,更能卸掉多任務的包袱。
再者,像Python那個全世界有名的電子書軟體,Calibre,添加一本書,轉換一下格式,又慢又卡,以前做資源整合,有上萬本書要轉換格式,就想著用c#寫個一次性軟體,胡亂拼湊一些三方庫,暴力式的快速搞定。可實際上,電子書製造者,並沒有沿用一致的規則,轉著轉著,程序就奔潰了,調試再轉又碰到一個例外。等到終於全部轉完了,隨機抽查,居然有無法載入的,有排版嚴重變形的,有亂碼的。
亂折騰,花費的時間多了幾倍,而且因為亂,也沒有積累什麼經驗。
Go語言雖然編譯快,容易部署,但畢竟不是腳本,要調試,要更動,要有很大的彈性,麻煩程度還是比腳本大。
譬如說,想看一本連載的小說,用Go語言去抓,比Python麻煩幾倍,非同步並發?網速卡在那裡,要把控好數據整理的順序,非同步並發的能力越困難,反而條理更清晰,出錯的概率會更低。
再者,做項目的時候,總是需要做一些小工具來提高效率,比如說,根據資料庫的設計,生成各種代碼,對一些現有的數據,進行排序,篩選,對圖片進行一些統一的修整,如果都做成命令行,在終端里敲,會變得更麻煩,遠遠沒有用戶界面那種便捷的友善的交互感。而一套完整的UI支持,需要投入非常大的資源,把瀏覽器當成宿主,也不太現實。
再者,Python在學術界很流行,R語言和Julia在大數據方面做的風生水起,但現實里,常常看到的還是Python的身影。你要一堆搞研究的,去學一門新語言,你要一堆搞金融的,去琢磨琢磨什麼是指針,什麼是數據結構,什麼是演算法。他肯定寧願用第三方的介面先弄著,舒舒服服看下電影,或者看看其他報表。
而且,現在非同步和並發漸漸式微了。非同步和並發無論怎麼弄,數據安全都是個大問題。微伺服器的概念,化繁為簡,讓多個小伺服器,交互協同,似乎更有效率更現實。
如果.Net Core 進一步發展,在網路應用方面,通吃的潛力,似乎比Go語言更大。
Go 語言要取代 Python,如果不納入學校的課程,如果沒有一個巨大的盈利動機,至少在可見的將來是不太可能的。go目的不是為了流行,也不是為了取代誰,而是為了解決C++程序員寫高並發服務時的一些痛點。它的語法特性完全是為了高並發後台服務設計的,所以註定了是一個小眾領域,不可能流行起來。沒有高並發大規模後台服務經驗的人,可能不太理解為什麼需要go語言。簡短的說,高性能和高開發效率是不可得兼的。對於谷歌這種有上百萬台伺服器,每年機房成本數百億的互聯網公司來說,性能是極度重要的。所以他們主要用C++,然而C++寫高並發服務很多問題,很讓人頭痛,所以google搞出了go。騰訊也遇到了類似的情況,所以對go是很歡迎的,有部分新項目也開始使用go語言。所以go不是吸引python和Java程序員用的,而是吸引c/c++程序員用的。如果不是並發量特別大,性能要求特別高,沒有必要用go。當然一些小創業公司,隨著業務慢慢大起來,將python重構成go也是可以的。
莫名其妙,什麼時候能少點這種問題?
你怎麼不問問為什麼小學生走的路遠遠沒有大學生走得多?
如果限定領域來比較,在ai領域,go看不到python的影子;cloud native領域,python看不到go的影子;sa領域,go沒用威脅(web開發,python和go都看不到php的影子;網路服務開發,python不是個。
總的來講,拿這兩個比較確實不太合適,go確實搶了一些python的地盤,但python家大業大,沒什麼大影響。go在某些領域已經有了很大成果了,但不存在完全替代某一語言的可能性
推薦閱讀:
※為什麼負數的取余計算各個編程語言結果不統一?
※現在的編程語言已經泛濫了,為什麼google還要推出GO語言?
※第二屆 Gopher China 大會影響力如何?
※c++設計三種不同繼承方式的意義是什麼?
