为什么科学家都开始用Rust编程了?

2021年2月17日 252点热度 0人点赞 0条评论
图片


原文作者:Jeffrey M. Perkel

虽然学习曲线很陡,但是Rust兼具速度和安全性。

2015年,生物信息学家Johannes Köster还是(用他自己的话说)“差不多全职写Python的”。他当时已经用Python写过一个备受欢迎的工具——流程管理工具Snakemake。现在,他正在准备写的项目所要求的计算能力超过了Python能提供的范围。所以他开始搜索新的工具。


现在德国杜伊斯堡-埃森大学任职的Köster正在寻找一种计算机语言,可以具备Python的“立等可取”性,同时拥有C和C++这类语言的速度。换言之,“一个高性能的语言,而且还,这么说吧,符合人类工程学。”他解释道。他找到的语言就是Rust。

图片

象征兼具速度和安全的程序员的漫画。绘画:Project Twins

Rust是2006年由Graydon Hoare在加利福尼亚州浏览器公司Mozilla工作的时候作为小项目开发的。Rust混合了C++这类语言的性能、友好的语法、对代码安全性的关注和一套精心设计的工具用以简化开发流程。Mozilla的Firefox中有一部分就是用Rust写的。据报道微软也使用Rust重写了Windows操作系统中的一部分。每年一度的Stack Overflow开发者调查已经连续五年将Rust列为“最受喜爱的”编程语言。代码共享网站GitHub说,Rust是该平台2019年增长第二快的语言,比去年增长了235%。

科学家们同样看向了Rust。例如,Köster用它写了一个叫做Varlociraptor的应用。该应用能将数百万的基因序列与几十亿种基因碱基比对,以找出基因突变。“数据量极大,”他说,“所以比对必须尽可能地快。”但是,Rust的强大是有代价的:学习曲线很陡。

“上手之前是得花些时间。”宾夕法尼亚州咨询公司Integer 32的创办者,也是Rust核心团队成员的Carol Nichols说。“但是它让我能够做一些此前无法做到的事。我认为这些时间花得值。”

警告:没有护栏

分析科学数据的工作流程通常会使用Python、R和Matlab这样的语言。这类语言会逐行解释代码并执行。该模式在探索数据的时候很有用,但是速度不会快。

