python语言的重要性_【一点资讯】这个可能打败Python的编程语言,正在征服科学界 www.yidianzixun.com...
Julia 語(yǔ)言是近年來(lái)科學(xué)世界中出現(xiàn)的一匹黑馬。物理學(xué)家 Lee Phillips 發(fā)表了一篇高質(zhì)量的科普,介紹了這種科學(xué)計(jì)算語(yǔ)言的真正魅力所在。
圖片來(lái)源:Unsplash
撰文 Lee Phillips,物理學(xué)家
翻譯 REN
最近,我和許多科學(xué)家在網(wǎng)上視頻見(jiàn)面了很多次,他們對(duì)一個(gè)新工具感到興奮。它既不是最新的粒子加速器,也不是超級(jí)計(jì)算機(jī),而是一種年輕的計(jì)算機(jī)語(yǔ)言 ——Julia。
不同的計(jì)算機(jī)語(yǔ)言擅長(zhǎng)的工作也不一樣,有的運(yùn)行速度很快,有的則更容易開(kāi)發(fā)和部署,有的擁有龐大的生態(tài)系統(tǒng)和庫(kù),有的則適用于解決特定問(wèn)題。
對(duì)于需要模擬氣候變化或核聚變的科學(xué)家來(lái)說(shuō),目前的主流語(yǔ)言是Fortran。它的編譯器可以充分利用大型超級(jí)計(jì)算機(jī)的強(qiáng)大性能。而對(duì)于數(shù)據(jù)科學(xué)家來(lái)說(shuō),Python才是最受青睞的語(yǔ)言,因?yàn)樗鼡碛胸S富的生態(tài)系統(tǒng),強(qiáng)大的交互性和快速的開(kāi)發(fā)周期。
六年前,我撰文描寫(xiě)了 Fortran 在科學(xué)計(jì)算領(lǐng)域的地位,并與其他幾種語(yǔ)言進(jìn)行了比較。在文章結(jié)尾處我曾預(yù)測(cè):十年后,一種名為Julia的新語(yǔ)言很可能取而代之,成為科學(xué)家在解決大規(guī)模數(shù)字計(jì)算問(wèn)題時(shí)更愿意使用的語(yǔ)言。
我的預(yù)言不是很準(zhǔn)確,因?yàn)?Julia 只用了大約一半的時(shí)間,就接近了這一目標(biāo)。
通過(guò)近年與許多科學(xué)家的交流,我確信,Julia 在業(yè)界掀起了新的熱情。不過(guò),當(dāng)年分析它的潛力時(shí),我還不明白為什么這種語(yǔ)言會(huì)如此受歡迎。
當(dāng)時(shí),我的評(píng)估是基于 Julia 獨(dú)特的便捷語(yǔ)法與出色性能。盡管 Julia 1.0 正式版尚未發(fā)布,但整個(gè)社區(qū)已經(jīng)非常興奮。
Julia 似乎已經(jīng)解決了“兩語(yǔ)言問(wèn)題(two-language problem)”,這是 Python 等解釋性語(yǔ)言用戶經(jīng)常面臨的難題。用 Python 編寫(xiě)一個(gè)程序,雖然可以享受它的便捷語(yǔ)法和交互性,但當(dāng)計(jì)算規(guī)模擴(kuò)大到一定程度,程序的運(yùn)算速度就會(huì)放慢很多。這是 Python 語(yǔ)言本身的局限性。
對(duì)于大型的仿真模擬運(yùn)算來(lái)說(shuō),由于數(shù)據(jù)量過(guò)于龐大,程序的運(yùn)行速度至關(guān)重要,因此研究人員不得不用 C 之類(lèi)的語(yǔ)言再重寫(xiě)一個(gè)一樣的程序,以提升實(shí)際應(yīng)用時(shí)的運(yùn)行速度。可是速度上來(lái)之后,他們?cè)诤罄m(xù)研究中又要同時(shí)維護(hù)和更新兩種語(yǔ)言的代碼。“兩語(yǔ)言問(wèn)題” 由此而生。
Julia 自誕生起就以解決 “兩語(yǔ)言問(wèn)題” 作為使命,以此吸引科學(xué)家和其他人來(lái)學(xué)習(xí)該語(yǔ)言,不過(guò)這并不是它唯一令人興奮的地方。
以今年的 JuliaCon 大會(huì)為例,普通的計(jì)算機(jī)會(huì)議大多圍繞編程、編譯器、算法和優(yōu)化等計(jì)算機(jī)科學(xué)主題展開(kāi)。雖然 JuliaCon 上也有這些,但更多的是圍繞科學(xué)研究課題,比如流體力學(xué)、語(yǔ)言處理、大腦成像等等。這些演講題目給人一種走進(jìn)了科學(xué)研究大會(huì)的錯(cuò)覺(jué)。
這種百花齊放的情況得益于 Julia 編程社區(qū)的開(kāi)放態(tài)度,每個(gè)人的代碼都可以在 GitHub 上找到。如果有人希望使用現(xiàn)成的算法,從幫助文檔到代碼注釋,都可以拿到最新版本。
這與絕大多數(shù)年齡較大的科學(xué)家所熟悉的氛圍完全不同:在過(guò)去,科研代碼幾乎不會(huì)離開(kāi)實(shí)驗(yàn)室。
Julia 社區(qū)正是以大規(guī)模的協(xié)作和代碼共享為基石。
解決 “表達(dá)問(wèn)題”
“表達(dá)問(wèn)題(Expression Problem)” 是計(jì)算機(jī)語(yǔ)言設(shè)計(jì)研究中的常見(jiàn)概念。它是計(jì)算機(jī)科學(xué)的分支研究領(lǐng)域,人們對(duì)它的含義和解釋往往十分抽象,并且依賴(lài)于專(zhuān)業(yè)術(shù)語(yǔ)。
如果想要更好地理解這個(gè)概念,我們或許可以將其類(lèi)比成烹飪。
首先我們要明確一些計(jì)算機(jī)科學(xué)術(shù)語(yǔ),包括函數(shù) / 程序、數(shù)據(jù)類(lèi)型和庫(kù) / 模塊 / 包。
簡(jiǎn)單來(lái)說(shuō),函數(shù) / 程序指的是 “獲取輸入值,對(duì)其進(jìn)行處理,最后產(chǎn)生輸出值” 的過(guò)程。數(shù)據(jù)類(lèi)型是數(shù)字、字符或其他信息的集合,這些信息有各式各樣的結(jié)構(gòu),可以由函數(shù)操控。庫(kù) / 模塊 / 包則是函數(shù)的集合,還包括函數(shù)使用的數(shù)據(jù)類(lèi)型的描述。
接下來(lái)我們開(kāi)始類(lèi)比。
如果你知道食譜和烹飪是什么意思,這個(gè)類(lèi)比就很好懂。我們可以將庫(kù) / 模塊 / 包視為市面上出售的 “食譜書(shū)”,函數(shù) / 程序就是 “制作菜肴的完整過(guò)程或技術(shù)”,而數(shù)據(jù)類(lèi)型就是需要用到的 “食材或配料”。
現(xiàn)在想象一下食譜的內(nèi)容。一般來(lái)說(shuō),食譜都是以不同菜品為分類(lèi),比如炒菜實(shí)際上細(xì)分為如何炒洋蔥,如何炒蝦等等。每一道菜的步驟不同,因?yàn)樗鼈兪褂玫氖巢幕蚺淞喜煌_@些食材和配料表也是食譜的一部分。
菜品烹飪需要特定食材和配料。圖片來(lái)源:Lee Phillips
如果我們要添加一道新菜,那只需要囊括所有涉獵到的食材或配料就可以了,其他現(xiàn)有的菜品都不需要任何改動(dòng) —— 新菜不會(huì)讓舊菜失效。
添加新菜不會(huì)影響舊菜。圖片來(lái)源:Lee Phillips
但如果我們想加入新的配料或食材怎么辦?比如現(xiàn)有菜品制作過(guò)程中沒(méi)有用到魚(yú),那么我們就需要修改現(xiàn)有的制作過(guò)程。
但要添加新的食材,就要改變現(xiàn)有菜譜。圖片來(lái)源:Lee Phillips
不過(guò),組織食譜書(shū)的方法有很多,另一種方法是圍繞食材來(lái)組織書(shū)譜,而不是烹飪方法。每個(gè)食材,都會(huì)有配套的烹飪技術(shù)和方法。就像下圖所示:
以食材為核心來(lái)組織菜譜。圖片來(lái)源:Lee Phillips
在這種情況下,烹飪技術(shù)就不再是獨(dú)立存在的,而是與所使用的食材相關(guān)聯(lián)。如果要新添加魚(yú)作為新的食材,就可以編寫(xiě)一個(gè)新的魚(yú)的制作方法,與現(xiàn)有的魚(yú)類(lèi)烹飪方法整合在一起。
這樣一來(lái),添加新食材就不用改變現(xiàn)有菜譜。圖片來(lái)源:Lee Phillips
但如果想添加一種新烹飪技術(shù)呢?比如如何使用攪拌機(jī)?
在不更改現(xiàn)有工作的情況下,我們沒(méi)有辦法實(shí)現(xiàn)。因?yàn)楝F(xiàn)有技術(shù)已經(jīng)綁定在食材上,新烹飪技術(shù)必然會(huì)改變食材的制作方法。
這兩種食譜的組織方式類(lèi)似于兩種計(jì)算機(jī)語(yǔ)言類(lèi)型。圍繞烹飪過(guò)程的食譜書(shū)是 “面向過(guò)程的語(yǔ)言”,而圍繞食材的食譜書(shū)則是 “面向?qū)ο蟮恼Z(yǔ)言”。兩種語(yǔ)言各有千秋。
這其實(shí)就是 “表達(dá)問(wèn)題”:無(wú)論哪種語(yǔ)言,都存在擴(kuò)展軟件(食譜)的障礙。在重用和組合現(xiàn)有代碼時(shí),能否不更改現(xiàn)有已存在的軟件包至關(guān)重要。
如果你覺(jué)得前面的類(lèi)比還不夠清楚,接下來(lái)這一節(jié)還有另一種更直觀的解釋。
引入 “多重調(diào)度”
顯而易見(jiàn)的是,若有一種無(wú)論什么情況下都不用更改已有內(nèi)容的方式來(lái)組織食譜,就可以獲得極大的擴(kuò)展自由度,那將是一個(gè)很大的優(yōu)勢(shì)。
與其嚴(yán)格遵照制作過(guò)程和食材來(lái)組織食譜,不如采用一種更通用且靈活的方法。如下圖所示:
看起來(lái)雜亂的新菜譜組合方式,允許更大的自由度。圖片來(lái)源:Lee Phillips
這張圖片顯示了方法與食材的自由關(guān)聯(lián),誰(shuí)都不是另外一個(gè)的附屬品。但這不代表能隨機(jī)組合無(wú)關(guān)的方法,而是要基于現(xiàn)有方法創(chuàng)建變種,并與不同的食材配套。
舉個(gè)例子,我們現(xiàn)有的食譜書(shū)包含了炸雞的烹飪過(guò)程。如果想添加煎魚(yú)的過(guò)程,也不需要重新編寫(xiě),只需要指導(dǎo)讀者用炸雞的方式煎魚(yú),但要使用更高的溫度,并且將配料更早的剔除。
另一種審視三種思維模式的方法是想一想 “食譜的目錄”。
在“面向功能”的版本中,目錄可能是這樣的:
- 第一章:煎炸
雞
魚(yú)
- 第二章:水煮
雞
魚(yú)
在這種情況下,添加新功能只需要新開(kāi)一章,但添加新的食材(比如雞蛋)需要修改現(xiàn)有章節(jié):在第一章添加煎蛋,第二章添加水煮蛋等等。
在“面向?qū)ο蟆钡陌姹局?#xff0c;目錄可能是這樣的:
- 第一章:雞
煎炸
水煮
- 第二章:魚(yú)
煎炸
水煮
在這種情況下,添加新食材只需要新開(kāi)一章,但添加新的烹飪方法(比如烤)需要修改現(xiàn)有章節(jié):在第一章添加烤雞,第二章添加烤魚(yú)等等。
至于第三種方法,秉承可最大程度擴(kuò)展食譜的思想,目錄可能是這樣的:
- 第一章:炸雞
- 第二章:水煮雞
- 第三章:炸魚(yú)
- 第四章:水煮魚(yú)
很顯然,無(wú)論是食材還是烹飪技術(shù),都能作為新章節(jié)自由添加到書(shū)中,無(wú)需修改任何現(xiàn)有章節(jié):第五章烤雞,第六章烤魚(yú)等等。
與前兩個(gè)版本相比,第三種模式似乎沒(méi)有組織性。
但在實(shí)際操作中,烹飪方法和食材之間的關(guān)系可以成為庫(kù)結(jié)構(gòu)的一部分。在食譜類(lèi)比的語(yǔ)境中,我們可以想象雞和魚(yú)是肉的子集,草莓和櫻桃是紅色水果的子集,而煎炒和水煮則是更大的通用烹飪方法的變體,以此類(lèi)推。
這種思維模式是解決 “表達(dá)問(wèn)題” 的一種嘗試。這在語(yǔ)言設(shè)計(jì)中也被稱(chēng)為“多重調(diào)度”,指的是基于要應(yīng)用的所有數(shù)據(jù)類(lèi)型的類(lèi)型自動(dòng)選擇方法。
“多重調(diào)度” 是 Julia 解決 “表達(dá)問(wèn)題” 的方法,也是其核心組織原則,因此 Julia 既不是面向?qū)ο蟮?#xff0c;也不是面向功能的。它采用的解決方法比兩者更強(qiáng)大,更通用。這意味著 Julia 在混合和使用庫(kù)方面更加自由。
工具的重要性
Julia 不是第一個(gè)嘗試解決 “表達(dá)問(wèn)題” 的語(yǔ)言,也不是第一個(gè)用到 “多重調(diào)度” 的語(yǔ)言。擁有該功能的 Common Lisp 語(yǔ)言已經(jīng)誕生 40 年,Perl 等語(yǔ)言的最新版本也擁有該功能。用戶已經(jīng)肯定了 “多重調(diào)度” 在編寫(xiě)和擴(kuò)展庫(kù)方面的便利性。
但 Julia 與它們的區(qū)別在于,Julia 是圍繞 “多重調(diào)度” 設(shè)計(jì)的,而其他語(yǔ)言只是將其作為可選項(xiàng),并且會(huì)帶來(lái)性能損失。比如 Julia 的 “多重調(diào)度” 允許其更靈活和自然地表達(dá)數(shù)學(xué)思維,其社區(qū)代碼重用量讓語(yǔ)言設(shè)計(jì)者都感到驚訝。
不過(guò)想在科學(xué)界立足,有了上述優(yōu)勢(shì)還不夠。Julia 之所以受到了大量關(guān)注,還在于它將 “多重調(diào)度” 和其他特性相結(jié)合,比如快速上手的免費(fèi)高質(zhì)量代碼和非常快的運(yùn)算速度,對(duì)需要大量數(shù)字運(yùn)算的科學(xué)家非常有吸引力。
斯坦福大學(xué)教授 Mykel Kochenderfer 使用 Julia 設(shè)計(jì)了避免飛機(jī)碰撞的系統(tǒng),該系統(tǒng)已成為國(guó)際標(biāo)準(zhǔn)。他表示,Julia 不僅 “是高級(jí)的,可被解釋的語(yǔ)言,而且它的運(yùn)行速度也與高度優(yōu)化的 C ++ 代碼一樣快。”
Julia 還具有表達(dá)力強(qiáng),易于閱讀的語(yǔ)法,尤其是在處理數(shù)組時(shí)。它為數(shù)字算法的并行處理提供了一條快速通道。它具有 Unicode 時(shí)代的設(shè)計(jì)優(yōu)點(diǎn),使其在表述數(shù)學(xué)公式時(shí)更像真正的數(shù)學(xué)。
下面這幅圖片是 Julia 程序中的實(shí)際代碼,使用了專(zhuān)門(mén)為 Julia 語(yǔ)言設(shè)計(jì)的字體。
Julia 語(yǔ)言的數(shù)學(xué)公式表達(dá)。圖片來(lái)源:Lee Phillips
Julia 的這些特性在早期就吸引了許多科學(xué)家,甚至在 “多重調(diào)度” 的特殊優(yōu)勢(shì)引發(fā)關(guān)注之前,就已經(jīng)吸引了大量用戶。
而我從中所學(xué)到的核心思想是:工具很重要。這就好比,畫(huà)家作畫(huà)時(shí)要選好符合作品風(fēng)格的畫(huà)筆和顏料,而作曲家腦海中的音律必須與樂(lè)器和表演者的技巧相吻合。
作為一個(gè)編程工具,Julia 之于科學(xué)家也是一樣。它能擴(kuò)展科學(xué)家在有限時(shí)間內(nèi)能夠完成的任務(wù),幫助其實(shí)現(xiàn)未曾想象過(guò)的想法。
參考來(lái)源:
The unreasonable effectiveness of the Julia programming language
總結(jié)
以上是生活随笔為你收集整理的python语言的重要性_【一点资讯】这个可能打败Python的编程语言,正在征服科学界 www.yidianzixun.com...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python调用math函数_Pytho
- 下一篇: python 装饰器有哪些_python