logo

选择Rust,面向未来|Rust的前世今生

Rust 连续8年成为 Stack Overflow 最受欢迎的语言,这是个什么编程语言呢?能够获得全世界大量计算机相关的开发者的青睐

什么是 Rust 编程语言

fn main() {
    println!("Hello World!");
}

Rust是一种速度极快、高性能、注重内存安全静态编译型语言,具有丰富的类型系统和所有权模型;同时保证线程安全,无畏并发!由于没有运行时垃圾回收,它能够胜任对性能要求特别高的服务,可以在嵌入式设备上运行,还能轻松和其他语言集成。

它最初旨在作为C 和 C++的更安全替代品,它是一种系统编程语言,由于其对安全性、性能和生产力的重视,在开发人员中获得了广泛的欢迎。 Rust 是一种静态类型语言,因此变量和表达式类型在编译时确定和检查,这有助于增强内存安全和错误检测,从而实现更可靠的构建,使开发人员能够在编译时进行调试,解决了许多其他语言中存在的痛点

Rust发展历史

2006 年,软件开发人员 Graydon HoareMozilla 工作时将 Rust 作为个人项目启动。根据 MIT Technology Review 的采访,Rust 的灵感来自,Hoare当时在开源浏览器公司 Mozilla 工作,当他回到温哥华的公寓,发现电梯坏了!他只能爬21层楼回家,他感到非常的生气,转念想到"我们这些程序员甚至无法制造出不死机的电梯!"。Hoare他深知许多此类崩溃是由于程序使用内存的方式出现问题造成的

电梯等设备内部的软件通常是用 C++ 或 C 等语言编写的,这些语言以允许程序员编写运行速度非常快且非常紧凑的代码而闻名。但问题是这些语言还很容易意外引入内存错误,这些错误将导致崩溃。另外Microsoft公司估计,其公司内部代码中70%的漏洞是由于使用这些语言编写的代码的内存错误造成的。

如果我们发现自己被迫爬上21层楼梯,我们大多数人都会生气并把它留在那里。但Hoare决定为此做点什么:他打开笔记本电脑,开始设计并研究一种新的计算机语言,他希望这种语言能够编写出小而快速的代码,而不会出现内存错误。他将其命名为 Rust,以一组非常耐寒的真菌命名,他说,这些真菌“为了生存而被过度设计”

大佬太牛了吧!!!

后来,他向一位经理展示了这个项目,这导致 Mozilla2009 年赞助了他,将该语言纳入实验性浏览器引擎开发的长期努力的一部分。2010年,Mozilla Research 正式宣布了 Rust 项目,并将源代码作为开源项目向公众发布

2012 年到 2015 年,Rust 类型系统发生了重大变化,特别是删除了类型状态系统,整合了其他语言功能,并删除了垃圾回收器。通过所有权系统进行的内存管理逐渐得到整合和扩展,以防止与内存相关的错误。到 2013 年,垃圾回收器功能已很少使用,并且被团队删除,以支持所有权系统。在此期间的其他变化包括删除了 pure 函数,这些函数在 2013 年 3 月由显式 pure 注解声明。删除了对通道和各种指针类型的专用语法支持,以简化语言

经过几年的发展,Rust 达到了稳定成熟的状态,并于 2015 年 5 月发布了 Rust 1.0。这个里程碑标志着 Rust 已经为生产做好了准备,并为开发人员提供了构建的基础。

自 1.0 版本以来,Rust 的普及和采用呈爆炸式增长Microsoft Windows 等顶级应用程序利用 Rust 通过其内存安全代码重写核心库。除了科技巨头之外,Rust 还拥有一个充满活力的开发人员社区,或称“Rustaceans”,他们致力于使 Rust 体验成为一种积极和协作的体验。

如今Rust 已成为地球上最热门的新语言之一,已经有超过 280 万程序员使用 Rust 编写代码,从 Microsoft 到 Amazon 的公司都将其视为未来的关键。聊天平台 Discord 使用 Rust 来加速其系统,Dropbox 使用它来将文件同步到您的计算机,Cloudflare 使用它来处理超过 20% 的互联网流量

Rust具有哪些优秀的特性?

  1. 无畏并发。Rust 通过其所有权系统内置了对并发编程的支持,该系统对数据访问执行严格的规则,其借用模型通过允许受控的同步访问来防止数据竞争。这可以在编译时检测并确保多个线程可以处理共享数据,而不会引入与内存相关的问题

同一作用域内,可以多个入口度读变量;同一作用域内,只允许一个入口修改变量;同一作用域内,不允许同时存在读入口和写入口

  1. 没有垃圾回收。与某些编程语言不同,Rust 不使用垃圾回收。它引入了所有权ownership借用borrowing生命周期lifetime的概念,用以保证内存安全而无需垃圾回收。 Rust的这种设计让编译器在编译阶段就能捕捉到许多常见的内存错误,从而极大地提高了程序的安全性和稳定性
  2. 强大的包管理工具。Rust 的内置包管理器 Cargo 简化了项目管理、依赖项跟踪和构建,这有助于实现高效和有序的开发工作流程。但这并不能清楚地表明 Cargo 生态系统有多么疯狂。用过C++的都说cargo好!这里有一个有趣的事实:Rust 实际上是第一个拥有标准包管理器的系统编程语言,因此Rust 生态系统非常强大。
  3. 零成本抽象。此功能允许开发人员编写高级代码抽象和功能,而不会引入任何运行时性能开销。trait和宏是rust 零成本抽象的基石
  4. 模式匹配。这种强大的语言功能使开发人员能够简洁有效地将复杂的数据结构与特定模式进行匹配,以清晰可读的方式提取和处理不同的情况或场景
  5. 类型推断。此功能允许 Rust 的编译器在您编码时根据上下文自动检测表达式
  6. 高性能。Rust的代码执行效率可以与C++相媲美,而且由于其内存和并发安全的设计,开发者可以更加集中精力在业务逻辑上,而不需要过多地担心性能优化

