生锈的五年

2020-05-15 20:06:40

鉴于世界上正在发生的一切,你忘了这一点是情有可原的,因为我们在2015年发布了1.0版本,现在已经过去了五年!铁锈在过去的五年里发生了很大的变化,所以我们想回顾一下自从语言稳定以来我们所有的贡献者的工作。

Rust是一种通用编程语言,它使每个人都能够构建可靠而高效的软件。Rust可以构建为在堆栈中的任何位置运行,无论是作为操作系统的内核还是作为下一个Web应用程序的内核。它完全是由一个开放和多样化的个人社区建立起来的,主要是志愿者,他们慷慨地贡献自己的时间和专业知识来帮助拉斯特取得今天的成就。

1.2-并行Codegen:编译时改进是Rust每次发布的重要主题,很难想象Rust在短时间内根本没有并行代码生成。

1.3-Rustonomicon:我们的第一版“神奇的Rustonomicon”探索了不安全的Rustonomicon及其周围主题,对于任何想要学习和理解语言中最难的方面之一的人来说,它已经成为一个很好的资源。

1.4-Windows MSVC第1层支持:第一层1平台促销活动使用Microsoft Visual C++工具链(MSVC)带来了对64位Windows的本机支持。在1.4之前,您还需要安装MinGW(第三方GNU环境)才能使用和编译Rust程序。Rust';的Windows支持是过去五年来最大的进步之一。就在最近,微软宣布了他们对WinRT API的官方Rust支持的公开预览版!现在,它比以往任何时候都更容易构建高质量的本地和跨平台应用程序。

1.5-Cargo安装:除了Cargo原有的插件支持之外,还可以构建Rust二进制文件,这催生了一个由应用程序、实用程序和开发工具组成的完整生态系统,社区开始喜爱和依赖这些应用程序、实用程序和开发工具。Cargo今天拥有的相当多的命令都是社区在crates.io上构建和共享的第一个插件!

1.6-Libcore:libcore是标准库的一个子集,它只包含不需要分配或操作系统级功能的API。libcore的稳定带来了编译Rust而不需要分配或操作系统依赖的能力,这是实现Rust支持嵌入式系统开发的第一个重要步骤。

1.10-C ABI动态库:cdylib机箱类型允许将Rust编译为C动态库,使您能够将Rust项目嵌入到任何支持C ABI的系统中。Rust在用户中的一些最大的成功故事是能够用Rust编写系统的一个小的关键部分,并无缝地集成到更大的代码库中,而且现在比以往任何时候都更容易。

1.12-货物工作区:工作区允许您组织多个锈蚀项目并共享同一锁文件。工作空间在建造大型多机箱级别的项目中发挥了不可估量的作用。

1.13-try运算符:添加的第一个主要语法是?或者试试";操作员。运算符允许您轻松地通过调用堆栈传播错误。在此之前,您必须使用Try!宏,它要求您在每次遇到结果时包装整个表达式,现在您可以轻松地用?取而代之的是。

1.14-Rustup 1.0:Rustup是Rust的工具链管理器,它允许您随意使用Rust的任何版本或其任何工具。最初只是一个不起眼的shell脚本,现在已经变成了维护者亲切地称之为嵌合体的东西。能够跨Linux、MacOS、Windows和数十个目标平台提供一流的编译器版本管理,这在五年前还很遥远。

1.15-派生过程宏:派生宏允许您创建强大而广泛的强类型API,而无需所有的样板。这是Rust的第一个版本,你可以在稳定平台上使用像serde或dIESEL这样的库。

1.17-Rustbuild:对于我们的贡献者来说,对该语言最大的改进之一是将我们的构建系统从最初的基于make的系统转移到使用Cargo。这使得Rust-lang/Rust更容易为成员和新手构建并为项目做出贡献。

1.20-关联常量:以前的常量只能与模块关联。在1.20中,我们稳定了结构、枚举和重要特征上的关联常数。使您可以更轻松地为API中的类型添加丰富的预设值集,例如通用IP地址或感兴趣的数字。

1.24-增量编译:在1.24之前,当您在库中进行更改时,rustc必须重新编译所有代码。现在,rustc在尽可能多地缓存方面要聪明得多,只需要重新生成所需的内容。

1.26-Iml特征:Iml特征的添加为您提供了具有静态分派优势和性能的动态API。

1.28-全局分配器:以前,您只能使用Ruust提供的分配器。使用全局分配器API,您现在可以将您的分配器定制为符合您需要的分配器。这是创建Alalloc库的重要一步,Alalloc库是标准库的另一个子集,其中只包含需要VEC或String等分配器的STD部分。现在,在各种系统上使用标准库的更多部分比以往任何时候都要容易。

1.31-2018版本:2018年版本的发布很容易成为我们自1.0以来最大的版本,添加了一系列语法更改和改进,以完全向后兼容的方式编写Rust,允许使用不同版本构建的库无缝协作。

