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