• 为什么现在学Rust编程是最好时机?


    1.摘要

    Rust是由Mozilla主导开发的通用、编译型编程语言。设计准则为:安全、并发、实用,支持函数式、并发式、过程式以及面向对象的编程风格。Rust的设计目标之一,是要使设计大型的互联网客户端和服务器的任务变得更容易,因此更加强调安全性、存储器配置以及并发处理等方面的特性。

    在性能上,具有额外安全保证的Rust代码会比C++慢一些,例如:Rust对数组进行操作时会进行边界检查,而C++则不会。但如果等价的C++代码作手工检查,则两者性能是相似的。

    2.Rust核心里程碑

    Rust在很多重要场合越来越被重视并使用,例如:

    (1).Linux 6.1版本内核允许直接在内核中编写Rust代码,并可以调用内核的其它函数,主要实现方式是:1.在内核代码中可以直接嵌入Rust代码,Rust代码会被编译成内核可以理解的形式。2.Linux内核提供了一个叫"Rust for Linux"的接口,可以从Rust程序调用内核C函数。

    这样就允许开发者使用Rust编写驱动程序、文件系统、网络协议栈等内核代码,同时还可以与内核其他部分进行交互。

    Rust for Linux开源地址为:https://github.com/Rust-for-Linux/linux

    相比C语言,Rust提供了更好的内存安全保证,不会出现缓冲区溢出、野指针等问题。这可以大大提高内核代码的稳定性和安全性。

    Linux社区期望通过支持Rust, 可以吸引更多开发者为内核作贡献,并以更安全的方式提升内核功能。

    (2).windows-drivers-rs是微软开源的一个用于编写Windows内核驱动的Rust库, 这标志着微软开始拥抱Rust语言,在Windows内核和底层开发中使用Rust,这将大大提升Windows内核组件的安全性和稳定性。Rust有助于降低驱动开发的门槛,吸引更多开发者为Windows编写驱动,Rust的内存安全特性也使驱动质量更高。

    windows-drivers-rs开源地址:https://github.com/microsoft/windows-drivers-rs

    3.Rust独特设计理念

    3.1 内存安全

    为了提供内存安全, Rust的设计不允许空指针和悬空指针,指针只能透过固定的初始化形态来构建,而所有这些形态都要求它们的输入已经分析过了。Rust有一个检查指针生命周期和指针冻结的系统,可以用来预防在C++中许多的类型错误,甚至是用了智能指针功能之后会发生的类型错误。

    3.2所有权

    Rust设计了一个所有权系统,其中所有值都有一个唯一的所有者,并且值的作用域与所有者的作用域相同。值可以通过不可变引用、可变引用或通过值本身传递。任何时候,一个变量都可以有多个不可变引用或一个可变引用,这实际上是一个显示的读写锁。Rust编译器在编译时强制执行这些规则,并检查所有引用是否有效。

    3.3 内存管理

    早期的Rust虽然有垃圾回收系统,但非如Java或.NET平台的全自动垃圾回收。Rust 1.0已不再使用垃圾回收器,而是全面改用基于引用计数的智能指针来管理内存。

    3.4类型与多态

    Rust的类型系统直接地模仿了Haskell语言的类型类概念,并把它称作“traits”,可以把它看成是一种特设多态。Rust的作法是透过在宣告类型变量(type variable)的时候,在上面加上限制条件。至于Haskell的高阶类型变量(Higher-kinded polymorphism)则还未支持。

    类型推导也是Rust提供的特性之一,使用let语法宣告的变量可以不用宣告类型,亦不需要初始值来推断类型。但如果在稍后的程序中从未指派任何值到该变量,编译器会发出编译时(compile time)错误。函数可以使用泛型化参数(generics),但是必须绑定Trait。不能使用方法或运算符而不声明它们的类型,每一项都必确明确定义。

    Rust的物件系统是基于三样东西之上的,即实现(implementation)、Trait以及结构化资料(如struct)。实现的角色类似提供Class关键字的编程语言所代表的意义,并使用impl关键字。继承和多态则通过Trait实现,它们使得方法(method)可以在实现中被定义。结构化资料用来定义字段。实现和(trait)都无法定义字段,并且只有(trait)可以提供继承,藉以躲避C++的“钻石继承问题”(菱型缺陷)。

    4.Rust生态系统

    除了编译器和标准库,Rust生态系统还包括用于软件开发的额外组件。官方推荐使用Rustup,一个Rust工具链安装程序来管理这些组件。

    Cargo是Rust的软件包管理器,用来下载和构建依赖关系。Cargo还充当了Clippy和其他Rust组件的封装器。它要求项目遵循一定的目录结构。

    Cargo.toml文件指定了项目所需的依赖和版本要求,告诉Cargo哪些版本的依赖关系与该包兼容。Cargo默认从crates.io中获取依赖,但Git仓库和本地文件系统中的包也可以作为依赖。

    5.Rust发展历史

    2006年,Rust作为Graydon Hoare的个人项目首次出现。

    2009年,Graydon Hoare成为Mozilla雇员。

    2010年,Rust首次作为Mozilla官方项目出现。同年,Rust开始从初始编译转变为自编译。

    2011年,Rust成功的完成了移植。Rust的自编译器采用LLVM作为其编译后端。

    2012年1月20日,第一个有版本号的预览版Rust编译器发布。

    2013年4月4日,Mozilla基金会宣布将与三星集团合作开发浏览器排版引擎Servo,此引擎将由Rust来实现。

    2015年5月16日,Rust 1.0.0发布。

    2020年3月27日,Rust核心团队成员Steve Klabnik在官方博客发表了一篇名为《Goodbye, docs team 》的文章,叙述了Rust文档的现状。

    2021年2月8日,AWS、华为、Google、微软以及Mozilla宣布成立Rust基金会,并承诺在两年时间里每年投入不少于 100 万美元的预算,以用于 Rust 项目的开发、维护和推广。

    2022年9月19日,Linux初始开发者林纳斯·托瓦兹表示在Linux核心6.1版中会有对Rust的初步支持。

    2023年4月6日,Rust基金会发布了新商标政策草案,修订了关于如何使用Rust标志和名称的规则,导致了Rust用户社区的负面反应和抗议。

    6.Rust环境搭建

    6.1 Rust安装包

    如果使用的开发系统是MacOS、Linux或其它类Unix系统,可以直接打开命令终端输入以下命令安装:

    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

    如果开发环境是Windows,可以直接从以下地址下载exe程序安装:

    https://static.rust-lang.org/rustup/dist/x86_64-pc-windows-msvc/rustup-init.exe

    安装完成后,分别输入以下命令查看编译器和构建工具是否正常运行:

    1. rustc --version // 查看Rust编译器版本
    2. cargo --version // 查看Rust包管理器和构建工具版本

    6.2 Rust集成开发环境

    Rust集成开发环境我个人推荐JetBrains的RustRover, 专业且功能强大, 目前处在预览使用阶段, 可以免费使用,如图:

    也可以使用Microsoft Visual Studio Community 2022,在上面安装一个Rust插件效果也差不多, 如图:

    7.Rust编程体验

    以下是一个简单的Rust并发计算的例子:

    1. use std::thread;
    2. // 这个函数将创建十个并发
    3. fn main() {
    4. let greeting = "Hello";
    5. let mut threads = Vec::new();
    6. for num in 0..10 {
    7. threads.push(thread::spawn(move || {
    8. println!("{} from thread number {}", greeting, num);
    9. }));
    10. }
    11. for thread in threads {
    12. thread.join().unwrap();
    13. }
    14. }

    在后面的章节中, 我将与大家一起学习Rust语言的基础知识。

  • 相关阅读:
    【C++/嵌入式笔试面试八股】一、31.C++相关基础 | 函数 | 封装
    Elasticsearch:崭新的打分机制 - Learning To Rank (LTR)
    软件成分分析:华为云重磅发布开源软件治理服务
    A New Image Contrast Enhancement Algorithmusing Exposure Fusion Framework
    spark学习索引
    【Git】的分支和标签的讲解及实际应用场景
    带你一张图了解八种流行的网络协议
    【操作系统】进程管理(一)—— 进程
    安卓手机APP开发__媒体开发部分__使用媒体会话对播放进行控制和加广告
    【ESP 保姆级教程】疯狂Node.js服务器篇 ——教室WiFi自动打卡考勤(飞书群信息+NodeJs)
  • 原文地址:https://blog.csdn.net/suntiger/article/details/134081387