Python要被学术圈抛弃了?科学家们可能找到了更好的替代品

一些科学家开始使用比 Python 性能更强大的新编程语言了,它和 Python 一样能够“立等可取”,而且计算能力还更强。

本文转载自公众号“Nature Portfolio”

原文作者:Jeffrey M. Perkel

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

(0)

相关推荐