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