编程语言应用

首页 » 常识 » 诊断 » 年仅5岁的Rust如何成为最受欢
TUhjnbcbe - 2022/4/23 18:50:00
北京去哪个医院看白癜风比较好 http://m.39.net/pf/bdfyy/

当今世界科技发展日新月异,Rust.0版本发布至今已有五年时光!在这五年中,Rust改变了许多,凭借自身的优势,Rust也连续四年成为开发者最受欢迎的编程语言。目前,也有越来越多的项目及企业开始选择使用Rust作为其应用及工具开发语言。

如今在Rust发行五周年之际,Rust核心团队回顾了过去五年间,Rust的发展历程,在其每个版本的更新迭代中,我们或许能明白Rust流行的真正原因。

作者

Rust核心团队译者

弯月,责编

屠敏头图

CSDN下载自东方IC出品

CSDN(ID:CSDNnews)

Rust是一个通用的编程语言,任何人都可以使用它构建可靠、高效的软件。Rust适用于技术栈的任何地方,不论是操作系统内核,还是Web应用程序。它完全是由一个开放、多样化的社区构建的,多亏了志愿者们贡献出宝贵的个人时间和专业技能,Rust才有了今天的发展。

.0版以来的主要变化

.2-并行代码生成:Rust的每次发布,编译时间都会有很大提升。很难想象,曾经有一段时间,Rust还没有提供并行代码生成功能。

.3-Rustonomicon:《Rustonomicon》的第一版发行。这本书总结了一些不安全的Rust用法。这本书以及相关资源成为了人们学习以及理解Rust语言最难懂部分的最佳资源。

.4-WindowsMSVCTier支持:第一个Tier平台提升,通过MicrosoftVisualC++工具链(MSVC)带来了对64位Windows的原生支持。在.4之前,你必须同时安装MinGW(一个第三方的GNU环境)才能编译并使用Rust程序。Rust的Windows支持是过去五年的一项巨大进步。最近,微软公布了他们的WinRTAPI准备正式支持Rust!现在,构建跨平台的高质量原生代码已经非常容易了。

.5-CargoInstall:在cargo已有的插件支持之外,能够构建Rust二进制文件,这个功能打造了一个完整的生态系统,里面包含了大量社区喜爱并且每天都使用的应用程序、工具和开发工具等。cargo的许多命令最初都是社区构建并在crates.io上分享的插件!

.6-Libcore:libcore是标准库的一个子集,它仅包括那些不需要内存分配或操作系统级别功能的API。libcore非常稳定,因此Rust的编译不需要再耗费大量资源或依赖于操作系统,这是Rust朝着嵌入式系统开发迈进的一大步。

.0-CABI动态库:cdylib类型允许Rust编译成C动态库,这样人们就可以将Rust项目嵌入到任何支持CABI的系统中。已有一些成功的Rust案例,如用Rust编写系统中关键的一小部分,然后无缝集成到整体代码中,这种实现已经非常容易。

.2-Cargo工作空间:现在工作空间可以组织多个Rust项目,并共享同一个lockfile。在构建大型、多crate的项目时,工作空间是无价之宝。

.3-Try运算符:增加的第一个语法就是?,或者叫做“try”运算符。该运算符可以很容易地将错误从调用栈中向上传递。之前必须使用try!宏,需要在每次遇到结果时将整个表达式都包裹起来。而现在可以方便地使用?来串联方法。

try!(try!(expression).method());//Oldexpression?.method()?;//New

.4-Rustup.0:Rustup是Rust的工具链管理器,可以让你无缝地使用任何Rust版本,或者使用它的任何工具。最初这个工具只是一个shell脚本,后来被维护者称为“奇美拉”。能够在五年期就提供一个跨Linux、macOS、Windows和各种目标平台上的编译器,真是一个奇迹。

.5-继承过程式宏(DeriveProceduralMacros):继承过程式宏可以建立强大且可扩展的有类型的API,而无需编写样板代码。这个版本的Rust首次能够使用serde、diesel等库的宏。

