你以为你喜欢的是Python?那是因为你还没有遇到Rust

  意见,利基现象如何连续第五年成为StackOverflow最受欢迎的语言

  "过去的技术来拯救未来。" Rust的创建者Graydon Hoare就是这样描述他想要实现的目标。

  那是Rust的主要标志之一:使用学术界熟知的技术,但很少在当代的编程语言中实现。 过时,可靠且有时被遗忘的技术。 但是最重要的是,它运作得非常好。

  这些技术主要用于一件事:安全。

  您会认为软件开发人员是这个星球上最具创新能力的人之一。 然而,Rust与"快速行动并打破事物"的口头禅恰好相反。 尽管如此,Rust开发人员几乎可以保证学习他们从未听说过的概念。

  从一些开发人员使用代数数据类型进行系统编程的新颖性到Rust自己的内存安全性方法:每个开发人员都可以找到一些新的东西,这些东西对学习非常有用。 而且还有更多的理由爱上Rust。

  无需垃圾收集即可提高内存安全性

  每种编程语言的挑战之一就是以安全有效的方式管理计算机的内存。 例如,Python的垃圾收集器会不断寻找不再使用的内存,并在程序运行时对其进行清理。

  在其他语言中,例如C和C#,程序员必须在运行时显式分配和释放内存。 由于所有与内存相关的问题均已在程序运行之前得到解决,因此该方法对于优化性能要好得多。

  另一方面,内存是开发人员始终需要考虑的另一件事。 这就是为什么即使一天结束时做同样的事情,用C编写一个程序要比用Python编写更长的时间的原因之一。

  Rust采取了另一种方式:在编译时通过所有权系统分配内存。 确保清除未使用的数据而又不强迫程序员一直考虑分配和释放内存的做法很巧妙。

  所有权基本上是三个规则的集合:

  · Rust中的每个值都有一个称为所有者的变量。

  · 一次只能有一个所有者。

  · 当所有者超出范围时,该值将被删除,从而释放内存。

  一个简单的示例是在Rust中分配向量:

  fn main() {

  let a=vec![1, 2, 3];

  let b=a;

  println!("a: {:?}", b);

  }

  在第二行中,创建具有所有者a的向量[1、2、3]。 之后,b成为向量的所有者。 由于在print语句中调用了正确的所有者,因此该程序将在执行时编译并返回预期结果:

  a: [1, 2, 3]

  另一方面,您可以尝试使用其先前的所有者a调用向量,如下所示:

  fn main() {

  let a=vec![1, 2, 3];

  let b=a;

  println!("a: {:?}", b, a);

  }

  在这种情况下,编译器将引发错误,因为已经在第三行中删除了a。 这个主题还有很多深度,但这是基本思想。

  相比之下,Python将在第二种情况下运行。 它的垃圾收集器只会在最后一次调用后才丢弃a,这对开发人员来说很不错,但在内存空间方面却不太好。

  在C语言中,情况会有些复杂:您将不得不为a分配内存空间,然后将其指向向量,然后为b分配更多内存空间,将b指向a,最后释放a占用的空间。 和b完成后。

  从这个意义上讲,Rust的内存存储方法是开发速度和性能之间的折衷。 尽管它不像Python那样容易编写,但一旦您了解所有权的概念,它就不会像C那样笨拙。

  另一方面,效率相当惊人:例如,开发人员团队Tilde在Rust中重写了一些JavaHTTP片段后,设法将其内存使用量减少了90%。

  静态输入而不难看

  动态类型与静态类型的粉丝之间几乎是一场宗教战争。 使用动态类型的语言来生产软件要容易得多,但是代码却很快变得难以维护。 与例如C相比,这就是为什么Python代码很难维护的原因之一。

  另一方面,必须声明每个C样式变量的类型会很烦人。 如果您曾经尝试在返回C语言中浮点类型的函数中使用double型,那么您就会明白我的意思。

  Rust是一种中间方法:它是静态类型系统,但只需要程序员指定诸如函数参数和常量之类的顶级类型。 在函数体内,允许使用Python样式的类型推断。

  Rust的一个特别有用的功能是它也具有None类型。 这使您可以在编译时处理异常,从而确保程序在最终用户处可以平稳运行。 考虑以下示例,在此示例中,我们可以获取一个人的全名,而不管他是否具有中间名:

  fn get_full_name(fname: &str, mname: Option<&str>, lname: &str) -> String {

  match mname {

  Some(n)=> format!("{} {} {}", fname, n, lname),

  None=> format!("{} {}", fname, lname),

  }

  }

  fn main() {

  println!("{}", get_full_name("Ronald", None, "McDonald"));

  println!("{}", get_full_name("Dwight", Some("P."), "Eisenhower"));

  }

  虽然None变通方法的版本也存在于其他语言中,但它以一种简洁的方式展示了Rust的雄心:在使代码保持尽可能持久和可维护的同时,不使编写变得太困难。

  一种漂亮的系统编程方法

  Python是一种通用编程语言,而Rust与C一样,绝对是用于系统编程。 如果您不是为最终用户制作应用程序,Rust并不是理想的语言,但它是构建可为其他软件提供服务的软件的理想选择。

  因此,效率是Rust的核心。 最好的证明是零成本抽象,它在解释代码的同时将内存使用量保持在最低水平。 正如C的发明者Bjarne Stroustrup所说:"不用的东西,不用花钱。 更进一步:您使用的是什么,您无法再编写更好的代码了。"

  例如,考虑在Python中将所有最大为1000的整数相加:

  sum(range(1000))

  每次代码运行时,它都会进行1,000次迭代和添加操作-您可以想象有多少会减慢代码速度。 相反,请考虑Rust中的同一件事:

  (0..1000).sum()

  编译为常数499500。实际上,内存使用量减少了1000倍。

  虽然这些抽象也存在于C中,但Rust大量使用了它们-实际上,一个目标是在语言中添加尽可能多的零成本抽象。 从这个意义上讲,Rust有点像下一级C。

  C已经存在了40多年了,Rust的目标是做到这一点。 Rust非常重视向后兼容性,因此您今天仍然可以在Rust 1.0中运行代码。 同样,如果您今天编写Rust代码,那么您仍然应该能够在20年后运行它。 锈不会生锈!

  一个很小但不可思议的社区

  凭借其对安全性和可持续性的重视及其所有精美的细节,毫无疑问,Dropbox在Rust中重写了许多核心结构。 Rust的第一个主要赞助商Mozilla在其中编写了Firefox的重要组成部分。 微软认为C和C#对于关键任务软件不再安全,并且正在Rust中进行越来越多的投资。

  而且不仅是大公司,对Rust的热爱还可以转化为单个程序员。 到目前为止,尽管只有5%的StackOverflow受调查者使用Rust,但这些开发人员对这种语言非常热衷。

  这是有原因的。 语言规范和编译器不仅经过深思熟虑。 在安装和管理工具链方面存在不足。 每个Rust安装中都有一个命令行工具Cargo,可帮助管理依赖关系,运行测试并生成文档。

  在crates.io中,用户可以共享和发现库,而在docs.rs中记录了它们。 Clippy提供了编译器兼容,rustfmt提供了自动格式化。

  除此之外,世界各地还有官方和非正式的聊天,subreddit,用户论坛,StackOverflow问题和会议。 在一个以友善为重的社区中,还有其他要求吗?

  缺点:走路之前需要跑步

  关于Rust令人沮丧的一件事是高昂的启动成本。 您可能需要一到两天的时间才能熟练掌握大多数语言,但在Rust中则需要一到两周的时间。

  这是由于其他语言没有使用许多新概念,以及在编译时通常存在很多错误的事实。 您需要在第一天就处理所有异常,而不能像在Python中那样编写可以运行并在以后添加异常的临时代码。

  另外,由于Rust仍然很新,所以可能您想要的所有库都还没有。 除了官方文档和有关StackOverflow的各种问题外,教程也很少。

  好消息是,一旦您了解了概念并编译了程序,它就会像魅力一样贯穿始终。 此外,考虑到向后兼容,它应该仍会在二十年内起作用。

  考虑到您代码的可持续性,并且Rust得到了许多大公司的支持,尽管有不利影响,但花一到两周的前期学习还是值得的。

  底线:毫无畏惧地乱砍

  Rust不仅仅是安全。 但是,很难否认其许多核心概念旨在消除内存泄漏和其他安全问题。 在软件是一切的时代,安全是必须的。

  每种即将到来的语言都可能有空间:Go越来越多地填充Python和Java的空间,Julia在数据科学领域追赶Python,而Rust在Python和C#领域不断发展。 Rust的与众不同之处在于其令人难以置信的社区,创新的功能以及旨在持续数十年的事实。

  还有很多工作要做,其中只有一小部分可以并且将在Rust中完成。 尽管未来几年还会出现其他语言,但是今天的新语言有很大的机会保留一段时间。 但是,如果我必须将自己的卡片放在一种语言上,Rust将是一个安全的选择。

posted @ 2022-02-01 23:08  ebuybay  阅读(45)  评论(0编辑  收藏  举报