学术界开始从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 <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 的“外部函数接口”来弥补这一差距。

新风向标:学术界开始从Python转向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 说。“它的社区建设太棒了。”