所有权

Rust的所有权概念是,当你拥有某样东西时,你可以决定把它传给别人,如果你有一本书,而且你已经读完了,你可以把它永久地送给别人,不用担心它。

比如:

fn helper() -> Box<i32> {
    let three = Box::new(3);
    three // Ownership is transferred implicitly
}

fn main() {
    // Acquire ownership of the return value
    let my_three = helper();
    println!("{}",my_three);
}

这里的a和b具有不同的生命周期,因此它不会起作用。

fn main() {
  let a: &i32;
  
  // a and b have same lifetime
  let b = 3;  
  a = &b;
  println!("{}",a);
  println!("{}",b);
}

这里a和b具有相同的生命周期,因此它会起作用。Borrow 可以嵌套。通过克隆,借入的值可以成为拥有的值

Rust 中的内存管理

  1. Rust 具有精细的内存管理,但一旦创建就会自动管理。
  2. 在 Rust 中,当你分配内存时,你永远不必真正释放它,你可以决定何时释放它,但永远不要调用它。Rust 会自动处理它。
  3. 每个变量都有一个它有效的范围,一旦它超出范围,它就会自动释放。
  4. 在 Rust 中,每个程序都从操作系统分配内存。
  5. Rust 还有一个共享内存,我们可以在其中拥有参考数据,我们可以使用所有权来跟踪引用计数。

Rust 的优势

  1. 快速调试和测试:Rust 是一种非常快速的语言,支持快速有效的调试。
  2. 与其他语言相比,Rust 支持更复杂的代码,因此我们可以用更少的代码实现更多。
  3. Rust它支持跨平台开发
  4. 易于集成: Rust 可以很容易地与 C 和许多其他著名的编程语言集成。
  5. Rust 比其他编程语言更安全。
  6. 有一个广泛的开发人员社区支持 Rust。

一些烦恼

Rust绝对是一门很棒的语言,但它可能并不适合编程初学者,Rust并不是一门容易快速掌握的语言,Rust的语法复杂和冗长,学习曲线比较陡峭,容易让初学者沮丧。因为它不像Java、Python、go对开发者隐藏许多功能细节,而是敞开来,让我们完全理解、负责和管理底层细节,但是一旦入门,你将会成为一个更加优秀的程序员

由于复杂性,代码的开发效率可能较低,而且编译需要更多的时间,但一旦编译通过,后来则是一片坦途!

另外Rust 的强类型系统和对内存安全的强调(所有这些都在编译时强制执行),意味着在编译代码时出现错误是极其常见的,经常听到有人抱怨他们一直在 “与编译器作斗争”!对于不习惯这种固执己见的编程语言的程序员来说,这可能是一种令人沮丧的感觉。但是,Rust 开发人员花费了大量时间来改进错误消息,会自然而然地,识别出的每个位置都有可能在未执行相同检查的语言中引入错误和潜在漏洞。

尤其经常听到有人抱怨他们一直在 “与编译器作斗争”。虽然这些错误可能令人沮丧,但重要的是要认识到,识别出的每个位置都有可能在未执行相同检查的语言中引入错误和潜在漏洞。

Rust能用来做什么?

由于可以直接访问硬件和内存,Rust 非常适合嵌入式系统和裸机开发。由于它是一种通用语言,因此它也可以用于各种应用程序

  1. 使用 Rust 构建性能关键型后端系统,注重性能的后端系统是处理需要高速处理、低延迟响应和高效资源利用的任务的软件组件或服务,而 Rust 的性能、线程安全和错误处理使其成为开发这些类型系统的绝佳选择。
  2. 使用 Rust 开发操作系统,它通常用于构建操作系统、内核、设备驱动程序或其他对内存和性能的控制至关重要的低级组件
  3. 使用 Rust 进行 Web 开发,Rust 的异步编程模型和性能特征使其适合构建高性能 Web 服务器、API 和后端服务
  4. 使用 Rust 进行加密和区块链开发,Rust 的速度、内存管理和安全性都有助于它参与加密货币和区块链技术。
  5. 使用 Rust 进行嵌入式系统和物联网开发,rust 的最小运行时和对内存布局的控制使其对于开发嵌入式系统和物联网 (IoT) 设备非常有用。它能够防止与内存相关的错误、管理并发以及生成小型、高效的二进制文件,以满足 IoT 的安全性、实时性和效率需求

尾语

明天将要发布的代码选择 Go,在未来五年内保持不变的代码选择 RustGrzegorz Nosek

Rust不仅仅是一种编程语言,它代表了一种专注于安全性、性能和开发者体验的系统级编程新范式。学习Rust就是为未来投资,感兴趣地朋友可以尝试尝试