非词汇生命周期对Rust的借阅检查器进行了巨大的改进,使其能够接受更多可验证的安全代码。

Clippy 1.0 Rust‘s Linter用于捕捉常见错误。Clippy使确保您的代码不仅安全而且正确变得更加麻烦。

Rustfix通过所有的语法更改,我们知道我们希望提供使转换尽可能简单的工具。现在,当需要对Rust的语法进行更改时,它们只是一个需要解决的问题。

1.34-替代板条箱注册表:随着Rust在生产中的使用越来越多,人们越来越需要能够在非公共空间中托管和使用您的项目,而Cargo始终允许远程GIT依赖,有了替代注册表,您的组织可以轻松地构建和共享您的项目中可以使用的板条箱注册表,就像它们在crates.io上一样。

1.39-异步/等待:处理期货的异步/等待关键字的稳定是使异步编程Rust成为一等公民的主要里程碑之一。即使在发布仅仅六个月后,Theasync编程就已经发展成为一个多样化和高性能的生态系统。

1.42-子切片模式:虽然不是最大的变化,但..。(REST)图案一直是人们期待已久的生活质量特征,它极大地提高了切片模式匹配的表现力。

有一件事我们没有提到太多,那就是自1.0以来,Rust的错误消息和诊断改进了多少。现在,查看较旧的错误消息感觉就像在查看不同的语言。

我们突出了几个例子,它们最好地展示了我们有多大的进步,向用户显示他们在哪里犯了错误,重要的是帮助他们理解为什么它不起作用,并教他们如何修复它。

编译错误消息v0.1.0(file:/Users/usr/src/rust/error-messages)src/lib.rs:6:5:6:12错误:类型`std::IO::Write`[E0277]src/lib.rs:6 Generic(W);^~src/lib.rs:6:5:6:12注意:`std::IO::Write`在编译时间rc/lib.rs:6:5:6:12注意:`std::io::Write`在编译时间rc/lib.rs:6:5:6:12注意:`std::io::Write`没有已知的恒定大小。^~错误:由于以前的错误而中止无法编译`error-messages`。若要了解详细信息,请使用--Verbose重新运行该命令。

编译错误消息v0.1.0(/Users/ep/src/rust/error-messages)error[E0277]:编译时不能知道`dyn std::IO::Write`类型的值的大小-->;src/lib.rs:6:13|6|Generic(W);|^不具有编译时已知的大小.9|fn Generic<;W:Write>;(_w:&;w){}|-Help:考虑放宽`Generic`|=Help:`dyn std::IO::Write`=注意:要了解更多信息,`dyn std::IO::Write`没有实现特征`std::Marker::Sized`中的隐式`Sized`限制:`+?Sized`|`Generic`|=Help中此绑定所需的`std::Marker::Sized`。错误:由于以前的错误而中止有关此错误的详细信息,请尝试`rustc--解释E0277`.error:无法编译`error-messages`。要了解详细信息,请使用--Verbose重新运行该命令。

