新風向標:學術界開始從Python轉向Rust

導讀:Rust現在已經越來越受到科學家們的歡迎了,比起Python,Rust有著更高效的性能,同時在社區建設方面也讓用戶體驗更舒服。雖然學習難度大了些,但綜合下來,越來越多的科學家認為時間花的值。

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 ”來指定一個輸入文件

•使用“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 說。“它的社區建設太棒了。”

原文鏈接:

https://www.nature.com/articles/d41586-020-03382-2

延伸閱讀:

Rust首次進入TIOBE Index前20:排名前五的是C、Java、Python、C++和C#-InfoQ

性能提升25倍:Rust有望取代C和C++,成為機器學習首選Python后端-InfoQ

關注我并轉發此篇文章,私信我“領取資料”,即可免費獲得InfoQ價值4999元迷你書,點擊文末「了解更多」,即可移步InfoQ官網,獲取最新資訊~

5 条回复 A文章作者 M管理員
  1. 我TM才剛開始學python

  2. 中文是世界最好的語言,中文編程也一樣

  3. Python轉為Rust

  4. php是世界最好的語言[我想靜靜]

  5. 有這精力多整些華為鴻蒙系統用的東西吧。比從頭學一門工作上不怎么用到的語言,關鍵是全英文,連蒙帶猜學習難度加大。