原文作者:Jeffrey M. Perkel
研究者常常面臨著使用一種編程語言來寫代碼,之后再用一種更快的語言重寫的窘境。一種新的編程語言可以解決這個(gè)難題。
在做氣象建模的時(shí)候,每秒的計(jì)算時(shí)間都很重要。這些模型中需要考慮到空氣、土地、太陽和海洋,以及它們之間復(fù)雜的物理聯(lián)系。一個(gè)模型可能會(huì)有數(shù)百萬行代碼,在世界上最強(qiáng)大的計(jì)算機(jī)上執(zhí)行。因此,氣候建模聯(lián)盟(CliMA)——美國的一批科學(xué)家、工程師和數(shù)學(xué)家組成的聯(lián)盟——的氣候?qū)W家在從零開始為模型寫代碼的時(shí)候,就選擇了一種能滿足他們需求的語言:Julia。
Julia于2012年發(fā)布。這是一種開源的語言,將腳本語言(例如Python,Matlab和R)的交互性和語法與編譯語言(例如Fortran和C)的速度結(jié)合到了一起。
在氣候科學(xué)家里,通用語是Fortran:快速,但是——由于它的歷史可以追溯到1950年——并不是很吸引人。美國海軍研究生院的數(shù)學(xué)家,也是CliMA的主管之一Frank Giraldo說:“很多人聽到Fortran的時(shí)候就一臉‘天啊,我可不想寫那玩意兒’的表情?!蹦贻p的程序員更喜歡那些可以使用最時(shí)髦的軟硬件設(shè)計(jì)模式的編程語言,他說,而自從使用了Julia,他看到大家的興趣越來越濃。“有些人是真的對(duì)氣候模型感興趣,其他人的興趣則在用Julia做大規(guī)模應(yīng)用上?!彼f。
正在加州理工大學(xué)學(xué)習(xí)材料科學(xué)的Jane Herriman說,自從她用Julia重寫了自己的Python程序之后,運(yùn)算速度提升了十倍。墨爾本大學(xué)的系統(tǒng)生物學(xué)家,自稱“Julia傳教士”的Michael Stumpf將R語言的模型以Julia重寫,運(yùn)算速度提升了800倍。“以前要跑好幾周甚至幾個(gè)月,現(xiàn)在一小時(shí)就跑完了。”他說。
性能的大幅提升,加上Julia親民的語法和解決“語言轉(zhuǎn)換”問題的承諾(研究者們通常需要用Python這類用戶友好的語言寫代碼原型,之后再用一種更快的語言重寫),讓這種編程語言名聲鵲起,特別是在計(jì)算量較高的領(lǐng)域里。除了氣候模型之外,人工智能、金融和生物信息這些學(xué)科也開始改用了它。
根據(jù)麻省理工學(xué)院的計(jì)算機(jī)科學(xué)家,也是Julia的創(chuàng)始人之一Alan Edelman的說法,Julia至今已經(jīng)有900萬下載量了。一份數(shù)據(jù)顯示,它已經(jīng)進(jìn)入了全世界最流行的編程語言前50名。雖然還是較為小眾——2019年Julia排行第50,而Python是第3——但它有著熱情的用戶群體。
“大家對(duì)重寫代碼已經(jīng)厭煩了?!盓delman說,“需要寫不明所以的代碼很煩,別人或是研究生或是同事寫完代碼就換工作留下一大堆不知道該怎么處理的代碼很煩。正是這些人改用了Julia——他們想要性能、可移植性和靈活性?!?/p>
兩全其美
Julia——它和Python、R一起構(gòu)成了數(shù)據(jù)科學(xué)家們所喜愛的交互式計(jì)算文檔系統(tǒng)“Jupyter”——本質(zhì)上是一種披著腳本語言皮的編譯語言。在Python這樣的腳本語言中,用戶往一個(gè)可交互的編輯器里面一行一行敲代碼,然后就會(huì)直接解釋執(zhí)行,并立刻返回結(jié)果。在C和Fortran這樣的語言里,代碼必須先編譯成為機(jī)器可讀的指令,然后才能執(zhí)行。前者更容易使用,而后者的代碼執(zhí)行速度更快。因此,如果執(zhí)行速度比較重要的話,程序員就常常需要先用腳本語言開發(fā)算法,再翻譯成C或者Fortran。這種流程相當(dāng)繁瑣,且容易出錯(cuò)。
Julia避免了這個(gè)“語言轉(zhuǎn)換”問題,因?yàn)樗鼒?zhí)行原理和C類似,而語法則和Python類似。它還包含了一些內(nèi)建特性,用來加速對(duì)計(jì)算量要求較高的問題,例如分布式計(jì)算(即允許程序員將困難的問題分拆到多個(gè)處理器或計(jì)算機(jī)來解決的功能)。倘若沒有Julia,這可能需要用多種語言才能寫成。馬里蘭大學(xué)的量化臨床藥學(xué)家Vijay Ivaturi用Julia寫了一個(gè)工具,用來輔助自己決定藥品劑量。他之前所使用的語言Fortran則必須使用好幾種輔助工具?!拔覑凵狭薐ulia的速度,”他說,“但最重要的是,我覺得我愛上的是不需要換幾種語言就能干完活:從頭到尾,我只需要一個(gè)開發(fā)環(huán)境就行了?!?/p>
用戶在Julia里寫代碼通常會(huì)使用REPL(讀取-求值-輸出循環(huán))界面。這是一個(gè)交互性的文字界面,讀取輸入,求值,然后將結(jié)果輸出給用戶。(也可以使用標(biāo)準(zhǔn)的編程用文字編輯器,或是Jupyter Notebook。)在表面上,Julia和Python是完全一樣的:輸入一行命令,看到結(jié)果。但是在背景里,語句經(jīng)過了編譯。因此,第一次寫下一個(gè)函數(shù)的時(shí)候,運(yùn)行起來可能會(huì)慢,但是接下來再運(yùn)行就快了。一旦代碼能夠正確運(yùn)行之后,用戶就可以進(jìn)一步優(yōu)化它(見“開始使用”)。
開始使用
根據(jù)Giraldo的說法,CliMA為他們的項(xiàng)目選擇Julia的一個(gè)理由是一次圣誕節(jié)的編程競(jìng)賽上Julia的出色表現(xiàn)。當(dāng)時(shí)Julia與C和Fortran正面對(duì)決,Giraldo作為小白鼠上場(chǎng)了——當(dāng)時(shí)他還是Julia新手?!爸苯佑肑ulia寫出來的代碼就只比高度優(yōu)化過的Fortran代碼慢幾個(gè)百分點(diǎn)?!?/p>
而且更加可讀,他補(bǔ)充說。由于Julia有著多重派發(fā)(允許不同函數(shù)使用相同的函數(shù)名)和元編程(允許程序修改自身)等特性,因此十分簡(jiǎn)潔。Julia還支持Unicode符號(hào),因此程序員可以使用希臘字母做變量名,而不一定必須使用拉丁字母轉(zhuǎn)寫。也就是說,他們可以寫出和論文里的數(shù)學(xué)公式一樣的代碼,例如計(jì)算圓周率時(shí)使用C?=?2*π*r而不是C?=?2*pi*r?!澳憧梢园涯X子里想到的東西直接寫下來?!盓delman說,“最好是讓機(jī)器遷就你,而不是你遷就機(jī)器?!?/p>
更快、更強(qiáng)、更簡(jiǎn)單
對(duì)羅德島婦女嬰兒醫(yī)院的臨床研究助理George Tollefson來說,Julia對(duì)用戶友好和計(jì)算效率的兼重讓它成為了編寫大型基因組數(shù)據(jù)集的數(shù)據(jù)界面的理想語言。“Julia最開始就很有吸引力,因?yàn)樗挚煊謴?qiáng)大?!彼f,“但是寫起來卻十分簡(jiǎn)單?!倍宜€有一個(gè)樂于助人的社群,Tollefson補(bǔ)充道。因?yàn)檫@種語言的用戶群體比較小,因此想要在網(wǎng)上找到答案可能會(huì)有困難。但是Slack、Discourse和Github上的開發(fā)者社群可以彌補(bǔ)這個(gè)缺憾?!坝袝r(shí)我們發(fā)現(xiàn)別人沒有遇到過[和我們一樣的]問題,但是他們半小時(shí)內(nèi)就能幫我們解決?!盨tumpf說。
但是,用戶群小也意味著擴(kuò)展包比較少——擴(kuò)展包是程序員在新的領(lǐng)域使用一門語言時(shí)所使用的外部代碼庫。Edelman說,Julia的生態(tài)系統(tǒng)有不到2600個(gè)擴(kuò)展包,其中包括Flux(機(jī)器學(xué)習(xí)),BioJulia(DNA測(cè)序分析)、DifferentialEquations(計(jì)算模擬)和JuMP(數(shù)學(xué)建模)。相比而言,CRAN R語言庫有超過14000個(gè)擴(kuò)展包,而Python的PyPI里有超過187000個(gè)擴(kuò)展包。
如果研究者需要一個(gè)沒有轉(zhuǎn)寫進(jìn)Julia的代碼庫,可以使用Pycall(對(duì)應(yīng)Python)或Rcall(對(duì)應(yīng)R)這樣的插件來直接使用代碼。哈佛大學(xué)計(jì)算機(jī)系研究生Lydia Krasilnikova此前在麻省理工學(xué)院讀本科的時(shí)候?qū)懥艘粋€(gè)Matlab到Julia的翻譯器,可以在網(wǎng)上找到。“很多人給我發(fā)信說這個(gè)翻譯器簡(jiǎn)化了他們轉(zhuǎn)換的過程,并允許他們?cè)贘ulia中測(cè)試代碼,然后修改原有的代碼庫。這是他們以前做不到的?!彼f。
說到底,編程語言的選擇還是要看個(gè)人偏好、項(xiàng)目需求和同事。很多情況下,任何編程語言都能用。但要是想用“高效的代碼”,Giraldo說:“那么,說實(shí)話,我現(xiàn)在覺得Julia就是最好的選項(xiàng)了。悶頭研究一下就好。其實(shí)一點(diǎn)也不難。”
?
Nature|doi: 10.1038/d41586-019-02310-3
版權(quán)聲明:
聯(lián)系客服