Julia是個靈活動態的語言,最初針對數值計算而發明,項目起初是MIT的研究課題,現已發展成富有活力的軟件系統,也是目前最受關注的編程語言之一。日前,Julia的四位發明者Jeff Bezanson、Stefan Karpinski、Viral B. Shah、Alan Edelman接受了《程序員》雜志的專訪。
讓高性能科學計算為人人所用
《程序員》:你們因何設計Julia?想要解決的問題或達成的目標是什么?
Alan:對我來說,首要的問題是讓高性能科學計算能為世界上的每一個人所用。我時時想著這一目標尚未完全實現,但Julia的出現使問題的解決成為可能。
我對并行計算的興趣始于1988–1989年間在Thinking Machines工作時,Thinking Machines的產品是新潮的Connection Machine。2003年12月,Viral跟Parry Husbands等人一起憑借我們的Star-P并行MATLAB軟件在MIT創業大賽中獲勝。受此鼓舞,我創立了Interactive Supercomputing公司,從2004到2009年,公司做得風生水起。
在ISC,Parry、Viral和我認識到,通過一種慢速的動態專有語言來實現快速的并行化是荒唐的。Jeff也是ISC的員工,在這個問題上也有自己的獨到見解。我真心希望看到這個問題的解決方案。
我永遠不會忘記,那是2009年3月,我們要在辦公樓的停車場上拍最后的團隊合影,拍照花了很長時間,晚些時候Jeff和我就在停車場里走了走,在那里我們商定了Jeff來MIT做這個方案。
Jeff:科學計算語言中你所看到的特性通常都很復雜。多數系統中這些特性都是“內置魔術”——通過編譯器和解釋器內部的客戶邏輯來實現,難于修改或擴展。我想看到一種更加全面的、可擴展的方法來實現這類功能。
Viral:我一直對科學計算感興趣,這也是我的博士研究方向。我和Alan Edelman,以及我的導師John Gilbert一道,致力于構造一套并行的MATLAB。當時我同一些數學家、物理學家、化學家和生態學家一起負責幾個科學應用,將他們的程序并行化以提高性能。在此過程中,有一件事變得清晰起來,那就是問題不在于并行化,而在于現有的語言根本沒有足夠的表達力。這些語言的設計使之難于實現高性能。很多這樣的語言都由一些非計算機科學家設計,他們腦子里想的多是生產率而不是編譯器設計。Julia團隊的獨特之處在于,我們四個人組合了多種學科——語言設計、數學和工程。結果我們便擁有了一種不僅為科學家和工程師喜歡,也為計算機科學家喜歡的語言;在我看來這是罕有的事情,對此我們都倍感幸運。
Stefan:讀研時我真正想做的是程序語言設計,結果卻進了網絡研究實驗室。到離開UCSB之前,我在用線性代數、機器學習和數據統計做網絡流量的分析與建模。這需要一種弗蘭肯斯坦式的編程語言組合:用于網絡跟蹤處理的C,準備數據的SQL,線程代數和機器學習的MATLAB,統計分析和視覺化的R,然后Ruby管理這一切。我的時間更多花在了查找問題,而不是做有用的工作上。
Viral和我在同一部門,常年一起玩“終級飛盤”。有一天我扔著盤片發泄著心中不快:這類工作的工具真是一團糟糕。Viral對我說:“我認識一個人,你可以跟他聊聊。”第二天他就通過Email把我介紹給了Jeff。我們便開始討論用于數據分析的理想編程系統應該是怎樣的。后來我們決定著手做點什么——以三個月為限,屆時我們將決定是否繼續。我完成了第一次git提交,搭好了服務器,并為Jeff和Viral開放了權限。Jeff提交了一個語法分析器,以及隨后一個簡單的解釋器,Viral開始用新的語言寫些代碼。起初錯誤不斷,速度也奇慢——但我們已可以用它做些事情,玩一玩語言的語法和語義。三個月來了又去了,我們完全沒有停下的想法。
就在那無人察覺的三個月期限前后,Alan開始為MIT的Jeff提供資金支持。那時我們已把項目命名為Julia了。如今我們在MIT有一個完整的研究小組專注于基于Julia的高效率、高性能并行計算。
《程序員》:Julia這個名字有典故嗎?
Alan:許多人問過這個問題。事實證明這個名字很棒,部分是因為每個人都有自己的解讀理論。
Jeff: 給語言起名字著實不易。很高興我們能有一個好聽又好記的名字。
Stefan:坊間傳言那是我的中名。對這一說法,我不能確認也不能否認。
《程序員》:能否介紹一下你們的背景?之前有語言設計方面的經驗嗎?
Jeff:語言本來是我主要的業余愛好。業余時間我便做一些語言設計和解釋器方面的工作。我從互聯網上了解到了Interactive Supercomputing公司,我意識到如果能去那兒工作,就可能獲得少有的專業的程序語言方面的工作機會,于是便投了簡歷。我在那里大多數時間都在做一種針對.NET平臺的編譯器。
Viral:我從讀博時就認識Alan,那時我們在加州大學Santa Barbara分校,與MIT的團隊合作研發Star-P。畢業后我到Interactive Supercomputing公司工作,在那里認識了Jeff。不久后微軟買走了這家初創公司,我們便琢磨接下來該做什么。
Stefan:我依然清晰地記得假期里造訪瑞典親人的家,在海灘上閱讀《Programming Language Pragmatics》(中譯本《程序設計語言——實踐之路》),并因此被表弟溫言揶揄的情形。不過我后來沒有去做編譯器,而是無意中走入了之后稱為“數據科學”的領域。那時我正好有一堆數據,想搞清楚數據背后的含義。然而,作為一名數據科學家,我始終關注著語言設計方面。對我來說,編程語言絕不只是可以替換的工具。我相信更好的語言能讓我們成為更好的程序員,使我們能解決更困難的問題。
《程序員》:談到Julia時,很多文章開篇就會提起它的性能。科學計算語言的性能是一種不可替代的優勢嗎?
Stefan:對很多人來說,Julia的性能是一個大賣點。但不是說性能打倒一切,否則我們都去手工編寫SIMD和GPU代碼了。
Jeff:性能分兩類:嘗試一種方案時首次獲得的性能和大量努力后獲得的性能。我相信前者更為重要,且只要專注于前者,就算不能取得最佳的絕對性能,方案也能有效。
Viral:我來分享我做過的另一個開源項目——Circuitscape中的一個故事吧。我和同事Brad McRae開始時可以在10分鐘內解決一個100結點的問題。如今,Circuitscape用戶每天都能在幾分鐘內解決擁有數百萬結點的問題。我們組合使用了更好的語言、更好的庫以及更好的算法,達成了這一結果。現在的Circuitscape是用Python寫的,我們正在試驗通過用Julia重寫來實達到更高規模的可能性。性能不是唯一考量,但對于一種科學計算語言,它肯定是最重要的方面之一。
《程序員》:除了高性能,Julia還有哪些與眾不同的特性?
Jeff:Julia基于多分派(multiple dispatch)。這是一種強大的面向對象編程機制,以前其他語言也用過,但出于某些原因從未真正流行起來。我們設計的多分派旨在定義具有多種形式和行為的數學函數,事實證明它也能用于其他情形。它在“你能表達什么”和“編譯器能用它做什么”之間達到了很好的平衡。
Viral:對我來說,Julia最好的方面不是某種語言特性,而是我們終于有了一個平臺,在這里來自計算機科學、物理科學、社會科學以及數學領域的專家正在走到一起,創造從未有過的神奇。而這些原來不相往來的社區之間的合作在科學計算方面釋放了新的可能性。
《程序員》:目前Julia最適合哪些場景的應用?
Jeff:Julia是真正的通用語言。總體上,我認為要改善一種語言就要使之更通用,而不是更適于某一種任務。但目前Julia最佳的應用案例是探索性計算(exploratory computing):試驗不同的算法或嘗試理解數據。模擬也是一個大用例:簡潔地描述一套系統,同時獲得盡量高的性能。目前,人們也在使用Julia開發GUI應用和小型的Web應用,但我們并沒真正針對這種應用而設計。
Viral:Julia足以勝任的領域之一是教育。下一代學生可以直接跨過現有的技術。IJulia圖形化的Notebook集成(運行Julia的IPython Notebook)使之對于教學極具魅力。研究者、算法開發者和庫作者也在采用Julia,因為Julia使工作更高效。
當舊思想的精華融入新思想
《程序員》:在開發過程中,哪一部分投入的精力最多?現在最大的挑戰是什么?
Jeff:越來越多的時間都花在考慮設計決定,以及為需要完成的工作排優先級上面了。 我們現在面臨的一大挑戰是隨著可用包越來越多、越來越大,用戶也需要將越來越多的代碼加載到他們的環境中。Julia是設計成即時編譯的,在運行時編譯這么多代碼已經開始影響速度了。我們正在尋求解決方案,情況應該很快會有改觀。
Viral:設計良好的API需要相當長的時間。盡管Julia已很快,但我們還需要使它更快,而且更好地并行工作。關于哪些功能留在Base庫中,哪些進入包中的決定也很艱難,因為像Julia這樣的語言往往擁有很大的科學計算庫作為基礎庫發布。盡管Julia已是一種可以隨時安裝的相對方便的科學計算工具,我們還需要在Julia及其生態包的安裝方面做更多簡化。
《程序員》:在Julia的設計過程中,你們遵循哪些原則?
Jeff:我們經常引用的一條原則是“做性能開銷不大的最有價值的事”。我們愿意犧牲一些性能來換取更可靠、更易編寫的程序,但也有限度。性能降低2倍?可以。10倍?不行。過去,這方面做了很多錯誤的妥協——例如,C和C++為了在這兒那兒省下一條指令,不惜為用戶帶來大量問題。
Viral: 我們始終考慮編程的便捷。讓語言成為動態的很重要,但也要有些限制,從而類型推導可以起作用。這樣就可能產生快速的代碼,而不致麻煩用戶聲明所用的每個變量的類型。用戶開心了,編譯器的作者也開心了。
《程序員》:Julia的核心開發者和用戶分別有多少?社區如何運作?
Jeff:我們的開發都通過GitHub進行,現在上面的代碼貢獻者有200名左右,穩定的、高度活躍的貢獻者約有30名。我們在GitHub的issues和pull requests,以及郵件列表上都有大量討論。我們喜歡聽到大量觀點,并在決策之前達成一致。
Viral:我聽說過一種度量方法,社區的規模是郵件列表規模的10倍,基于此,估計Julia至少有10000名用戶。我們努力打造一個尊重不同意見、同時為新用戶提供方便的社區。這樣才能吸引其他人,并使我們的工作有趣。
《程序員》:用Julia寫的項目中,哪一個讓你們覺得印象最深刻?
Jeff:繪圖包Gadfly讓人感覺很棒。還有JuMP,把描述優化問題的語言嵌入一種通用的語言中,這是最好的例子之一。它可以匹敵專用語言的性能。
IJulia也是精華。它提供了一個基于IPython Notebook的Web瀏覽器前端,是通過終端與機算機交互的最佳方式。
我特別喜歡的還有Quake 2渲染引擎(https://github.com/jayschwa/Quake2.jl)。
Viral:Julia的統計計算能力最棒,此類程序幾乎完全用Julia寫成,并將Julia引到一個出乎原有規劃的方向上。當我們看到來自R社區的人們能將他們想要的功能開發成一個純粹的包,而不需要任何語言上的修改,我們就知道語言的設計是正確的。
《程序員》:Julia足夠穩定能用于生產環境了嗎?
Alan:是的——我每天早飯前都運行蒙特卡洛模擬,通常是在60個核上。
Jeff: 盡管我們未能提供想要的所有特性,人們有時還會驚詫于一切在整體上竟運行得如此平穩。
Viral: 這取決于“生產”的含義。Julia是極好的教學工具,MIT及其他大學的許多課程已經在用它了。研究者也在工作中每天使用。如果“生產”指的是有企業支持的大型服務器上長期運行的任務,那么答案是否定的。
《程序員》:在整個開發和設計過程中,有沒有想和其他開發者分享的體會?
Jeff:最初人們對新的編程語言往往持懷疑態度,這很正常。但事實證明,只要做出讓幾個早期的采用者覺得足夠有趣的東西,你便能獲得助力。
Viral:起初我也懷疑是否真正需要一種新的編程語言,是否所有的東西都不需要。但我已經學會擁抱新的語言(更多地來自科學計算背景的),這種多樣性和試驗過程都是好事。世界就是這樣進步的,讓舊思想的精華融入新思想。
《程序員》:有沒有來自用戶的意外收獲或反饋?
Alan: 我每天清晨起來看到Julia中新加的東西都要吃上一驚。
Jeff:聽說Julia被用于前沿的研究項目時我著實高興了一把。少數研究團體讓他們的實驗室轉變為使用Julia為主。哪怕有人只是嘗試用Julia做一個真正有趣的應用,也讓人興奮。
《程序員》:對于初學者來說,學習Julia最困難的部分是什么?Julia中有哪些常見的陷阱?
Jeff:我們努力避免陷阱。我想可能出現的一個陷阱是全局和局部變量非常不同。全局變量更像字典,可以通過名字查詢,也可以四處修改它。局部變量則完全不同,因為在很多情形中它們會被編譯器完全優化掉。
Viral:最常見的陷阱在于有時人們期望Julia是MATLAB的零成本替代品。實際上它們有很多語法差異,有時它會絆倒一個有著多年MATLAB背景的用戶。當然,一些舊的習慣并不容易忘掉。
《程序員》:與其他科學計算語言(例如Mathematica、MATLAB等)相比,Julia的劣勢是什么?
Alan:在MIT,我們發現學生和年輕人樂于擁抱Julia,而有經驗的教職員則跟進得慢一些。
Jeff:許多情況下,庫比語言更重要。有許多對特定應用非常重要的庫函數我們還沒有提供。幸運的是調用C甚至Python很容易。
Viral:我們需要一個調試器。我們需要一個更加用戶友好的性能分析工具。我們需要更多的庫。我們需要更多用戶。
《程序員》:你們有沒有從科學計算語言的演化中看到一些趨勢?從你們的角度來看,什么才是理想的科學計算語言(或系統)?
Alan:我相信Julia解放了科學計算,并將繼續如此。 我觀察過專家們通常用FORTRAN寫的算法,感受則是人們不能碰這些算法。修改的難度注定了這一點,且主要從心理上。在一個人人可以調整算法進行試驗的世界中,新創造將自由流淌。這是我最想看到的。
Jeff:長期以來我們看到語言系統中不斷增強的運行時靈活性。漸漸地,人們擁抱了動態內存分配、動態連接,然后是動態分派(如OOP)、垃圾回收和即時編譯。
Viral:我們的博客文章“為什么選擇Julia”說的正是這個問題。除此以外,編程語言實驗中還有一個有效使用多核和GPU的趨勢。