Rust 是一门系统级别的编程语言。
Rust 由 Graydon Hoare 开发并在被 Mozilla 实验室收购后发扬光大。
相关资源
Rust官网:https://www.rust-lang.org/
Rust编译器的源码:https://github.com/rust-lang/rust
语言设计和相关讨论:https://github.com/rust-lang/rfcs
Rust标准库文档:https://doc.rust-lang.org/std/
Rust官方管理仓库:https://crates.io/ 浏览Rust社区热门开源库
Rust中文社区:https://rustlang-cn.org/
https://tokio-zh.github.io/
Rust语言中文社区:https://rust.cc/
Rust 语言可以用于开发:
Rust 的编译工具依赖 C 语言的编译工具,这意味着你的电脑上至少已经存在一个 C 语言的编译环境。如果你使用的是 Linux 系统,往往已经具备了 GCC 或 clang。如果你使用的是 macOS,需要安装 Xcode。如果你用的是 Windows 操作系统,你需要安装 Visual Studio 2013 或以上的环境(需要 C/C++ 支持)以使用 MSVC 或安装 MinGW + GCC 编译环境(Cygwin 还没有测试)。
2、Rust语言怎么来的?
Rust历史
1、Rust 最早是 Mozilla 雇员 Graydon Hoare 的一个个人项目,从 2009 年开始,得到了 Mozilla 研究院的支助,2010 年项目对外公布。2010 ~2011 年间实现的自举。在 2015 年 5 月 15日发布了 1.0 版。在研发过程中,Rust 建立了一个强大活跃的社区,形成了一整套完善稳定的项目贡献机制,任何开发者都可以直接给这个项目提bug或者直接贡献源码。
2、Rust深受多种语言的影响,是一种支持多模式编程(命令、函数以及面向对象)的类似C的语言
3、Rust语言有什么优势和特点?
说RUST语言的优势,估计能说出一大堆理由来,然而,最大的理由就是 字节跳动、亚马逊、苹果等已经用上了 Rust 语言了。这意味着学好 Rust 语言就有机会找到高薪的工作。
此外,正如 Rust 语言自己说的优势:
Rust 语言支持用现代语言特性来写一些系统级别乃至机器级别的程序。
众所周知,Java 和 C# 语言 一般用于构建面向用户服务的软件。比如电子表格,文字处理器,Web 应用程序或移动应用程序等业务应用程序。
至于面向机器的那些系统级别应用程序,因为对性能和并发有极高的要求,系统、软件以及软件平台所采用的语言几乎都是清一色的 C 语言 和 C++ 语言,比如它们操作系统,游戏引擎,编译器等。这些编程语言需要很大程度的硬件交互。
系统级别和应用程序级别编程语言面临两个主要问题:
Rust语言是一门开源的系统编程语言,有3大特点:
运行快,
防止 段错误,
保证线程安全。
什么是系统级编程语言:
系统级编程是相对于应用级编程而言的。一般来说,系统级编程语言意味着更底层的位置,更接近硬件层次,并为上层的应用软件提供支持。系统级语言一般具有以下特点:
可以在资源相对有限的环境下执行
运行时开销很小,非常高效
很小的运行库,甚至没有
可以允许直接的内存操作
目前应用最广泛的系统编程语言是C/C++。
Rust作为系统级编程语言,它的基本理念是 “零开销抽象”
运行快
Rust是一种静态类型的编译性语言,类似C++。编译型语言,无须大规模的运行时(runtime)支持,也没有自动内存回收(GC)机制
防止 段错误
1、什么叫做段错误?
一个进程在执行的时候,它所占用的内存的虚拟地址空间一般被分割成好几个区域,我们称为“段”,进程中的每个段通过硬件MMU映射到真正的物理空间;在这个映射过程中,我们还可以给不同的段设置不同的访问权限,比如代码段只读不写;进程在执行过程中,如果违反了这些权限,CPU就会直接尝试一个硬件异常;硬件异常会被操作系统内核处理,一般内存会向对应的进程发送一条信号;如果没有实现自己特殊的信号处理函数,默认这个进程会直接退出;如果操作系统打开了core dump功能,在进程退出时操作系统会把它当时的内存状态,寄存器状态以及各种相关信息保存到一个文件中,供用户以后调试使用
2、什么会引起内存不安全?
访问未定义内存会引起不可知错误
空指针:
解引用空指针是不安全的,会引起段错误。这块地址空间一般是受保护的。
野指针 :
野指针就是未初始化的指针,指针可能会指向受保护的区域
悬浮指针:
悬浮指针是指内存空间在被释放了之后继续使用,和野指针一样,会读写不属于这个指针的内存
非法释放
同一个指针释放两次
缓冲区溢出
指针访问越界,会读取或者修改临近内存空间的值
执行非法指针
如果一个函数指针不是准确的指向一个函数地址,那么调用这个函数指针会导致一段随机数据被当中指令来执行,非常危险
使用未初始化内存
数据竞争
并发时针对同一块内存同时读写,没有同步
2、类似空指针、野指针等绝不会在Rust中产生,因为Rust禁用所有裸指针,而且取消了空值,通过引用和接用这一方式替代。
3、Rust不需要手动管理内存:
在Rust之前其他编程语言管理内存的方式有两种
比如Jave和Python的方式无非是使用垃圾回收算法(GC),垃圾回收算法一定会有运行时和垃圾回收时的停顿,不适合系统编程。
C++手工管理内存,手工管理内存可能会出现内存泄漏和悬停指针之类的问题。
Rust通过生命周期和所有权特性,就可以实现内存的自动回收。
Rust与 C++对比
与 C++ 相比,Rust 的安全性高出很多。Rust 既能保护自己的抽象,也能保护开发人员创建的抽象,而 C++ 这两方面都做不到。C++ 中某些错误会导致不可预测的行为,而 Rust 则可以帮助你专心做好重要的工作。虽然 C/C++ 仍然是最流行的编程语言之一,但二者也有一些不可避免的问题。另外,Rust 更容易上手,学习曲线不是很陡峭。Rust 没有 C++ 那样的技术债务,并发性更容易实现,而性能与 C/C++ 也差不多。Rust 允许程序员编写不安全的代码,但在没有特别指明的情况下只允许安全的代码。
Rust与 Java对比
Java的速度远不如 Rust。此外,Rust 的启动速度更快,占用的内存更小。Java 使用垃圾回收进行内存管理,这会降低性能(尽管这可以降低编程的难度)。
Rust与 Python对比
Rust的设计更好。Rust 允许将多条语句放入 lambda中,这样一切都可以用表达式表示,因此更容易创建语言的特定部分。而 Python 缺少这样的支持。Rust 没有类,所以面向对象不如 Python 发展得那么好
4、Rust一举解决了并发条件下的数据竞争(Data Race)问题怎么解决的?它从编译阶段就将数据竞争解决在了萌芽状态,保障了线程安全。所有跟线程安全相关的特性,都不是在编译器中写死的。用户可以用库的形式实现各种高效且安全的并发编程模型,进而充分利用多核时代的硬件性能。
Rust语言是内存安全且与操作系统无关的,这意味着它可以在任何计算机上运行。
Rust 的目标是成为高并发且高安全的系统级语言,但这并不代表它就不能开发 Web 应用。
Rust 支持通过把代码编译成 Web Assembly (WASM) 语言从而能够在浏览器端以实现快速,可靠的运行。
Web Assembly (WASM) 语言是被设计用来在浏览器端/嵌入式设别上运行的,用于执行 CPU 计算密集型的语言。
也就是说 Web Assembly (WASM) 语言 的目标是和 Javascript 一样能够在浏览器里运行,但因为是编译型,所以更高效。
4、Rust是如何发布?
Rust的版本号
Rust编译器的版本号采用了“语义化版本号”(Semantic Versioning)规划。在这个规则之下,版本格式为:主版本号.次版本号.修订号。版本号递增规则如下。
主版本号:不兼容的API
次版本号:向下兼容的功能性
修订号:向下兼容的问题
Rust的第一个正式版本号是1.0,是2015年5月发布的。从那以后,只要版本没有出现大规模的不兼容的升级,大版本号就一直维持在“1”,而次版本号会逐步升级。Rust一般以6个星期更新一个正式版本的速度进行迭代。
Rust的发布策略
为了兼顾更新速度以及稳定性,Rust使用了多渠道发布的策略:
nightly版本
beta版本
stable版本
nightly版本是每天在主版本上自动创建出来的版本,功能最多,更新最快,但是某些功能存在问题的可能性也更大。因为新功能会首先在这个版本上开启,供用户试用。
beta版本是每隔一段时间,将一些在nightly版本中验证过的功能开放给用户使用。是stable版本的“预发布”版本
stable版本则是正式版,它每隔6个星期发布一个新版本,也是
最稳定、最可靠的版本,保证向前兼容。
Rust的发布步骤
1、Rust语言每个相对复杂一点的新功能,都要经历如下步骤才算真正稳定可用:RFC→Nightly→Beta→stable。
2、Rust语言相对重大的设计,必须经过RFC(Request For Comments)设计步骤。这个步骤主要是用于讨论如何“设计”语言。这个项目存在于https://github.com/rust-lang/rfcs。所有大功能必须先写好设计文档,讲清楚设计的目标、实现方式、优缺点等,让整个社区参与讨论,然后由“核心组”(Core Team)的成员决定是否接受这个设计。
3、在2017年下半年,Rust设计组提出了一个基于epoch的演进策略edition,让Rust的兼容性保证是一个有时限的长度,而不是永久。
举个例子:假设要添加一个功能,比如增加一个关键字。这件事情肯定是不兼容的改变,因为用户写的代码中很可能包含用这个关键字命名的变量、函数、类型等,直接把这个单词改成关键字会直接导致这些遗留代码出现编译错误。那怎么办呢?首先会在下一个edition中做出警告,提示用户这个单词已经不适合作为变量名了,请用户修改。但是这个阶段代码依然能编译通过。然后到再下一个edition的时候,这个警告就会变成真正的编译错误,此时这个关键字就可以真正启用了。先编译警告,再编译错误,这个过程可能会持续好几年,所以Rust的稳定性还是基本上有保证的。
目前已经发布了2015 edition和2018 edition。
5、为什么说 Rust 是未来
1.Rust 提高了内存安全性
长期以来,困扰开发人员的最大问题之一就是内存管理。其他语言中很容易错过某些代码问题,而这反过来又会产生可怕的错误代码,查找和修复这些错误需要花费大量时间。一个更大的问题是,代码中的错误会导致安全漏洞,在当今世界,安全漏洞可太危险了。大型网站或应用程序中的数据安全漏洞事件频频发生。原因往往是应用程序漏洞或配置错误。
Rust提高了内存安全性。Rust 代码不能有任何悬空指针、缓冲区溢出或任何其他类型的与内存相关的错误。开发人员可以定义应该如何管理内存以及如何将值放入其中,既可以管理内存、保证安全性,又不会损失性能,这是 Rust 的一个巨大的优势。
提高内存安全性是 Rust 开发人员的主要目标之一,也是该语言最重要的卖点。Rust 的代码编译器非常严格,每一个变量或内存地址都会被自动检查。如果发现任何语法错误、空值、悬空修饰符或内存安全问题,Rust 就不会编译代码,并通过警告显示不安全的代码,以便开发人员快速发现和修复主要问题。那么,Rust 是如何实现这一点的呢?
在 Rust 中,每个值都有“所有权”。当传递或返回一个值时,所有权就会被重新分配到某个作用域,而且只会分配到一个作用域。如果值的“所有者”离开该作用域,则该值将被删除。Rust就是通过这种方式跟踪内存,自动释放内存,并防止所有 bug 进入主代码。这意味着在运行时不会发生意外!该系统将在编译时分析内存管理,帮助开发人员更快地识别和修复 bug,因此也不需要使用垃圾收集。
但内存管理不止这么简单。高级系统常常涉及大量的计算密集型工作,而且还会创建大量的临时内存。这种负载会对 Java 虚拟机性能产生负面影响,而且许多编程语言(包括 Scala)根本无法处理它。
然而,Rust 却可以。Rust不需要管理内存,也无需使用像闭包之类的现代便利特性,就能支持编写有效使用内存的代码,而且运行时开销小到几乎没有,因此可用于实时或嵌入式项目,而且也可以与其他语言或项目轻松集成。
2.不断发展的社区
虽然 Rust 社区和库的数量远不及 C++ 等,但随着 Rust 语言的日益流行,加入社区的开发人员和爱好者也在不断增加。社区创建的框架、库和开发工具的数量已经接近 5.7万,并且每天都在增加。
除了不断增长的工具和框架库之外,Rust 还有一个活跃且受欢迎的社区。无论你需要解决某个问题,还是想寻找使用 Rust的技巧和窍门,都可以通过社区获得帮助。除了社区聊天和用户论坛,Rust 还有一个活跃的 reddit 子论坛。
下面是几个新兴的社区项目:
● redox:用 Rust 编写的操作系统;
● cgmath:线性代数和计算机图形库;
● Iron:并发 Web 框架;
● Doom renderer。
3.Rust 的速度非常快,而且非常灵活
Rust是一种速度非常快的编程语言,它的运行速度比 Scala 还快,尤其是在一些重视性能的任务中,Rust 尤为突出。在某些领域,Rust 的运行速度甚至比 Scala 或 Java 快三倍。
此外,挑选和使用 Rust 的外部包也很容易,而且 Rust 的打包构建工具也让编写代码变得非常简单。
Rust之所以这么快,原因有几个:
● 它是静态类型的编译语言,编译器可以优化代码,以提高速度;
● 提供 trait 的静态调度:类似于 C++ 模板,但更清晰;
● 明确跟踪变量的所有权。不会假设任何带有地址的变量随时都可以修改,因此可以在不对代码产生负面影响的情况下进行优化;
● 默认变量是不可变的(因此优化更容易);
● 提供了代数数据类型,也很适合优化;
● 存储数据没有任何开销,没有运行时或由于缺乏垃圾收集而突然暂停;
● 提供了零成本抽象。
Rust不仅便于优化,而且开发高级功能也很轻松。
4.使用广泛
Rust不仅性能优异,而且还提供了安全的执行环境;虽然 Rust 是高级函数式编程语言,但可以进行底层的优化。
你可以认为 Rust 是一种低级语言,适合各种系统,尤其是嵌入式或其他注重性能的系统。据说,它还被用于 3D 视频游戏开发。
为什么 Rust 广受全世界开发人员的喜爱?首先,你可以编写出永远不会出错的代码,因为编译器会检查所有内容。其他编程语言在运行时检测到的问题不会出现在 Rust 中。我们可以使用 Rust 编写出安全、高效的抽象,而且它的安全性几乎消除了使用不变性的需求。
许多人认为 Rust 是一种注重性能、速度和安全质量的新兴创新编程语言。
Rust是一种流行的加密货币和区块链编程语言,因为 Rust 易于理解和学习,在保障性能的同时还提供了安全性。此外,Rust 还为这些开发人员提供了工具,让他们更快地交付代码。选择 Rust 编写的加密货币不太可能崩溃,而且比使用其他编程语言更安全。
5.很多大公司都使用 Rust
尽管 Rust 是一种相对年轻的语言,但在提高编程安全性和易用性方面,Rust 已成为很多开发人员的首选。此外,不仅开发人员对 Rust 感兴趣,一些公司和企业,尤其是大型公司,也已经使用 Rust 或正在计划使用 Rust。于今年 5 月份举行的AllThingsOpen 虚拟会议上,Ryan Levick(微软云开发倡导者)表示,Rust 作为一种语言是“业界正面解决多个问题的最佳选择”。虽然微软不打算在近期内放弃使用 C++,但他们的许多基础设施正在慢慢转移到 Rust。
除了微软之外,还有很多公司也都意识到了改用 Rust 的潜在好处,比如Dropbox、Sentry、亚马逊和 Mozilla 等。
6、开发者为什么觉得:Rust 太难学了!
虽然和一些老牌语言 C/C++ 相比,Rust 正在迅速捕获开发者的关注,但是据官方调查报告显示,Rust 仍有许多急需完善之处。譬如以下几点:
与 C++ 的互操作需要进一步提升
有些出乎意料的是,Rust 与 C ++ 的互操作是开发者最为期待的,其次分别是 C、Python。实际上,对于使用大型代码库(100,000 行代码或更多)的开发者而言,实现与 C ++ 的互操作是改善 Rust 编程体验以及缩短编译时间最为直观的方法。
Rust 太难上手,尤其是生命周期
当被问及如何提高 Rust 的采用率时,不少开发者提到需要降低 Rust 的门槛,让 Rust 更容易被学习。其中,15.8% 的受访者直言,如果“不那么令人恐惧,或更容易学习以及不太复杂”,他们会想要更多地使用 Rust。至于怎么降低 Rust 入门门槛,开发者的建议是增加官方文档和培训。
当受访者对Rust的专业知识进行评分时,在10人中有7人是一个明显的高峰。很难说这是跨语言比较的,但是似乎很少有人愿意声称拥有全部专业知识。但是,与去年相比,Rust社区似乎确实在获得该语言的专业知识。
当问及具体是哪部分很难时,61.4% 开发者大呼 Rust 的生命周期难度最高。因为 Rust 的生命周期是一个非常难以理解的概念,同时这也是 Rust 独有的概念。
不过,根据调查报告,拥有系统编程知识(至少具备一定的 C/C++ 经验)的开发者在使用 Rust 会更得心应手一些。对此,Rust 官方在进行调研时,也让受访者进行了自评,结果显示,如果具有系统编程经验的开发者在自己的 Rust 专业知识中自评为 5.5 分(满分10);诸如学过 Java 或 C# 等语言的开发者自评为 4.9 分;如果仅具有动态类型语言(如 Ruby、JavaScript)经验的开发者,自评为 4.8 分。这其中存在一定的差异。
Rust 生命周期机制是与所有权机制同等重要的资源管理机制。
之所以引入这个概念主要是应对复杂类型系统中资源管理的问题。
引用是对待复杂类型时必不可少的机制,毕竟复杂类型的数据不能被处理器轻易地复制和计算。
部分内容引用自:
CSDN博主「OceanStar的学习笔记」的原创文章。
https://blog.csdn.net/zhizhengguan/article/details/85251282
RUST官网 https://www.rust-lang.org/
《Rust 程序设计语言 简体中文版》https://kaisery.github.io/trpl-zh-cn/ch03-01-variables-and-mutability.html
《rustprimer》 https://rustcc.gitbooks.io/rustprimer/content/1st-glance/
《深入浅出Rust》
菜鸟编程 RUST教程
https://www.runoob.com/rust/rust-tutorial.html