Python和Ruby:流行動(dòng)態(tài)腳本語(yǔ)言之特點(diǎn)對(duì)比
最近幾年以來(lái),動(dòng)態(tài)腳本編程語(yǔ)言在國(guó)內(nèi)的得到了越來(lái)越多的普及應(yīng)用,其中Python和Ruby更是佼佼者,經(jīng)常拿來(lái)被比較,我覺(jué)得兩者倒是各有特點(diǎn):
51CTO編輯推薦:Ruby入門(mén)教程與技巧大全
一、Python從語(yǔ)法上來(lái)說(shuō)更質(zhì)樸一些,而Ruby更性感一些
Python的語(yǔ)法相對(duì)其他腳本語(yǔ)言來(lái)說(shuō),沒(méi)有太多花巧的地方,顯得比較死板一點(diǎn),其實(shí)從Python強(qiáng)制代碼縮進(jìn)也可以看出來(lái)Guido設(shè)計(jì)語(yǔ)言的取向。語(yǔ)法死板的一面就是不容易玩出來(lái)更性感的東西,比方說(shuō)Rails這樣的框架,另外Python也無(wú)法做DSL這樣的事情,但是語(yǔ)法死板的另一面就是比較規(guī)范,相對(duì)來(lái)說(shuō),更加適應(yīng)軟件開(kāi)發(fā)的工程性要求,更容易組織大規(guī)模的團(tuán)隊(duì)進(jìn)行開(kāi)發(fā)。
Ruby的語(yǔ)法非常靈活,Matz設(shè)計(jì)ruby的出發(fā)點(diǎn)也是為了coding for fun,因此可以用ruby玩出來(lái)很多花樣,運(yùn)用足夠的技巧,可以用Ruby寫(xiě)出來(lái)逼近自然語(yǔ)言的DSL,對(duì)于程序員來(lái)說(shuō),玩ruby確實(shí)充滿了樂(lè)趣。Rails能在ruby社區(qū)誕生,而不是Python社區(qū)誕生絕對(duì)和編程語(yǔ)言有直接的關(guān)系。不過(guò)ruby語(yǔ)法靈活的另一面就是編程實(shí)現(xiàn)風(fēng)格的多樣性,這對(duì)于大規(guī)模團(tuán)隊(duì)的協(xié)作和管理是一個(gè)挑戰(zhàn)。
二、Python的解析器實(shí)現(xiàn)更成熟,第三方庫(kù)質(zhì)量高
Ruby1.9解析器盡管已經(jīng)有了很大的性能提升和很多新的功能,但是從源代碼實(shí)現(xiàn)的角度來(lái)說(shuō),基本上是通過(guò)在Ruby1.8源代碼上打patch來(lái)增加功能的。從源代碼的結(jié)構(gòu)來(lái)說(shuō),Ruby的實(shí)現(xiàn)太古老了,Ruby擴(kuò)展起來(lái)比較困難,只能不斷打patch。這也是為什么現(xiàn)在Ruby社區(qū)涌現(xiàn)出來(lái)那么多新的Ruby解析器實(shí)現(xiàn)的原因。從很大程度上來(lái)說(shuō),這制約了Ruby的發(fā)展速度。相對(duì)而言,Python解析器更成熟,也比較穩(wěn)定。
在第三方類(lèi)庫(kù)的數(shù)量上來(lái)說(shuō),Ruby并不比Python少,但是高性能高質(zhì)量久經(jīng)考驗(yàn)的第三方類(lèi)庫(kù)Python要明顯比Ruby多,事實(shí)上很多Ruby的第三方類(lèi)庫(kù)都不太成熟,因此這也很大程度上制約了Ruby的發(fā)展。
三、Python的應(yīng)用領(lǐng)域非常廣泛,而Ruby目前主要局限在在Web領(lǐng)域
Python應(yīng)用的領(lǐng)域非常廣泛,除了web開(kāi)發(fā)以外,還被廣泛用在服務(wù)器后端的高性能服務(wù)器實(shí)現(xiàn),服務(wù)器后端的各種密集運(yùn)算,全文檢索,各種文本處理,系統(tǒng)管理等等,另外桌面應(yīng)用領(lǐng)域wxPython也是一個(gè)很成熟的跨平臺(tái)GUI框架。對(duì)于某些特殊的應(yīng)用,比方說(shuō)調(diào)用操作系統(tǒng)內(nèi)核API,Python也可以完成的很好,比方說(shuō)大量小文件的實(shí)時(shí)同步方案,就是用Python直接調(diào)用Linux Kernel的inotify特性來(lái)實(shí)現(xiàn)的。所以可以說(shuō)Python是軟件開(kāi)發(fā)領(lǐng)域的瑞士軍刀,什么事情都可以做。
正是由于Ruby解析器和Ruby類(lèi)庫(kù)的制約,Ruby的應(yīng)用主要局限在Web開(kāi)發(fā)領(lǐng)域,目前Ruby的應(yīng)用還無(wú)法延伸到web開(kāi)發(fā)領(lǐng)域以外的很多地方。據(jù)說(shuō)豆瓣早期就考慮過(guò)Ruby on Rails,但是因?yàn)镽uby不能做其他事情,而Python可以大包大攬,最后放棄Ruby選擇了Python。
四、在Web領(lǐng)域Ruby是王者
隨著互聯(lián)網(wǎng)應(yīng)用更進(jìn)一步滲透到軟件開(kāi)發(fā)的各個(gè)領(lǐng)域,其實(shí)web開(kāi)發(fā)占整個(gè)軟件行業(yè)開(kāi)發(fā)的比重也是越來(lái)越大。盡管Ruby在其他領(lǐng)域很受制約,但是在Web開(kāi)發(fā)領(lǐng)域就是絕對(duì)的王者了。Rails框架的領(lǐng)先程度已經(jīng)遠(yuǎn)遠(yuǎn)甩開(kāi)了任何一個(gè)潛在的競(jìng)爭(zhēng)對(duì)手十萬(wàn)八千里。因此盡管Ruby可能有這樣那樣的問(wèn)題,但是說(shuō)到Web開(kāi)發(fā),Rails幾乎就是無(wú)可爭(zhēng)議的唯一選擇。
而Python盡管十分全面,卻偏偏在web開(kāi)發(fā)領(lǐng)域不彰,web框架雖然眾多,卻沒(méi)有一個(gè)真正可以挑大梁,Django雖然在Python社區(qū)比較流行,但很多方面也有缺陷?,F(xiàn)在的互聯(lián)網(wǎng)應(yīng)用往往都是多種語(yǔ)言混合編程,Ruby在Web以外的缺陷也可以用其他語(yǔ)言來(lái)彌補(bǔ)。
五、Python的包管理不如Ruby
盡管Python的第三方類(lèi)庫(kù)更高質(zhì)量更成熟,但是Python社區(qū)缺乏Ruby Gem這樣一個(gè)良好的包管理軟件和包發(fā)布的網(wǎng)站。因此應(yīng)用的構(gòu)建顯得不如Ruby那么方便,那么人性化。特別是在類(lèi)庫(kù)的版本升級(jí)上,就會(huì)遇到很多麻煩,不如Ruby Gem那么簡(jiǎn)單。
不過(guò)總的來(lái)說(shuō),Python和Ruby還是相似度極高的兩種編程語(yǔ)言,即使兩種編程語(yǔ)言都學(xué)習(xí)一下也不會(huì)浪費(fèi)太多時(shí)間。如果我個(gè)人選擇的話,會(huì)首選用Rails來(lái)構(gòu)建web應(yīng)用,再根據(jù)情況選擇Python或者Java處理一些服務(wù)器后端的運(yùn)算。總之,未來(lái)還是一個(gè)混合編程的時(shí)代,我們需要多了解一些編程工具,然后根據(jù)需要看菜吃飯才行。
本文來(lái)自robbin的博客:《記上海Python社區(qū)聚會(huì),談Python和Ruby》。
【編輯推薦】