作者 | Ari Joury
譯者 | 康少京
審校 | Noe
Python是我的生計(jì),我喜歡它。盡管我對(duì)這門語(yǔ)言有一些意見,但我強(qiáng)烈建議從事數(shù)據(jù)科學(xué)的新手去嘗試使用Python語(yǔ)言。不管怎樣,在該領(lǐng)域具有豐富經(jīng)驗(yàn)的人往往是 Python傳道者。
但是,這并不是意味著不能挑戰(zhàn)您所在領(lǐng)域的限制,例如通過(guò)探索不同的編程范式或新語(yǔ)言。
大約在十年前,微軟的軟件工程師注意到JavaScript已經(jīng)不能滿足他們的所有需求。一方面,這門語(yǔ)言發(fā)展迅速,增加了非常有趣的新功能,管道中的所有功能都無(wú)法解決一個(gè)基本問(wèn)題,JavaScrip對(duì)于小程序來(lái)說(shuō)很好,但用它編寫整個(gè)應(yīng)用程序卻一團(tuán)糟。
解決這一問(wèn)題有幾種可能性:例如,使用不同的語(yǔ)言,或者用更好的語(yǔ)法重新設(shè)計(jì)JavaScript。微軟的開發(fā)團(tuán)隊(duì)采用了不同的方法:他們通過(guò)擴(kuò)展JavaScript創(chuàng)建了TypeScript。通過(guò)這種方式,他們能夠使用JavaScript的所有新功能,同時(shí)擺脫對(duì)大型項(xiàng)目不利的東西。
與 Python類似,JavaScript是在運(yùn)行時(shí)編譯的,這意味著您需要運(yùn)行代碼來(lái)調(diào)試它。另一方面,TypeScript 是經(jīng)過(guò)編譯的。這提供了額外的安全層,因?yàn)槌绦騿T在執(zhí)行之前就有可能得到有關(guān)錯(cuò)誤的信息。對(duì)于像Python或JavaScript 這樣的非編譯語(yǔ)言,一旦意識(shí)到代碼沒(méi)有按預(yù)期運(yùn)行,在查找bug時(shí)可能會(huì)非常耗時(shí)。
然而,JavaScript和TypeScript之間的主要區(qū)別在于類型檢查器。編譯后,每個(gè)TypeScript程序都會(huì)檢查數(shù)據(jù)類型是否相互一致。
這可能聽起來(lái)很簡(jiǎn)單,但是當(dāng)你做一個(gè)有數(shù)千行代碼的項(xiàng)目時(shí),你會(huì)特別驚訝,感謝上帝擁有它。
還有一些其他差異,例如TypeScript具有匿名函數(shù)和異步函數(shù)這一事實(shí)。匿名函數(shù)是函數(shù)式編程的一個(gè)關(guān)鍵特性,它可以使程序在大數(shù)據(jù)的負(fù)載下更高效。
當(dāng)您需要并行執(zhí)行多個(gè)操作,或者處理不應(yīng)中斷后臺(tái)進(jìn)程I/O 操作時(shí),異步編程非常有用。在Python和Javascript中可以進(jìn)行異步編程,但在TypeScript中它是從核心內(nèi)置的。
TypeScript是javaScript的超集
Python的競(jìng)爭(zhēng)對(duì)手名單很長(zhǎng):Rust、Go、Scala、Haskell、Julia、Swift、C++、Java和R都在上面找到了一個(gè)條目??梢岳斫獾氖?,JavaScript和TypeScript 在如此擁擠的領(lǐng)域得不到那么多認(rèn)可
這并不意味著TypeScript不是通用編程世界中的主流。然而,在數(shù)據(jù)科學(xué)家中,它從來(lái)就不是特別受歡迎。
由此可以得出結(jié)論,TypeScript可能不適合數(shù)據(jù)科學(xué)。但不要著急。盡管它可能并不適用于數(shù)據(jù)科學(xué)的每個(gè)部分,但在某些領(lǐng)域它比Python具有明顯的優(yōu)勢(shì)。
如果你碰巧在其中一個(gè)領(lǐng)域工作,就得嘗試一下TypeScript。如果你沒(méi)有嘗試過(guò),誰(shuí)知道你接下來(lái)會(huì)在哪里著陸呢?該領(lǐng)域發(fā)展的很快。如果你能看得更遠(yuǎn),你就有了競(jìng)爭(zhēng)優(yōu)勢(shì)。
TypeScript是如何流行起來(lái)的
如果你討厭JavaScript中不斷發(fā)生的不合邏輯但又很滑稽的WTF時(shí)刻,那么我要告訴你一個(gè)壞消息:你也會(huì)在TypeScript中看到所有這些東西。
但這些語(yǔ)法問(wèn)題并不是程序員喜歡TypeScript的愿因。相反,它歸結(jié)為這樣一種想法:使用一個(gè)很棒的產(chǎn)品——JavaScript——并添加一些更強(qiáng)大的東西——靜態(tài)類型。
當(dāng)然,我并不是說(shuō)JavaScript總是很棒,或者靜態(tài)類型總是最好的做事方式。但是對(duì)于構(gòu)建大型的微軟風(fēng)格的應(yīng)用程序來(lái)說(shuō),這似乎非常有效。
也就是說(shuō),TypeScript的流行程度只是 JavaScript 的一小部分。這可以歸因于年齡:TypeScript是8歲了。但JavaScript的歷史是TypeScript的三倍!Python也是該領(lǐng)域的老前輩,已有三十年歷史。
盡管TypeScript成立的時(shí)間不長(zhǎng),但在一些領(lǐng)域是不可避免的。同時(shí)也增加了它的受歡迎程度。例如,當(dāng)Google在2016年宣布 Angular.js 將與TypeScript一起運(yùn)行時(shí),StackOverflow上的標(biāo)簽數(shù)量呈爆炸式增長(zhǎng)。
堆棧溢出趨勢(shì)
TypeScript只分享了Python和JavaScript所具有的一小部分吸引力。不過(guò),在某些領(lǐng)域這是不可避免的
TypeScript可能比Python更有優(yōu)勢(shì)的地方
當(dāng)年JavaScript之所以流行,是因?yàn)樗鼰o(wú)處不在。您可以在服務(wù)器、瀏覽器或任何您喜歡的地方運(yùn)行它。只要編譯一次,它就可以在任何地方運(yùn)行。當(dāng)它首次出現(xiàn)的時(shí)候,簡(jiǎn)直跟變魔術(shù)一樣。
由于它是基于JavaScript構(gòu)建的,因此TypeScript也具有這種魔力。Python也可以!當(dāng)然,它的實(shí)現(xiàn)略有不同,因?yàn)樗褂媒忉屍鞫皇翘摂M機(jī)。但這并沒(méi)有改變這樣一個(gè)事實(shí),即在run-me-anywhere方面,TypeScript 和Python不相上下。
泛型和靜態(tài)類型等特性使用TypeScript進(jìn)行函數(shù)編程比用Python更容易。這可能是一個(gè)優(yōu)勢(shì),因?yàn)橛捎跀?shù)據(jù)科學(xué)、并行編程、異步編程等方面的發(fā)展,對(duì)函數(shù)代碼的需求正在增長(zhǎng)。
另一方面,Python也增加了越來(lái)越多的函數(shù)式編程功能。在數(shù)據(jù)科學(xué)、機(jī)器學(xué)習(xí)等領(lǐng)域,Python處于最前沿。
這使得并行編程和異步編程成為可能。盡管這兩種語(yǔ)言都可以實(shí)現(xiàn),但有一個(gè)很大的區(qū)別:在Python中,需要使用特定的庫(kù)來(lái)完成任務(wù)。在TypeScript中,所有庫(kù)從核心開始都是異步的。由于后者在默認(rèn)情況下更具功能性,所以進(jìn)行并行編程通常更容易一些。
換句話說(shuō),如果你是一名涉及異步進(jìn)程和并行計(jì)算的Python開發(fā)人員,你可能想嘗試一下TypeScript。
是什么讓TypeScript對(duì)數(shù)據(jù)科學(xué)如此重要——或者不是
許多數(shù)據(jù)科學(xué)家處理異步和并行編程。可能首先考慮得是TypeScript而不是Python編寫,不過(guò),這是否是個(gè)好點(diǎn)子取決于很多因素。
首先,TypeScript不會(huì)用直接的方式進(jìn)行列表推導(dǎo),例如,在處理大型數(shù)組時(shí),這可能會(huì)令人苦惱。
其次,TypeScript 中沒(méi)有原生矩陣運(yùn)算Python具有NumPy以及許多其他工具,用起來(lái)會(huì)很簡(jiǎn)單。因此,如果項(xiàng)目涉及大量的線性代數(shù),這個(gè)時(shí)候可能你會(huì)不想采用TypeScript。
第三,如果你對(duì)JavaScript不太熟悉,肯定會(huì)有感到困惑的時(shí)候。由于 TypeScript是基JavaScript構(gòu)建的,它繼承了它的所有特性——好的、壞的和WTF。不過(guò),老實(shí)說(shuō),遇到這些現(xiàn)象也很有趣……
最后,要考慮到編程不是個(gè)獨(dú)立的職業(yè),在數(shù)據(jù)科學(xué)領(lǐng)域中,有個(gè)龐大的Python社區(qū)可以提供支持和建議,但目前TypeScript在數(shù)據(jù)科學(xué)家中還不是很流行。所以你可能找不到那么多關(guān)于StackOverflow和其他問(wèn)題的有用答案。
話雖如此,如果開發(fā)一個(gè)沒(méi)有太多大數(shù)據(jù)和矩陣運(yùn)算的項(xiàng)目,你可能還是想試試TypeScript,尤其是當(dāng)它涉及到一些并行或異步編程時(shí)。
沒(méi)有一種語(yǔ)言適用于所有的項(xiàng)目要求。當(dāng)然,有些語(yǔ)言比其他語(yǔ)言更有趣或更直觀。當(dāng)然,你喜歡的工具也是非常重要,因?yàn)檫@會(huì)讓你在困難時(shí)期繼續(xù)前進(jìn)。因此,從TypeScript或Python等深受歡迎的語(yǔ)言開始學(xué)習(xí)是個(gè)不錯(cuò)的主意。
但歸根結(jié)底,你不應(yīng)該像宗教一樣堅(jiān)持一種語(yǔ)言。編程語(yǔ)言是工具。哪種工具最適合您取決于您嘗試使用它做什么。取決于它做什么。
目前,Python對(duì)于數(shù)據(jù)科學(xué)來(lái)說(shuō)非常重要。但在一個(gè)快速發(fā)展的領(lǐng)域,你需要能夠看得更遠(yuǎn)。隨著任務(wù)的變化,工具也會(huì)發(fā)生變化。
另一方面,TypeScript有一個(gè)關(guān)于前端 Web、后端Node和移動(dòng)開發(fā)的熱門社區(qū)。有趣的是,這些領(lǐng)域與數(shù)據(jù)科學(xué)的交集比人們想象的要多。尤其是 Node,它在數(shù)據(jù)科學(xué)家中獲得了越來(lái)越多的關(guān)注。
當(dāng)然,這并不意味著您應(yīng)該一次涉足十幾種語(yǔ)言。精通一門語(yǔ)言是很有價(jià)值的。但對(duì)其他語(yǔ)言和技術(shù)保持好奇將幫助你長(zhǎng)期保持領(lǐng)先地位。
所以,當(dāng)你想嘗試新事物的時(shí)候。請(qǐng)不要猶豫,為什么不用TypeScript?
原文標(biāo)題:??Hey Python devs, don’t underestimate TypeScript???
譯者介紹
康少京,51CTO社區(qū)編輯,目前從事通訊類行業(yè),底層驅(qū)動(dòng)開發(fā)崗位,研究過(guò)數(shù)據(jù)結(jié)構(gòu),Python,現(xiàn)對(duì)操作系統(tǒng)和數(shù)據(jù)庫(kù)等相關(guān)領(lǐng)域感興趣。