技術(shù)迭代的速度越來越快,這一點(diǎn)在編程語言的更新變化中尤為明顯。前不久,Python開發(fā)商Anaconda發(fā)布了PyScript,讓Python應(yīng)用可以在瀏覽器中運(yùn)行。而在近日,開發(fā)者采用相同的思路讓Go也能在瀏覽器上運(yùn)行。
眾所周知,每種語言都有其獨(dú)特性的表現(xiàn),互相之間是不能替代的。Python和Go這兩種語言都是時(shí)下非常熱門的語言。從技術(shù)上講,Go是一種為速度而構(gòu)建的過程式函數(shù)式語言,而Python是一種面向?qū)ο?、命令式、函?shù)式和過程式語言。Go支持并發(fā),即算法能夠無序運(yùn)行其步驟,而Python不支持。
從最新一期的TIOBE編程語言排行榜可以看出,Python依然穩(wěn)定地占據(jù)榜首位置,Go則位列第14位。
TIOBE5月編程語言排行榜
“Python的功能最強(qiáng)大,而Go的速度最快”,這應(yīng)該能代表大多數(shù)程序員的心聲。事實(shí)上,Python和Go兩種語言雖然各有優(yōu)勢(shì),但在流行性上Python卻是略占上風(fēng)的。為什么Go語言沒有Python流行呢?
Python誕生更早,Go為需求而生
想要探究流行性的問題,從語言產(chǎn)生之初就可以初見端倪。
Python是1991年出現(xiàn)的,使用者眾,使得它具備大量完備詳實(shí)的文檔,幾乎所有的庫都有官方使用文檔,還有大量的開源項(xiàng)目,使用Python,可以復(fù)用前人經(jīng)驗(yàn)文檔代碼,因此Python可以很好的被集成到企業(yè)級(jí)應(yīng)用中。
Go是2009年由谷歌開發(fā)完成的,它主要是用來解決其他編程語言過重包袱和過分設(shè)計(jì)的語言,雖然它擁有很高的性能和速度,但舍棄了一些功能,比如它沒有強(qiáng)大的庫,也不支持繼承,不支持對(duì)象導(dǎo)向的編程,這使得它很適合輕量級(jí)的線程實(shí)現(xiàn)。
需要說明的是,Python產(chǎn)生得更早,使用的人更多,從而流傳的說明文檔和項(xiàng)目代碼也更多,這又促使用的人越來越多,形成了一個(gè)正向循環(huán)。而Go雖然也有很多優(yōu)點(diǎn),但它并不適合重量級(jí)項(xiàng)目,又沒有大量的庫,無法面向?qū)ο缶幊?,就基本隔絕了讓它火爆的可能性。接下來具體看看二者之間的區(qū)別。
一動(dòng)一靜,數(shù)量大PK速度快
1、語法:Python的語法使用縮進(jìn)來指示代碼塊,Go的語言基于打開和關(guān)閉括號(hào)。
2、范例:Python是一種基于面向?qū)ο缶幊痰亩喾妒?,命令式和函?shù)式編程語言。它始終堅(jiān)持:如果一種語言在某些情境中表現(xiàn)出某種特定的方式,理想情況下它應(yīng)該在所有情境中都有相似的作用。但它又不是純粹的OOP語言,它不支持強(qiáng)封裝。Go是一種基于并發(fā)編程范式的過程編程語言,它與C具有表面相似性,實(shí)際上,Go更像是C的更新版本。
3、并發(fā):Go擁有內(nèi)置的并發(fā)機(jī)制,而Python沒有提供內(nèi)置的并發(fā)機(jī)制。
4、類型化:Python是動(dòng)態(tài)類型語言,而Go是一種靜態(tài)類型語言,它實(shí)際上有助于在編譯時(shí)捕獲錯(cuò)誤,這可以進(jìn)一步減少生產(chǎn)后期的嚴(yán)重錯(cuò)誤。
5、用法:Python更多用于Web應(yīng)用程序,它非常適合解決數(shù)據(jù)科學(xué)問題。Go更多地圍繞系統(tǒng)編程,即Go更像是一種系統(tǒng)語言。
6、安全性:Python是一種強(qiáng)類型語言,它是經(jīng)過編譯的,因此增加了一層安全性。Go具有分配給每個(gè)變量的類型,因此,它提供了安全性。但是,如果發(fā)生任何錯(cuò)誤,用戶需要自己運(yùn)行整個(gè)代碼。
7、管理內(nèi)存:Go允許程序員在很大程度上管理內(nèi)存。而Python中的內(nèi)存管理完全自動(dòng)化并由PythonVM管理,它不允許程序員對(duì)內(nèi)存管理負(fù)責(zé)。
8、庫:與Go相比,Python提供的庫數(shù)量要大得多。
9、速度:Go的速度遠(yuǎn)遠(yuǎn)超過Python。
編程語言流行的秘籍
通過對(duì)比不難發(fā)現(xiàn),兩種語言各有各的優(yōu)勢(shì),也都各有不足。一個(gè)語言的流行,需要擁有足夠多的優(yōu)點(diǎn),并且缺點(diǎn)是不夠致命的。
Python:功能強(qiáng)大、用途廣泛
1、語法簡單
和傳統(tǒng)的C/C++、C#等語言相比,Python對(duì)代碼格式的要求沒有那么嚴(yán)格,這種寬松使得用戶在編寫代碼時(shí)比較舒服,不用在細(xì)枝末節(jié)上花費(fèi)太多精力。
Python是一種代表極簡主義的編程語言,閱讀一段排版優(yōu)美的 Python 代碼,就像在閱讀一個(gè)英文段落,非常貼近人類語言,所以人們常說,Python是一種具有偽代碼特質(zhì)的編程語言。偽代碼必須結(jié)構(gòu)清晰、代碼簡單、可讀性好,并且類似自然語言。
2、開源且免費(fèi)
主要體現(xiàn)在兩方面:一是程序員使用Python編寫的代碼是開源的;二是Python解釋器和模塊是開源的。開源的好處就是,總有那么一小撮人,他們或者不慕名利,或者為了達(dá)到某種目的,會(huì)不斷地加強(qiáng)和改善Python。
3、跨平臺(tái)
Python本質(zhì)上是用C寫的,有C編譯器的地方就有Python解釋器。對(duì)于橫行天下數(shù)十載的C來說,早已擁有大量適配的平臺(tái)。作為一種解釋型語言,Python是可以跨平臺(tái)的,可移植性更好。
4、功能強(qiáng)大(模塊眾多)
Python的模塊眾多,基本實(shí)現(xiàn)了所有的常見的功能,從簡單的字符串處理,到復(fù)雜的3D圖形繪制,借助Python模塊都可以輕松完成。
Python社區(qū)發(fā)展良好,除了Python官方提供的核心模塊,很多第三方機(jī)構(gòu)也參與進(jìn)來開發(fā)模塊,這其中就有Google、Facebook、Microsoft等軟件巨頭。即使是一些小眾的功能,Python往往也有對(duì)應(yīng)的開源模塊,甚至有可能不止一個(gè)模塊。
5、用途廣泛
Python適用于網(wǎng)站、桌面應(yīng)用開發(fā),自動(dòng)化腳本,復(fù)雜計(jì)算系統(tǒng),科學(xué)計(jì)算,物聯(lián)網(wǎng),游戲設(shè)計(jì),機(jī)器學(xué)習(xí),自然語言處理等很多方面。它旨在提高程序員的開發(fā)效率而不在于他們編的代碼。由于Python程序代碼簡單,所以和與其他程序語言相比,后期的程序維護(hù)更容易,更舒心。從商業(yè)角度來看,需要的成本降低,程序員的效率提高。
“人生苦短,我用Python”,這是當(dāng)下非常流行的一句口頭禪。但你有沒有想過,其他語言真的不香嗎?相比Python,Go也自有其優(yōu)勢(shì)。
Go:“天下武功,唯快不破”
1、部署簡單
Go編譯生成的是一個(gè)靜態(tài)可執(zhí)行文件,除了glibc外沒有其他外部依賴。這讓部署變得異常方便:目標(biāo)機(jī)器上只需要一個(gè)基礎(chǔ)的系統(tǒng)和必要的管理、監(jiān)控工具,完全不需要擔(dān)心應(yīng)用所需的各種包、庫的依賴關(guān)系,大大減輕了維護(hù)的負(fù)擔(dān)。這和Python有著巨大的區(qū)別。由于歷史的原因,Python的部署工具生態(tài)相當(dāng)混亂,比如setuptools,、istutils、ip、buildout的不同適用場(chǎng)合以及兼容性問題。官方PyPI源又經(jīng)常出問題,需要搭建私有鏡像,而維護(hù)這個(gè)鏡像又要花費(fèi)不少時(shí)間和精力。
2、良好的語言設(shè)計(jì)
從學(xué)術(shù)的角度來說,Go語言其實(shí)非常平庸,不支持許多高級(jí)的語言特性;但從工程的角度來說,Go的設(shè)計(jì)是非常優(yōu)秀的:規(guī)范足夠簡單靈活,有其他語言基礎(chǔ)的程序員都能迅速上手。更重要的是Go自帶完善的工具鏈,大大提高了團(tuán)隊(duì)協(xié)作的一致性。比如Gofmt自動(dòng)排版Go代碼,很大程度上杜絕了不同人寫的代碼排版風(fēng)格不一致的問題。把編輯器配置成在編輯存檔的時(shí)候自動(dòng)運(yùn)行Gofmt,這樣在編寫代碼的時(shí)候可以隨意擺放位置,存檔的時(shí)候自動(dòng)變成正確排版的代碼。此外還有Gofix,Govet等非常有用的工具。
3、更快的性能和并發(fā)性
在Go和Python之間,Go執(zhí)行起來要快很多是一個(gè)確定的事實(shí)。這是因?yàn)榕cPython相比,Go更節(jié)省資源。Python使用資源要求較高的線程,而Go使用獨(dú)立的Goroutine,這有助于節(jié)省CPU和內(nèi)存等資源。這種資源效率不僅有助于提高性能,還能帶來成本效益。
4、可擴(kuò)展性
Go擁有許多內(nèi)置功能,可處理多個(gè)并發(fā)Web請(qǐng)求,這反過來又使其成為編譯程序的高效語言。當(dāng)語言能夠處理多個(gè)并發(fā)請(qǐng)求時(shí),它自動(dòng)也具有很高的可伸縮性。隨著企業(yè)的發(fā)展,所使用的程序?qū)⑿枰瑫r(shí)做許多事情。因此,隨著Go對(duì)后端程序的支持,任何不斷增長的業(yè)務(wù)都將能夠更好地處理可伸縮性問題。
總的來說,Go更多是為了解決C或C+程序員編寫高并發(fā)程序時(shí)的痛點(diǎn)問題。從語法特征上來說,Go主要是服務(wù)于高并發(fā)后臺(tái)服務(wù)器程序而設(shè)計(jì)出來的小眾語言,不可能成為大眾語言。高并發(fā)和高開發(fā)效率,如同魚和熊掌不可兼得。
如何選擇?
Go和Python都易于使用和學(xué)習(xí)。Go真的很快,而Python則有大量的社區(qū)支持。目前,在Go的開發(fā)中,Go主要用于服務(wù)器端應(yīng)用程序。Python是數(shù)據(jù)科學(xué)家的首選語言,而且很可能會(huì)持續(xù)很長時(shí)間。
從研發(fā)人員的使用情況來看,在智能分析方面用Python編譯會(huì)比較多,在部分基層調(diào)用能力上則采用Go比較多。
從可擴(kuò)展性來看,Go在創(chuàng)建之初就考慮到了可擴(kuò)展性。其內(nèi)置并發(fā)性允許同時(shí)處理多項(xiàng)任務(wù)。Python也使用并發(fā)性,但并非內(nèi)置,它通過線程實(shí)現(xiàn)并行化。這意味著如果你打算處理大型數(shù)據(jù)集,Go應(yīng)是更適合的選擇。
從性能方面來看,Python并非內(nèi)存/CPU友好的語言,但它具備大量庫,可以高效執(zhí)行基礎(chǔ)的開發(fā)任務(wù)。Go具備內(nèi)置功能,更適合微服務(wù)軟件架構(gòu)。
從應(yīng)用角度來看,Python適合人工智能、數(shù)據(jù)分析、深度學(xué)習(xí)和Web開發(fā)任務(wù),而Go適用于系統(tǒng)編程,執(zhí)行云計(jì)算和集群計(jì)算應(yīng)用的開發(fā)者喜歡使用Go。
從社區(qū)與庫的角度來看,Python的歷史賦予它一定優(yōu)勢(shì),它具備大量庫,擁有大型支持社區(qū)。而Go語言仍在增長期,沒有那么多庫和社區(qū)支持。但是Go語言的增長率和采用率非常驚人,每天都在擴(kuò)張。
從執(zhí)行層面來看,如果速度是王道,那么Go遙遙領(lǐng)先。
考慮以上事項(xiàng)后,具體使用案例將成為采用哪種語言的決定性因素。假如你的開發(fā)團(tuán)隊(duì)要?jiǎng)?chuàng)建微服務(wù),那么Go是更合理的選擇,因?yàn)樗俣瓤?、易于編程、可擴(kuò)展性優(yōu)異。而Python更適合AI、ML和數(shù)據(jù)分析任務(wù)。開發(fā)者在選擇編程語言時(shí),應(yīng)考慮開發(fā)項(xiàng)目的性質(zhì)和規(guī)模,以及所需的技能組合。
不過,在選擇語言時(shí),也不用太糾結(jié)。因?yàn)镚o和Python這兩種語言都在持續(xù)演進(jìn)、擴(kuò)張和增長。這意味著,不管選擇哪種語言,未來開發(fā)者都將看到這些語言出現(xiàn)更多的功能和改進(jìn)。讓我們一起拭目以待吧!
51CTO技術(shù)精選月刊《CTO悟道》最新一期已經(jīng)上線!更多精彩技術(shù)干貨、知識(shí)見解等你揭曉,下載鏈接:??http://www.scjtxx.cn/journalDetail/5.html?down=3??