当今世界科技发展日新月异,Rust 1.0 版本发布至今已有五年时光!在这五年中,Rust改变了许多,凭借自身的优势,Rust 也连续四年成为开发者最受欢迎的编程语言。目前,也有越来越多的项目及企业开始选择使用 Rust 作为其应用及工具开发语言。
如今在 Rust 发行五周年之际,Rust 核心团队回顾了过去五年间,Rust 的发展历程,在其每个版本的更新迭代中,我们或许能明白 Rust 流行的真正原因。
作者 | Rust核心团队
译者 | 弯月,责编 | 屠敏
头图 | CSDN 下载自东方 IC
出品 | CSDN(ID:CSDNnews)
Rust是一个通用的编程语言,任何人都可以使用它构建可靠、高效的软件。Rust适用于技术栈的任何地方,不论是操作系统内核,还是Web应用程序。它完全是由一个开放、多样化的社区构建的 ,多亏了志愿者们贡献出宝贵的个人时间和专业技能,Rust才有了今天的发展。
1.0版以来的主要变化
2015年
1.2 - 并行代码生成:Rust的每次发布,编译时间都会有很大提升。很难想象,曾经有一段时间,Rust还没有提供并行代码生成功能。
1.3 - Rustonomicon:《Rustonomicon》的第一版发行。这本书总结了一些不安全的Rust用法。这本书以及相关资源成为了人们学习以及理解Rust语言最难懂部分的最佳资源。
1.4 - Windows MSVC Tier 1支持:第一个Tier 1平台提升,通过Microsoft Visual C++工具链(MSVC)带来了对64位Windows的原生支持。在1.4之前,你必须同时安装MinGW(一个第三方的GNU环境)才能编译并使用Rust程序。Rust的Windows支持是过去五年的一项巨大进步。最近,微软公布了他们的WinRT API准备正式支持Rust!现在,构建跨平台的高质量原生代码已经非常容易了。
1.5 - Cargo Install:在cargo已有的插件支持之外,能够构建Rust二进制文件,这个功能打造了一个完整的生态系统,里面包含了大量社区喜爱并且每天都使用的应用程序、工具和开发工具等。cargo的许多命令最初都是社区构建并在crates.io上分享的插件!
2016年
1.6 - Libcore:libcore是标准库的一个子集,它仅包括那些不需要内存分配或操作系统级别功能的API。libcore非常稳定,因此Rust的编译不需要再耗费大量资源或依赖于操作系统,这是Rust朝着嵌入式系统开发迈进的一大步。
1.10 - C ABI动态库:cdylib类型允许Rust编译成C动态库,这样人们就可以将Rust项目嵌入到任何支持C ABI的系统中。已有一些成功的Rust案例,如用Rust编写系统中关键的一小部分,然后无缝集成到整体代码中,这种实现已经非常容易。
1.12 - Cargo工作空间:现在工作空间可以组织多个Rust项目,并共享同一个lockfile。在构建大型、多crate的项目时,工作空间是无价之宝。
1.13 - Try运算符:增加的第一个语法就是 ? ,或者叫做“try”运算符。该运算符可以很容易地将错误从调用栈中向上传递。之前必须使用try!宏,需要在每次遇到结果时将整个表达式都包裹起来。而现在可以方便地使用 ? 来串联方法。
try!(try!(expression).method()); // Old
expression?.method()?; // New
1.14 - Rustup 1.0:Rustup是Rust的工具链管理器,可以让你无缝地使用任何Rust版本,或者使用它的任何工具。最初这个工具只是一个shell脚本,后来被维护者称为“奇美拉”。能够在五年期就提供 一个跨Linux、macOS、Windows和各种目标平台上的编译器,真是一个奇迹。
2017年
1.15 - 继承过程式宏(Derive Procedural Macros):继承过程式宏可以建立强大且可扩展的有类型的API,而无需编写样板代码。这个版本的Rust首次能够使用serde、diesel等库的宏。
1.17 - Rustbuild:这是我们的贡献者为Rust做出的最大改进之一,将最初基于make的构建系统改成了使用cargo。从那以后,rust - lang/rust降低了新成员构建的门槛以及为项目做贡献的难度。
1.20 - 关联常量:以前,常量只能关联到模块上。从1.20开始,我们开始稳定地支持将常量关联至结构体、枚举,最重要的是还能关联到trait上。从那以后,我们可以很轻松地给API的类型增加丰富的预设值,比如常见的IP地址,或关心的数字等。
2018年
1.24 - 增量式编译:在1.24之前,修改代码库后,rustc会编译全部代码。现在rustc变得非常聪明,会尽可能使用缓存来生成需要的东西。
1.26 - impl Trait:新增的impl Trait支持含义丰富的动态API,还能提供静态分发的好处和性能。
1.28 - 全局分配器:之前你只能使用rust提供的分配器。有了全局分配器API,现在你可以使用自定义的分配器来实现自己的需求。这是实现alloc库的重要一步,alloc库是标注库的另一个子集,它仅包含需要分配器的部分,如Vec或String。现在我们可以更方便地在多种系统上使用更多标准库了。
1.31 - 2018版:2018版的发布是自1.0以来最大的一次版本发布,其中增加了许多语法的变化与改进,同时完全维持了Rust的向后兼容,可以让各种不同版本的库无缝协同工作。
-
非词法生命周期:这是对Rust borrow checker的一个巨大改进,可以接受更多可验证的安全代码。
-
模块系统改进:针对模块的定义和使用方式进行的巨大UX改进。
-
常量函数:常量函数可以在编译时运行和计算Rust代码。
-
Rustfmt 1.0:专门为Rust打造的专用代码格式化工具。
-
Clippy 1.0:用于捕捉常见错误的Rust linter。Clippy可以很轻松地确保代码的安全性和正确性。
-
Rustfix:由于有许多语法改变,我们希望提供一个工具,可以很容易地进行代码转换。有了这个工具,只需要执行cargo fix就可以解决语法改动的问题。
2019年
1.34 - 自定义Crate仓库:随着Rust越来越多地在生产环境中应用,在非公共领域运行项目的需求也越来越大。尽管cargo允许依赖于异地的git代码仓库,但有了自定义Crate仓库,各个公司就可以很轻松地构建并共享自己的仓库,用于自己的项目中,就跟crates.io一样。
1.39 - Async/Await:async/await关键字可用于处理Future,这是Rust开始支持异步编程的一个重要里程碑。在Rust发布异步编程后仅仅六个月内就催生了各种各样高性能的生态系统。
2020年
1.42 - subslice模式:尽管不是最大的改动,但 ..(其余)模式的添加能够极大地提高代码在带有slice的模式匹配方面的表达性。
错误诊断
我们没有提过过多的一点就是Rust的错误信息和诊断从1.0开始就在不断改进。现在看看最初的错误信息,就像是看着一个完全不同的语言一样。
下面的几个例子展示了错误信息的改进,以及这些改进对于用户理解错误和修复错误的重要性。
第一个例子(Traits)
use std::io::Write;
fn trait_obj(w: &Write) {
generic(w);
}
fn generic<W: Write>(_w: &W) {}
1.2.0的错误信息
1.43.0的错误信息
第二个例子(help)
fn main() {
let s = "".to_owned();
println!("{:?}", s.find("".to_owned()));
}
1.2.0错误信息
1.43.0错误信息
第三个例子(borrow checker)
fn main() {
let mut x = 7;
let y = &mut x;
println!("{} {}", x, y);
}
1.2.0错误信息
1.43.0错误信息
来自开发团队的心声
当然,我们无法在本文中一一列举出我们做的所有改动。所以我们采访了一些团队成员,听听他们最引以为豪的工作:
“
rustdoc最重要的改动是:
-
为blanket implementation自动生成文档
-
搜索功能机器优化(最新的优化为转换为JSON)
-
能够检测出更精确的文档代码块“compile_fail, should_panic, allow_fail”
-
现在文档测试生成为独立的二进制文件
——Guillaume Gomez (负责rustdoc)
“
如今Rust支持基准的IDE了!大多数用户都认为自己在Intellij Rust、RLS和rust-analyzer之间取舍“不是那么糟糕”。五年前,编写Rust代码时需要使用古老的Vim/Emacs。
——Aleksey Kladov (IDE和编辑器)
“
我认为最重要的是,支持流行的嵌入式架构并建立了一个生态系统,从此使用Rust进行微控制器开发的难度大大降低,而且非常安全,还很有趣。
——Daniel Egger(嵌入式工作组)
“
发布团队在2018年前期才成立,但即使在当时,我们已经在rust-lang/rust下提交了将近4万个提交,而且稳定版中没有出现任何问题。
考虑到我们的编辑器和标准库的改进速度,我认为做到这一点非常不容易(当然,发布团队并不是唯一的贡献者)。总的来说,我认为发布团队的工作非常了不起,能够管理如此大规模的问题跟踪系统和提交的PR等。
——Mark Rousskov (发布)
“
我们仅用了三年时间就成功地将Miri从一个实验性质的解释器发展成了一个实用工具,可以在真正的代码中浏览语言的设计并寻找bug,这是编程语言理论和实践的完美结合。理论方面,我们使用了stacked borrows,这是Rust aliasing model目前为止最具体的提案。实践方面,最初我们只使用Miri检查少数几个关键的库,但最近我们发现,许多人开始使用Miri在他们自己的crate和依赖中寻找bug,还有同样多的贡献者在改进Miri,如添加文件系统支持、unwinding和并发支持等。
——Ralf Jung (Miri)
“
如果必须选择一个我最引以为豪的,那就是非词法生命周期(NLL)。原因不仅是它为Rust的可用性带来了巨大改善,而且它是通过建立了NLL工作组实现的。这个工作组带来了许多优秀的贡献者,许多人至今依然在为编译器工作。开源是最棒的!
——Niko Matsakis (语言)
社区
在过去的五年中,该语言发生了很多变化,同时社区也出现了很多改变。用Rust编写的优秀项目层出不穷,Rust在生产环境中的出镜率也呈指数级增长。我们想分享一些Rust成长的统计数据。
-
自Rust发布1.0版本后,已连续四年在Stack Overflow开发者调查问卷上被评为“最受欢迎的编程语言”。
-
仅今年一年,各个版本的编译器、工具和文档的下载流量加起来就超过了2.25PB(1PB = 1000TB)!
-
同时,crates.io上crates的下载量已有170TB,下载次数18亿,与去年相比月流量比增长了一倍!
Rust 1.0发布的时候,使用Rust的公司屈指可数。如今,数百家科技公司在使用Rust,其中还包括一些世界顶级的大公司,比如苹果、亚马逊、Dropbox、Facebook、Google和微软,他们出于性能、可靠性和生产力的原因选择了Rust。
总结
最后,感谢所有为Rust做出贡献的人,不论你贡献了一个新的功能,还是仅改正了一个拼写错误,你的付出为Rust的发展奠定了基础。我们迫不及待地想看看Rust及其社区的成长和改变,同时对未来十年Rust的发展充满了期待!
原文:https://blog.rust-lang.org/2020/05/15/five-years-of-rust.html
本文为 CSDN 翻译,转载请注明来源出处。
【END】
更多精彩推荐
☞雷军:4G 手机已清仓,全力转 5G;QQ音乐播放中途插语音广告引热议;Wine 5.9 发布 | 极客头条
☞中国 AI 应用元年来了!
☞新基建东风下,开发者这样抓住工业互联网风口!
☞15 岁黑进系统,发挑衅邮件意外获 Offer,不惑之年捐出全部财产,Twitter CEO 太牛了!
☞避坑!使用 Kubernetes 最易犯的 10 个错误
☞必读!53个Python经典面试题详解
☞赠书 | 1月以来 Tether 增发47亿 USDT,美元都去哪儿了?
你点的每个“在看”,我都认真当成了喜欢