2015 年,德國生物信息學家約翰內斯·科斯特(Johannes Koster) 曾用 Python 編寫了一個廣受歡迎的工作流管理器 Snakemake。作為大家公認的「Python 專家」,目前他正在籌備一個新項目,該項目對性能要求較高,而他認為 Python 無法提供該項目需要的計算性能。因此,他開始尋求一種新的程式語言解決方案。
Koster 現在在德國杜伊斯堡-埃森大學工作,他對這門新語言解決方案的要求是:既要能提供 Python 的「表達能力」,也要擁有 C/C ++ 的運行效率。用他自己的話來說,它需要是「一種符合人類使用習慣,同時又具備高效性能的語言」。最終他選用的語言就是 Rust 。
Rust 最初於 2006 年由 Mozilla 工程師 Graydon Hoare 創建。Rust 融合了 C++ 語言的性能與其他高級語言優秀的語法特性,對代碼安全性問題也進行了特別的處理,Mozilla 的火狐瀏覽器有一部分就是用 Rust 編寫的,微軟也正在用它重新編碼 Windows 作業系統的部分內容。Rust 已連續 5 年在 Stack Overflow 開發者年度調查(今年調查了將近 65000 名程式設計師)中被評為 Stack Overflow 「最受歡迎的」 程式語言。GitHub 上的數據也顯示,Rust 是 2019 年平臺上增長第二快的語言,比去年同期增長了 235%。
而在科學研究界,科學家們也正在轉向使用 Rust。例如,Koster 利用 Rust 創建了一個名為 Varlociraptor 的應用程式,該程序將數百萬個基因序列讀數與數十億個遺傳鹼基進行比較,以鑑定基因組變體。「這個項目的數據量是巨大的,」他說,「所以對性能的要求極高。」不過想要獲得這樣的性能也是需要付出一定的代價的:Rust 的學習困難度較大。
「使用 Rust 確實需要一些前期的學習時間,」卡羅•尼科爾斯(Carol Nichols)說。她是 Rust 核心團隊的成員,也是位於賓夕法尼亞州匹茲堡的諮詢公司 Integer 32 的創始人。「但它能幫我做一些我不能做的事情。我認為這段時間花得很值。」
避免無規則
通常情況下,當工作流中涉及到分析科學數據時,大家都傾向於選擇使用 Python、R 和 Matlab 等語言。這些語言會逐一解釋代碼行,然後執行,這種編程風格有利於研究數據,但速度慢。
C 和 C++執行效率很高,但是他們「沒有規則」,Ashley Hauck 說,他是斯德哥爾摩的一名 Rust 程式設計師(在社區中人稱「Rustacean」)。例如,沒有任何措施可以防止 C 或 C++程式設計師錯誤地訪問已經釋放回作業系統的內存,或者避免程序兩次釋放同一塊內存。僅僅是導致程序崩潰還好,最糟糕的是,它還可能返回無意義的數據或暴露安全漏洞。據微軟的研究人員稱,該公司每年修復的漏洞中有 70%與內存安全有關。
遵守設計規則
Rust 的模型可以根據規則將每一塊內存分配給單個所有者,並強制控制訪問權限。違反這些規則的代碼也不會導致崩潰,因為它們不會被編譯到。馬裡蘭大學帕克分校的計算生物學家 Rob Patro 解釋說:「它們有一個基於生命周期概念的內存管理系統,該系統讓編譯器在編譯時跟蹤內存的分配、釋放、誰擁有它、誰可以訪問它。」「得益於語言的設計方式,大量的錯誤在編譯階段就會被消除。」
這樣的設計也有利於在多個處理器上運行軟體的安全性,比如,可以消除多個計算線程同時訪問相同數據的可能性。
Rust 比較容易維護和調試,但難於學習掌握。「其它主流語言都沒有這些概念,理解了這些概念才是真正明白如何使用 Rust 編寫代碼的真正核心。」Nichols 說。Stephan Hugel 在都柏林三一學院研究地理數據的可視化,他自己花了兩到三個月的時間移植 Python 算法,將地理空間坐標從一個參考系統轉換到另一個參考系統,從而使執行速度提高了四倍。加州拉霍亞市的化學信息軟體公司 Metamolecular 的創始人理察•阿波塔卡說,他花了大約六個月的時間才精通這門語言。
關注用戶使用體驗
「為了提高語言的影響力,Rust 開發人員著重對用戶體驗進行了優化。」Manish Goregaokar 說,他是 Rust 開發人員工具團隊的負責人,現居加州伯克利。例如,編譯器會產生信息特別豐富的錯誤消息,甚至會突出顯示出錯的代碼並給出修復建議。Goregaokar 解釋說:「既然給語言引入了一個新的功能概念,那麼使用起來就要讓人感到舒服。」
Rust 社區還提供了豐富的文檔支持和在線幫助,其中包括一個名為 The Book 的在線參考文檔和一個羅列常見問題的「Cookbook」問題列表。用戶對 Rust 的工具鏈還是比較滿意的,程式設計師可以用它來將代碼轉化為應用程式(可參考下文中的「構建 Rust 應用」)。「關於 Rust 的工具和基礎設施建設完善度確實讓人感到驚奇。」Patro 說。與程式設計師用來構建 C 代碼的許多編譯器和輔助工具不同,Rust 開發者可以使用一個叫做 Cargo 的單一工具來編譯 Rust 代碼、運行測試、自動生成文檔、上傳包到存儲庫等等,它還可以自動下載和安裝第三方軟體包。使用一個名為 Clippy 的第三方插件還可以標記常見錯誤和不建議使用的 Rust 代碼,Patro 非常喜歡該工具。
構建Rust應用
下面介紹如何創建一個GenBank文件閱讀器,以便你進一步了解Rust的特性
•從www.rust-lang.org/learn/get-started下載安裝Rus
•到https://github.com/jperkel/gb_read克隆GitHub上的代
•執行『cargo run』命令下載外部依賴項並構建應用程式。默認情況下,應用程式會解析GitHub倉庫中GenBank文件』 nc_005816.gb』。你也可以使用「cargo run <filename>」來指定一個輸入文件
•使用「cargo test」執行單元測試
•使用「cargo doc -open」創建和查看文檔。
Rust 還為常用的開發環境提供了 Rust 插件,比如微軟的Visual Studio Code和 JetBrains 的 IntelliJ,它還為Rust playground提供了一個實時的、在線的 Rust 開發環境。澳大利亞雪梨的軟體開發人員大衛拉蒂摩爾(David Lattimore)還創建了一個在 Jupyter 計算筆記本中使用 Rust 的「內核」,以及一個名為 REPL( read-evaluate-print loop)的 python 風格的交互環境。
Rust 的第三方軟體包生態系統可以輔助軟體開發,目前第三方庫數量已經接近 50,000(參見下圖「Rust rising」)。它們封裝了諸如生物信息學(Koster 『s Rust-Bio)、地球科學(the Geo-Rust project)和數學(nalgebra)等學科的算法。儘管如此,Nichols 說,「如果你需要的庫在 Rust 中沒有,那肯定就會讓人感覺不爽。」不過,程式設計師有時可以使用 Rust 的「外部函數接口」來彌補這一差距。
Rust 代碼優勢
除了編碼流程之外,更需要特別說明的是 Rust 的高效性能。今年 5 月,麻薩諸塞州波士頓市達納法伯癌症研究所(Dana-Farber Cancer Institute)的生物信息學家李衡(Heng Li)在一項計算生物學任務中測試了多種語言,該任務涉及解析 570 萬份序列記錄。Rust 超越 C,穩居榜首。「當你想要使用多線程編寫高性能程序時,如果你需要它性能非常快,同時內存也很緊湊,那麼 Rust 是理想的選擇,」李說。
加州大學戴維斯分校的生物信息學家路易斯·艾貝爾說,用 Rust 重寫了一個叫 Sourmash 的工具軟體,它的主要功能是執行基因組搜索和分類分析,改用 Rust 後可以減少軟體維護成本,使用較先進的現代語言特性,同時程序還可以通過 web 瀏覽器訪問。他說。
Patro 的團隊成員 Avi Srivastava 實習歸來後,在研究生 Hirak Sarkar 的帶領下,利用 Rust 構建了一個名為 Terminus 的基因表達分析工具,Avi Srivastava 之前在位於美國加利福尼亞州普萊森頓的一家生物技術公司 10x Genomics 實習,在那裡他使用 Rust 開發開源工具。現在在紐約基因組中心工作的 Srivastava 解釋說:「Rust 的優勢在於高效的任務調試,因為 Rust 的內存管理做的非常好。」
對於許多 Rust 開發者來說,社區氛圍因素也非常重要。Hauck 是 LGBT+社區的一員,她說 Rust 的用戶已經用他們的方式讓她感受到了熱情。她說,「這個社區一直在堅持包容性,他們非常清楚多樣性對事物的影響,非常清楚如何制定和執行行為準則。」。
「這可能是我仍然在使用 Rust 的原因,」Hauck 說。「它的社區建設太棒了。」
未經允許不得轉載:DOIT » 學術界開始從Python轉向Rust