网红编程语言Rust到底是个什么鬼?

上月,Stack Overflow发布了2020年度最热关键技术趋势调查结果, 这项调查的结果反映了将近65,000名开发人员的意见和经验 ,而其中最为令人关注的是, Rust连续四年登顶最受欢迎的编程语言 。

但最有趣的是, 参加调查的大多数开发人员并不熟悉该语言,但是却坚定的把票投给了它!这个Rust语言到底是何方神圣?能让广大程序员即使只是道听途说就把票投给了它?

一句话总结就是:Rust解决了许多其他编程语言中存在的痛点!

来自动态类型语言的挑战

倾向于使用动态还是静态类型语言的的争论可能还会持续数十年,但是静态类型语言有多少优势很难有定论。但是你会观察到当诸如TypeScript之类的语言或诸如Python等动态语言功能的兴起后, 人们对于动态语言在调试、运行时的不确定性的抱怨。而静态类型的语言允许对数据及其行为预先进行编译器级别的检查和约束,从而减少了程序理解的开销和动态运行的不确定性。

这并不是说所有静态类型系统都是高效的。许多静态类型的语言旁边都有一个大星号:它们允许使用NULL 的概念。这意味着任何值都可能是它自己或是什么都不是,这样可以更有效地为每种类型创建另一个可能的类型。与Haskell和其他一些现代编程语言一样,Rust使用可选类型对这种可能性进行编码,并且编译器要求你处理None这种情况。这样可以防止发生可怕的运行时错误(或等效语言),而可以将其提升为你在用户看到它之前解决的编译时错误。

这是一个 无论我们是否知道他的名字都向某人打招呼的函数示例;如果我们忘记了或者试图直接使用name去match,以为它存在的默认的String值的情况,编译器就会报警。

fn greet_user(name: Option) {
    match name {
        Some(name) => println!("Hello there, {}!", name),
        None => println!("Well howdy, stranger!"),
    }
}

Rust的静态类型尽最大努力避免程序员的麻烦,同时鼓励长期的可维护性。一些静态类型的语言给程序员带来了沉重的负担,要求他们多次重复变量的类型,这阻碍了可读性和重构。其他静态类型的语言允许在全局进行数据类型推断。虽然在最初的开发过程中很方便,但是这会降低编译器在类型不再匹配时提供有用的错误信息的能力。Rust可以从这两种样式中学习,并要求顶层项(如函数参数和常量)具有显式类型,同时允许在函数体内部进行类型推断。在这个例子中, Rust 编译器可以推断的类型包括twice2以及1,因为val 参数和返回类型声明为32位带符号整数。

fn simple_math(val: i32) -> i32 {
    let twice = val * 2;
    twice - 1
}

来自垃圾回收语言的挑战

使用系统级编程语言的最大好处之一就是可以控制代码底层的细节。

Rust使你可以选择将数据存储在堆栈上还是堆上,并在编译时确定何时不再需要内存并可以对其进行清理。这样可以有效利用内存,并实现更高性能的内存访问。Tilde是Rust在其Skylight产品中的早期生产用户,他发现通过使用Rust重写某些Java HTTP服务,他们能够将内存使用量从5Gb减少到50Mb。当云提供商对增加的内存或更多的节点收取高昂的价格时,这样的节省将会带来巨大的收益。

无需连续运行垃圾收集器,Rust项目非常适合被其他编程语言通过外部功能接口用作库。这使现有项目可以用快速的Rust代码替换对性能至关重要的代码,而不会产生其他系统编程语言固有的内存安全风险。某些项目甚至已使用这些技术在Rust中进行了增量重写。

通过直接访问硬件和内存,Rust是嵌入式和裸机开发的理想语言你您可以编写底层代码,例如操作系统内核微控制器应用程序。在这些特别具有挑战性的环境中,Rust的核心类型和功能以及可重用的库代码表现将会非常出色。

来自其他系统级编程语言的挑战

对于许多人来说,Rust在很大程度上被视为其他系统级编程语言(例如C或C ++)的替代。与这些语言相比,Rust可以提供的最大好处是借阅检查器。这是编译器的一部分,负责确保引用不会超出引用的数据寿命,并有助于消除由于内存不安全而导致的所有类型的错误。

与许多现有的系统编程语言不同,Rust不需要你将所有时间都花在细节上。Rust力求拥有尽可能多的零成本抽象,这种抽象与等效的手写代码具有同等的性能。在此示例中,我们展示了如何使用迭代器(一种主要的Rust抽象)来简洁地创建一个包含前十个平方数的向量。

let squares: Vec<_> = (0..10).map(|i| i * i).collect();

当安全的Rust无法表达某些概念时,ref="http://cliffle.com/p/dangerust/">可以使用不安全的 Rust。这样可以释放一些额外的功能,但作为交换,程序员现在有责任确保代码真正安全。然后,可以将这种不安全的代码包装在更高级别的抽象中,以确保抽象的所有使用都是安全的。