C和C++很快,但是没有“安全护栏”。斯德哥尔摩的Rust程序员(他们管自己叫Rustacean,Ashley Hauck说。例如,没什么能阻止C和C++的程序员访问已经释放回系统的内存,或是把同一块内存释放两次。最好的情况下,这样做会让程序崩溃,但也有可能返回无意义的数据或是产生安全漏洞。根据微软的研究,他们公司每年修补的安全漏洞中有70%都和内存安全有关。

内存规则

Rust的模型所使用的规则将每一片内存都分配给了一个单一的所有者,并限制了谁能访问它。违反规则的代码根本不会有机会崩溃——它根本就无法编译。“他们的内存管理系统是基于这个生命周期概念的,允许编译器可以在编译的时候追踪内存何时分配,何时释放,由谁持有,谁能访问,”Rob Patro说。他是马里兰大学的一位计算生物学家。“有一整类正确性问题都可以通过语言的设计方法避免。”

这套理念还会帮助保证并行计算——使用多个处理器同时进行计算的软件——可以安全执行。例如,可以避免多个线程同时访问同一份数据的可能性。

结果是,这种语言更易于维护和调试,但是学习起来就更难了。“其他任何一种主流语言都没有这些概念,而它们是理解Rust编程方式的核心。”Nichols说。在都柏林圣三一大学研究地理数据可视化的Stephan Hügel估计,他花费了两三个月把一个将地理空间坐标转化进另一个参照系的Python算法改写成了Rust,执行速度快了4倍。加利福尼亚州的一个化学信息学软件公司Metamolecular的创办者Richard Apodaca说他为熟练使用Rust花了六个月。

聚焦易用性

为了弥补这一问题,Rust的开发者花功夫改进了用户体验,在加利福尼亚州的Rust开发者工具团队的主管Manish Goregaokar说。例如,编译器会返回特别有信息量的错误信息,甚至会将出错的代码高亮出来,并建议如何修正。“如果你的语言想要引入新的概念,那最好用起来方便一些。”Goregaokar解释道。

Rust社区还提供了详尽的文档和在线帮助,其中包括一本大受欢迎的在线详解“Book”和一份介绍如何解决常见问题的“Cookbook”。Rust工具链——程序员用来将代码转化成程序的工具——很受用户好评(见下文“大家一起氧化吧”)。“Rust的工具和架构真的很棒。”Patro说。相较于C程序员需要面对的很多种编译器和辅助应用,Rust程序员只需要一个叫做Cargo的工具就可以编译Rust代码、运行测试、自动生成文档、将代码上传到代码库中,等等。它还会自动下载并安装第三方软件包。Cargo的一个插件Clippy可以标亮常见错误和“不怎么规范”的Rust代码,Patro评价这一特性是“绝对棒”。

大家一起氧化吧

下面以创建一个读取GenBank文件的程序的步骤为例,探索Rust语言的一些功能。
• 访问www.rust-lang.org/learn/get-started安装Rust
• 从GitHub上复制代码https://github.com/jperkel/gb_read
• 在命令行中执行“cargo run”以下载外部依赖,并编译程序。程序的默认设置是读取GitHub代码库中的GenBank文件“nc_005816.gb”,但是你可以通过“cargo run <文件名>”选择读取其他文件。
• 使用“cargo test”运行代码库里面的测试。
• 使用“cargo doc --open”创建并阅读文档。

流行的开发环境中也有Rust的插件,例如微软的Visual Studio Code和JetBrains的IntelliJ。还有一个在线的Rust Playground,允许实时在线实验Rust代码。住在悉尼的David Lattimore在Jupyter计算笔记本里面创建了一个Rust的内核,以及一个类似于Python的交互式环境REPL。

Rust程序员的另外一大助力是它的第三方软件包(Rust管它叫“crate”)生态系统,目前已经有了5万多个(见下文“Rust越来越火”)。软件包封装了例如生物信息学(Kösterd的Rust-Bio)、地理科学(Geo-Rust项目)、数学(nalgebra)等学科的算法。不过,Nichols说,“要是你想要的库没有Rust版本,那就是Rust的大劣势了。”当然,程序员有时候还是可以使用Rust的“外部函数接口”来搭一座桥。

图片

来源:http://www.modulecounts.com

氧化代码

不论编程流程如何,不可否认的一点是Rust非常快。五月,马萨诸塞州Dana-Farber癌症研究所的生物信息学家Heng Li用一个计算生物学的任务测试了多种编程语言,其中需要读取570万条基因记录。Rust超越了C语言获得了第一名。“如果我们想要写一段高性能的并行计算程序,还需要速度快、占用内存少,Rust是理想的选择。”Li说。

加利福尼亚大学戴维斯分校的生物信息学家Luiz Irber使用Rust重写(用Rust界的俚语说叫“氧化”)了一个叫做Sourmash的工具——它可以进行基因搜索和分类——以让代码易于维护,使用现代的编程特性,并能在网页上使用,他说。

在团队成员Avi Srivastava从用Rust开发开源工具的加利福尼亚州生物技术公司10x Genomics实习归来之后,Patro的团队就由研究生Hirak Sarker带领,使用Rust写了一个叫做Terminus的基因表达分析工具。“Rust的美妙之处在于,它让调试非常简单,因为内存管理好太多太多了。”现在在纽约基因组中心工作的Srivastava说。

对很多Rust程序员来说,这里的“人性化”也很吸引人。LGBT+社群的成员Hauck说Rust的用户群下了功夫欢迎她。这个社群,她说,“一直以来尽力成为具有包容性的社群——例如,非常理解多元化会产生什么影响;非常理解如何编写并执行行为规范。”

“我之所以还在用Rust,这可能是很重要的原因之一。”Hauck说,“Rust的社群实在太棒了。”

原文以Why scientists are turning to Rust标题发表在 2020年12月1日的《自然》的技术特写版块上

© nature

doi: 10.1038/d41586-020-03382-2

点击阅读原文查看英文原文

自然大师课堂在线平台

现已向各个机构开放申请!

个人用户也可注册平台免费体验在线课程

www.naturemasterclassesonline.cn

图片

点击图片了解自然大师课堂在线平台更多详情

版权声明:

本文由施普林格·自然上海办公室负责翻译。中文内容仅供参考,一切内容以英文原版为准。欢迎转发至朋友圈,如需转载,请邮件[email protected]。未经授权的翻译是侵权行为,版权方将保留追究法律责任的权利。

© 2021 Springer Nature Limited. All Rights Reserved

图片

星标我们?,还要记得点赞、在看+转发哦!

36990为什么科学家都开始用Rust编程了?

这个人很懒,什么都没留下

文章评论