编译错误消息v0.1.0(file:/Users/ep/src/rust/error-messages)src/lib.rs:3:24:3:43错误:`Collection::String::String`[E0277]src/lib.rs:3 println!(";{:?}";,s.find(";";";.to_owned())类型没有实现特征`core::ops::FnMut<;(char,)>;`。^~注意:在Format_args!<;标准宏>;:2:25:2:56注意:展开地点<;标准宏>;:1:1:2:62注意:在打印!<;标准宏>;展开中:3:1:3:54注意:展开地点<;标准宏>;:1:1:3:58注意:在println!SRC/lib.rs:3:5:3:45的展开中注意:展开站点rc/lib.rs:3:24:3:43错误:没有为类型`Collection::String::String`[E0277]src/lib.rs:3 println!(&#)>;`实现特征`core::ops::FnOnce<;(char,)>;`。^~注意:在Format_args!<;标准宏>;:2:25:2:56注意:展开地点<;标准宏>;:1:1:2:62注意:在打印!<;标准宏>;展开中:3:1:3:54注意:展开地点<;标准宏>;:1:1:3:58注意:在println!src/lib.rs:3:5:3:45的展开中注意:展开站点错误:由于前面的两个错误而中止无法编译`错误消息`。要了解详细信息,请使用--Verbose重新运行该命令。

编译错误消息v0.1.0(/Users/ep/src/rust/error-messages)error[E0277]:需要一个`std::ops::FnMut<;(char,)>;`闭包,找到`std::String::String`-->;src/lib.rs:3:29|3|println!(";{:?}";,s.find(";";.to_owner();。`for`std::string::String`error:由于以前的错误而中止有关此错误的详细信息,请尝试`rustc--解释E0277`.error:无法编译`error-messages`。要了解详细信息,请使用--Verbose重新运行该命令。

fn main(){设mut x=7;设y=&;mut x;println!(";{}{}";,x,y);}。

编译错误-消息v0.1.0(file:/Users/ep/src/rust/error-messages)src/lib.rs:5:23:5:24错误:无法将`x`借用为不可变,因为它还被借用为mutablesrc/lib.rs:5println!(";{}{}";,x,y);^注意:在Format_Args!<;标准宏>;:2:25:2:56注意:扩展站点<;标准宏>;:1:1:2:62注意:展开打印!<;标准宏>;:3:1:3:54注意:展开站点<;标准宏>;:1:1:3:58注意:展开println!src/lib.rs:5:5:5:29注意:展开站点rc/lib.rs:3:18:3:19注意:此处发生了`x`的上一次借用;可变借用防止后续借用。^src/lib.rs:6:2:6:2注意:上一借入结束于此处rc/lib.rs:1 fn main(){src/lib.rs:2 let mut x=7;src/lib.rs:3 let y=&;mut x;src/lib.rs:4src/lib.rs:5 println!(";{}{}";,x,y);src/lib.rs:4src/lib.rs:5 println!(";{}{}";,x,y)

编译错误消息v0.1.0(/Users/ep/src/rust/error-messages)error[E0502]:不能将`x`作为不可变借用,因为它也作为可变借用-->;src/lib.rs:5:23|3|设y=&;mut x;|-此处出现可变借用4|5|println!(";{}{}";,x,y);|^-此处稍后使用的可变借用|此处发生不可变借用错误:由于以前的错误而中止有关此错误的详细信息,请尝试`rustc--解释E0502`.error:无法编译`error-messages`。要了解详细信息,请使用--Verbose重新运行该命令。

当然,我们不可能涵盖所有已经发生的变化。因此,我们联系了我们的一些团队,询问他们最引以为豪的变化是什么:

铁锈现在支持基线IDE!在IntelliJ Rust、RLS和Rust-Analyzer之间,我觉得大多数用户应该能够为他们选择的编辑器找到不可怕的体验。五年前,写铁锈意味着使用老式的Vim/Emacs设置。

对我来说,这将是:为流行的嵌入式架构增加一流的支持,并实现一个努力奋斗的生态系统,使使用Rust开发微控制器成为一种简单、安全但有趣的体验。

发布团队从2018年初才开始发布,但即使在那段时间里,我们也只在Rust-lang/Rust中提交了大约40000个承诺,没有任何重大的回归。

考虑到我们改进编译器和标准库的速度之快,我认为这真的令人印象深刻(当然,发布团队并不是这里最重要的贡献者)。总体而言,我发现发布团队已经做了很好的工作,设法扩大规模,以应对不断增加的发行者、公关等流量。

在过去的三年里,我们成功地将MIRI从一个实验性的解释器转变为一个实用的工具,用于探索语言设计和发现真实代码中的错误-这是PL理论和实践的完美结合。在理论方面,我们有堆叠借词,这是迄今为止关于Rust别名模型的最具体的建议。在实践方面,虽然最初只有几个密钥库由我们在MIRI中检查,但最近我们看到使用MIRI来查找和修复自己的机箱和依赖中的错误的人很多,改进MIRI的贡献者也有类似的接受,例如通过添加对文件系统访问、展开和并发的支持。

如果让我选一件我最引以为豪的事,那就是在非词汇性社交时间(NLL)方面所做的工作。这不仅是因为我认为它对Rust的可用性产生了很大的影响,还因为我们通过组建NLL工作组来实现它的方式。这个工作组带来了许多伟大的贡献者,他们中的许多人至今仍在致力于编译器的开发。最好的开源!

在过去的五年里,随着语言的变化和发展,它的社区也是如此。有这么多伟大的项目都是用铁锈写的,铁锈生产的热潮也呈指数级增长。我们想分享一些关于锈菌究竟生长了多少的统计数据。

自从Rust发布1.0版以来,在过去的四次Stack Overflow开发人员调查中,它每年都被评为最受欢迎的编程。

仅今年一年,我们就提供了超过2.25PB(1PB=1,000 TB)的不同版本的编译器、工具和文档!

与此同时,我们在crates.io上提供了超过170TB的板条箱服务,达到约18亿个请求,与去年相比,每月的流量翻了一番。

当铁锈到1.0岁时,你可以用一只手数一数在生产中使用它的公司的数量。今天,数百家科技公司正在使用它,一些最大的科技公司,如苹果、亚马逊、Dropbox、Facebook、谷歌和微软,都选择在他们的项目中使用Rust,因为它的性能、可靠性和生产力。

显然,我们无法涵盖自2015年以来锈蚀发生的每一个变化或改进。您最喜欢的更改或新的最喜欢的Rustproject是什么?请随时在我们的论坛上发布您的答案和讨论。

最后,我们要感谢为“铁锈”做出贡献的每一个人,无论是你们贡献了一项新功能,还是修正了一个打字错误,你们的工作使“铁锈”成为今天的奇迹。我们迫不及待地想看看铁锈和它的社区将如何继续成长和变化,看看你们所有人在即将到来的十年里将与铁锈一起建设什么!