.7-Rustbuild:这是我们的贡献者为Rust做出的最大改进之一,将最初基于make的构建系统改成了使用cargo。从那以后,rust-lang/rust降低了新成员构建的门槛以及为项目做贡献的难度。

.20-关联常量:以前,常量只能关联到模块上。从.20开始,我们开始稳定地支持将常量关联至结构体、枚举,最重要的是还能关联到trait上。从那以后,我们可以很轻松地给API的类型增加丰富的预设值,比如常见的IP地址,或关心的数字等。

.24-增量式编译:在.24之前,修改代码库后,rustc会编译全部代码。现在rustc变得非常聪明,会尽可能使用缓存来生成需要的东西。

.26-implTrait:新增的implTrait支持含义丰富的动态API,还能提供静态分发的好处和性能。

.28-全局分配器:之前你只能使用rust提供的分配器。有了全局分配器API,现在你可以使用自定义的分配器来实现自己的需求。这是实现alloc库的重要一步,alloc库是标注库的另一个子集,它仅包含需要分配器的部分,如Vec或String。现在我们可以更方便地在多种系统上使用更多标准库了。

.3-版:版的发布是自.0以来最大的一次版本发布,其中增加了许多语法的变化与改进,同时完全维持了Rust的向后兼容,可以让各种不同版本的库无缝协同工作。

非词法生命周期:这是对Rustborrowchecker的一个巨大改进,可以接受更多可验证的安全代码。

模块系统改进:针对模块的定义和使用方式进行的巨大UX改进。

常量函数:常量函数可以在编译时运行和计算Rust代码。

Rustfmt.0:专门为Rust打造的专用代码格式化工具。

Clippy.0:用于捕捉常见错误的Rustlinter。Clippy可以很轻松地确保代码的安全性和正确性。

Rustfix:由于有许多语法改变,我们希望提供一个工具,可以很容易地进行代码转换。有了这个工具,只需要执行cargofix就可以解决语法改动的问题。

.34-自定义Crate仓库:随着Rust越来越多地在生产环境中应用,在非公共领域运行项目的需求也越来越大。尽管cargo允许依赖于异地的git代码仓库,但有了自定义Crate仓库,各个公司就可以很轻松地构建并共享自己的仓库,用于自己的项目中,就跟crates.io一样。

.39-Async/Await:async/await关键字可用于处理Future,这是Rust开始支持异步编程的一个重要里程碑。在Rust发布异步编程后仅仅六个月内就催生了各种各样高性能的生态系统。

.42-subslice模式:尽管不是最大的改动,但..(其余)模式的添加能够极大地提高代码在带有slice的模式匹配方面的表达性。

错误诊断

我们没有提过过多的一点就是Rust的错误信息和诊断从.0开始就在不断改进。现在看看最初的错误信息,就像是看着一个完全不同的语言一样。

下面的几个例子展示了错误信息的改进,以及这些改进对于用户理解错误和修复错误的重要性。

第一个例子(Traits)

usestd::io::Write;fntrait_obj(w:Write){generic(w);}fngenericW:Write(_w:W){}

.2.0的错误信息

.43.0的错误信息

第二个例子(help)

fnmain(){lets="".to_owned();println!("{:?}",s.find("".to_owned()));}

.2.0错误信息

.43.0错误信息

第三个例子(borrowchecker)

fnmain(){letmutx=7;lety=mutx;println!("{}{}",x,y);}

.2.0错误信息

.43.0错误信息

来自开发团队的心声

当然,我们无法在本文中一一列举出我们做的所有改动。所以我们采访了一些团队成员,听听他们最引以为豪的工作:

rustdoc最重要的改动是:

为blanketimplementation自动生成文档

搜索功能机器优化(最新的优化为转换为JSON)

能够检测出更精确的文档代码块“

1
查看完整版本: 年仅5岁的Rust如何成为最受欢