使用不安全的代码应该是一个经过深思熟虑的决定,因为正确使用它需要与负责避免未定义行为的任何其他语言一样多的思考和关心。最小化不安全代码是最小化由于内存不安全而导致段错误和漏洞的可能性的最佳方法。

系统性编程语言有一种天生的使命,即它们必须永远有效地存在。尽管某些现代软件并不需要那么长的使用寿命,但许多企业希望其辛苦编写代码库在可预见的将来能够一直使用。Rust意识到了这一点,并围绕向后兼容性和稳定性做出了有意识的设计决策。这是为未来至少40年设计的语言。

Rust生态系统

Rust的生态比语言规范和编译器还重要。创建和维护高质量的软件库的语言都会被视为编程界的一股清流。可以通过rustup安装和管理多个并发的Rust工具链。Rust安装随附Cargo,这是一个命令行工具,用于管理依赖项,运行测试,生成文档等。由于默认情况下依赖项,测试和文档可用,因此它们的用法很普遍。crates.io是用于共享和发现Rust库的社区站点。发布到crates.io的任何库都将在docs.rs上构建并发布其文档。

除了内置工具之外,Rust社区还创建了许多开发工具。基准测试,模糊测试和基于属性的测试都可以轻松访问并在项目中得到广泛的使用。额外的编译器 lints 可从 Clippy 下载, 而rustfmt提供了自动的通用格式的设置。

除技术要点外,Rust拥有一个充满活力的欢迎社区。人们可以通过几种官方和非官方途径获得帮助,例如聊天用户论坛Rust subreddit,当然还有Stack Overflow 问题与解答以及聊天室

在离线状态下,Rust在全球范围内召开了多个会议,例如RustConf,Rust Belt Rust,RustFest,Rust Latam,RustCon Asia等。

当然,Rust也不是没有缺点的

Rust强大的类型系统和对内存安全性的强调(都在编译时强制执行)意味着在编译代码时出现错误是非常普遍的。对于不习惯这种自以为是的编程语言的程序员来说,这可能会令人沮丧。但是,Rust开发人员花费了大量时间来改进错误消息,以确保它们清晰且可快速定位错误。

在此示例中,我们创建了一个包含名称的可变字符串,然后引用该名称的前三个字节。尽管该引用非常出色,但我们尝试通过清除字符串来对其进行突变。现在无法保证引用指向有效数据并对其取消引用可能导致未定义的行为,因此编译器会阻止我们:

fn no_mutable_aliasing() {
    let mut name = String::from("Vivian");
    let nickname = &name[..3];
    name.clear();
    println!("Hello there, {}!", nickname);
}
error[E0502]: cannot borrow `name` as mutable because it is also borrowed as immutable
 --> a.rs:4:5
  |
3 |     let nickname = &name[..3];
  |                     ---- immutable borrow occurs here
4 |     name.clear();
  |     ^^^^^^^^^^^^ mutable borrow occurs here
5 |     println!("Hello there, {}!", nickname);
  |                                  -------- immutable borrow later used here

For more information about this error, try `rustc --explain E0502`.

非常有用的是,错误消息包含了我们的代码,并尽最大努力解释问题,指出确切的位置。

由于Rust具有静态类型的性质,并且Rust需要满足100%的所有条件,而不仅仅是99%,所以在早期开发中,这些极端情况通常可以先让程序崩溃吧,然后在以后再添加严格的错误处理。这与Ruby等语言的工作流程不同,在Ruby中,开发人员经常在REPL中试用代码,然后将其移至原型,而完全不考虑错误情况。

Rust仍然是相对较新的,这意味着某些所需的库可能不能用。好的方面是,有很多环境可以开发这些所需的库,并可以利用相关计算机科学领域的最新成果。由于此特性再结合和Rust的能力,Rust的某些库(例如正则表达式库)是所有语言中同类产品中表现最好的。

尽管Rust对稳定性和向后兼容性具有坚定的承诺,但这并不意味着该语言已非常完善。例如,Rust具有异步Future特性已超过三年,但稳定的ef="https://blog.rust-lang.org/2019/11/07/Async-await-stable.html">async/await支持仅在几个月前才加进去。

Rust编译器基于LLVM构建,这意味着目标平台的数量将小于C或C ++。

加入我们吧!

不管你现在喜欢哪种编程语言,Rust肯定都会引起你的兴趣。这就是为什么我和其他人非常喜欢Rust的一些原因。如果你正在寻求开发项目更快或更高效的代码,或者更安全地编写高性能代码的能力,那么现在该来看看,Rust是否会将成你下一个最爱的语言吧!

至于如何快速体验?去领取一个

创帆云_python云环境云主机_wordpress网站建设_个人网站_免费上云_数据爬虫_免费bi工具_数据分析​www.bistudio.com.cn​

,免费搭建一个Rust环境试试吧!

Thanks Jake Goulding

猜你喜欢

转载自blog.csdn.net/oSuiYing12/article/details/106844271