我自 2011 年起,就是 Python 的用戶與愛(ài)好者了。當(dāng)時(shí),一個(gè)好友建議我用 Python 代替 Perl 試試 ,一個(gè)嶄新的世界向我開(kāi)放了。在這個(gè)世界里可讀性比什么都重要,還有一種簡(jiǎn)明的規(guī)則。
即使用了 7 年多的 Python ,我對(duì)它的熱情還是一如往昔。但是,歲月流逝之下任何人都該去追尋新的機(jī)遇與冒險(xiǎn)。是時(shí)候嘗試下別的語(yǔ)言了!
Python 的問(wèn)題
首先,列舉我在 Python 中遇到的一些問(wèn)題:
打包:這方面是大多數(shù)解釋型語(yǔ)言都會(huì)遇到的問(wèn)題。打包成一個(gè)包括整個(gè) virtualenv 的可安裝程序, FPM 之類的工具可以讓這個(gè)過(guò)程非常容易,但是它仍然缺少一個(gè)單一二進(jìn)制程序的優(yōu)雅。
靜態(tài)類型:就像一些人從開(kāi)始使用 C++ 到完全喜愛(ài)它,我確實(shí)懷念我在 C++ 中用過(guò)的類型安全。這與編譯時(shí)檢查密切相關(guān),它確實(shí)幫助我們保證我們的代碼的質(zhì)量,甚至在執(zhí)行之前。
速度:大多數(shù)解釋型語(yǔ)言的又一個(gè)問(wèn)題。Python 對(duì)于許多任務(wù)都足夠快,但是仍然遠(yuǎn)遠(yuǎn)落后于編譯型語(yǔ)言。
冗長(zhǎng):我們只有在 Python 3.6 才有 f-strings ,它確實(shí)是一個(gè)解脫。然而,我們?cè)陬惡徒Y(jié)構(gòu)中仍然有非常冗長(zhǎng)的 self 語(yǔ)法,到處都是 self.var = var ,這可能會(huì)在 Python 3.7 的數(shù)據(jù)類 中部分解決。
隱式私有類成員:我說(shuō)的私有就是那該死的私有!作為一個(gè)前 C++ 程序員,我發(fā)現(xiàn) Python 的私有屬性和方法的下劃線前綴格式有一點(diǎn)…變態(tài)?:‘)
進(jìn)一步來(lái)說(shuō),我不確定我真的喜愛(ài) Python 在幾個(gè)領(lǐng)域的發(fā)展方向,尤其是在異步和類型方面。
協(xié)程:盡管大受歡迎,Python 中新的異步方法讓人感覺(jué)非常不友好而且很難掌握?,F(xiàn)有代碼在非阻塞之前也需要大量的工作。隨著越來(lái)越多的庫(kù)開(kāi)放使用,以及隨著我了解且會(huì)使用新的庫(kù)越來(lái)越多,我覺(jué)得這種情況會(huì)隨之改善。
類型注解(和 mypy ):說(shuō)實(shí)話,類型注解很受歡迎…如果他們真的在 CPython 做了什么的話。如果沒(méi)有主 CPython 發(fā)布版本主流支持的情況下,使用類型注解作為各式結(jié)構(gòu)體(如數(shù)據(jù)類)這種想法看起來(lái)毫無(wú)意義。與此同時(shí),mypy 目前還不是主流,但長(zhǎng)遠(yuǎn)來(lái)看,作為一個(gè) Python 類型校驗(yàn)展示了巨大的潛能,特別是在將 --strict 標(biāo)識(shí)開(kāi)啟的時(shí)候。
我應(yīng)該說(shuō)明我仍然是 Python 的忠實(shí)粉絲和支持者,而且認(rèn)為它仍然是當(dāng)前最好的解釋型語(yǔ)言之一;特別是當(dāng)你考慮到它驚人的生態(tài)系統(tǒng)和成熟度。
我在尋找什么
我的出發(fā)點(diǎn)是 Python 和 Ruby 。 我經(jīng)常在需要的地方使用 Ruby ,也非常喜歡它。 Ruby 解決了 Python 所具有的幾個(gè)問(wèn)題(適當(dāng)?shù)乃接?受保護(hù)的屬性,較少冗長(zhǎng)的語(yǔ)法等等),但仍然存在性能問(wèn)題,并且缺少靜態(tài)類型。
因此,我開(kāi)始尋找具有以下特點(diǎn)的新語(yǔ)言:
與 Python 和 Ruby 類似的語(yǔ)法
單二進(jìn)制分發(fā)
編譯,靜態(tài)類型和快速
面向?qū)ο螅ㄅ额?,我多么?ài)你。。。。。。)
候選項(xiàng)
下列語(yǔ)言被排除在外
GO:沒(méi)有關(guān)鍵字參數(shù)、沒(méi)有異常、沒(méi)有類、沒(méi)有泛型以及命名風(fēng)格的可怕,這些都導(dǎo)致我拒絕了Go(盡管也許這種簡(jiǎn)單性吸引了很多人)。我實(shí)際上花了相當(dāng)一段時(shí)間在 Go 的學(xué)習(xí)和編碼上,我覺(jué)得這是最令人沮喪的。在 C 之后,像 C++ 這樣的語(yǔ)言已經(jīng)取得了很多進(jìn)步,并為我們提供了更大的靈活性,但感覺(jué) Go 似乎讓我們回到了 C 語(yǔ)言的時(shí)代。
Elixir:一種引人入勝的函數(shù)式語(yǔ)言,但缺少面向?qū)ο蟮墓δ?,以及單個(gè)二進(jìn)制分發(fā)不是此語(yǔ)言的目標(biāo)的事實(shí)對(duì)我的用例來(lái)說(shuō)有點(diǎn)失望。然而,我們團(tuán)隊(duì)中的許多人將 Elixir 作為他們所有新項(xiàng)目的主要語(yǔ)言,并且發(fā)現(xiàn)它在使用中非常出色。Elixir 擁有豐富且可靠的傳統(tǒng),如果你想要一種函數(shù)式語(yǔ)言,你一定要考慮它。
Rust:這是個(gè)有趣的語(yǔ)言,我花了一些時(shí)間嘗試學(xué)習(xí)。真的,我只是覺(jué)得 Rust 并不對(duì)癥于我的用例。這是一種相當(dāng)復(fù)雜的語(yǔ)言,我和其他很多人似乎都不喜歡它。
Julia:這種語(yǔ)言實(shí)際上是針對(duì)科學(xué)計(jì)算的,而不是我的用例。它也缺乏我想要的面向?qū)ο竽芰Α?/p>
Pony:一種非常吸引人的語(yǔ)言,似乎借鑒了很多 Python ,但也借鑒了一些我不喜歡的東西(例如,強(qiáng)調(diào)前綴變量,缺乏對(duì)稱性等)。我大體上感覺(jué) Pony 與我的想法不一致,認(rèn)為它不具有與其他語(yǔ)言一樣的吸引力,這使得它現(xiàn)在相當(dāng)原始。
我真正感興趣并希望在未來(lái)進(jìn)一步研究的語(yǔ)言有:
Nim:Nim 是最初我準(zhǔn)備用來(lái)領(lǐng)跑的下一個(gè)語(yǔ)言,我希望將來(lái)能花更多的時(shí)間來(lái)研究它。
Swift:另一種流行的面向?qū)ο笳Z(yǔ)言,除了開(kāi)發(fā) iOS 和 Mac 應(yīng)用程序外,絕對(duì)值得關(guān)注。
但是,最終,我決定致力于學(xué)習(xí) Crystal !
原因如下:
Crystal 很快就能熟悉,因?yàn)樗蟛糠肿裱?Ruby 的語(yǔ)法
它編譯成一個(gè)快速、單一的可執(zhí)行文件
整個(gè)標(biāo)準(zhǔn)庫(kù)都是用 Crystal 編寫的,可以在需要時(shí)很容易閱讀
它提供了與 Ruby 類似的完全面向?qū)ο蟮姆椒ǎòㄕ嬲氖鼙Wo(hù)的和私有的成員)
Crystal 使用靜態(tài)類型,但也提供了聯(lián)合(能夠定義可以具有多種類型的變量)
它提供了開(kāi)發(fā)類似于 Ruby 的 DSL 的能力(這是我一直感興趣的)
與 C 庫(kù)的綁定完全原生,并且以 Crystal 編寫(與 Python 中的 ctypes 類似,只不過(guò)更好)
注意事項(xiàng)
Crystal 是一個(gè)非常年輕的語(yǔ)言,仍然沒(méi)有發(fā)布 1.0 版本。它通常會(huì)在版本中引入重大更改并且限制庫(kù)。
不過(guò),我打算僅在我的個(gè)人項(xiàng)目中使用這種語(yǔ)言,并且愿意成為早期使用者,因?yàn)槲矣X(jué)得這種語(yǔ)言有足夠的前景值得使用。
經(jīng)驗(yàn)
標(biāo)準(zhǔn)庫(kù)
整個(gè)標(biāo)準(zhǔn)庫(kù)非常容易閱讀,我一直在引用它。庫(kù)似乎也有一定的廣泛性,是一個(gè)很好的基礎(chǔ)教程。
以下是添加數(shù)組的示例:
這里是獲取文件擴(kuò)展名的函數(shù):
如果你選擇嘗試 Crystal ,請(qǐng)確保讓它的源碼待在你身邊; 它非常有價(jià)值和有用。
綁定到 C 庫(kù)
這真的太神奇了!
下面是一個(gè)綁定從 Unix 系統(tǒng)獲取用戶信息的各種函數(shù)的例子:
異常處理
類似的異常處理提供給 Puby 和 Python :
寫你自己的異常很簡(jiǎn)單;只需要集成 Exception 類。
導(dǎo)入系統(tǒng)和命名空間
這是來(lái)自 Python 的一些調(diào)整,但是因?yàn)?Ruby 遵循類似 C++ 的方法,把我?guī)Щ氐搅?C++ 時(shí)代。
C++ 命名空間等同于你可以自定義 Ruby/Crystal 模塊。要求任何庫(kù)將導(dǎo)入它定義的所有項(xiàng)目,因此它總是完美的保證了你的整個(gè)庫(kù)包含在模塊中,以此來(lái)避免命名空間污染。
起初我還有點(diǎn)擔(dān)心,但我發(fā)現(xiàn)它可以從任意數(shù)量的文件中輕松建立一個(gè)模塊。然而,我得承認(rèn),找到事物的來(lái)源更像是一種挑戰(zhàn)。
評(píng)論
查看更多