|
|
@ -1,92 +1,91 @@
|
|
|
|
# 介绍
|
|
|
|
# 简介
|
|
|
|
|
|
|
|
|
|
|
|
> [ch00-00-introduction.md](https://github.com/rust-lang/book/blob/main/src/ch00-00-introduction.md)
|
|
|
|
> [ch00-00-introduction.md](https://github.com/rust-lang/book/blob/main/src/ch00-00-introduction.md)
|
|
|
|
> <br>
|
|
|
|
> <br>
|
|
|
|
> commit 578591a3db98bc645aae4bcc2eed85db458a4e24
|
|
|
|
> commit d036f7f049fb4884f63993901ff14d674c8dfb09
|
|
|
|
|
|
|
|
|
|
|
|
> 注意:本书的版本与出版的 [The Rust Programming Language][nsprust]
|
|
|
|
> 注意:此书的英文原版与 [No Starch Press][nsp] 出版的纸质版和电子版《[The Rust Programming Language][nsprust]》一致。
|
|
|
|
> 和电子版的 [No Starch Press][nsp] 一致
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[nsprust]: https://nostarch.com/rust
|
|
|
|
[nsprust]: https://nostarch.com/rust
|
|
|
|
[nsp]: https://nostarch.com/
|
|
|
|
[nsp]: https://nostarch.com/
|
|
|
|
|
|
|
|
|
|
|
|
欢迎阅读 “Rust 程序设计语言”,一本介绍 Rust 的书。Rust 程序设计语言能帮助你编写更快、更可靠的软件。在编程语言设计中,高层工程学和底层控制往往不能兼得;Rust 则试图挑战这一矛盾。通过权衡强大的技术能力与优秀的开发体验,Rust 允许你控制底层细节(比如内存使用),并免受以往进行此类控制所经受的所有烦恼。
|
|
|
|
欢迎阅读《Rust 程序设计语言》,这是一本 Rust 语言的入门书。Rust 程序设计语言能帮助你编写更快、更可靠的软件。在编程语言设计中,上层的编程效率和底层的细粒度控制往往不能兼得,而 Rust 则试图挑战这一矛盾。Rust 通过平衡技术能力和开发体验,允许你控制内存使用等底层细节,同时也不需要担心底层控制带来的各种麻烦。
|
|
|
|
|
|
|
|
|
|
|
|
## 谁会使用 Rust
|
|
|
|
## Rust 适合哪些人
|
|
|
|
|
|
|
|
|
|
|
|
Rust 因多种原因适用于很多开发者。让我们讨论几个最重要的群体。
|
|
|
|
Rust 适合很多开发者,其原因多种多样。下面讨论几个最重要的群体。
|
|
|
|
|
|
|
|
|
|
|
|
### 开发者团队
|
|
|
|
### 开发团队
|
|
|
|
|
|
|
|
|
|
|
|
Rust 被证明是可用于大型的、拥有不同层次系统编程知识的开发者团队间协作的高效工具。底层代码中容易出现种种隐晦的 bug,在其他编程语言中,只能通过大量的测试和经验丰富的开发者细心的代码评审来捕获它们。在 Rust 中,编译器充当了守门员的角色,它拒绝编译存在这些难以捕获的 bug 的代码,这其中包括并发 bug。通过与编译器合作,团队将更多的时间聚焦在程序逻辑上,而不是追踪 bug。
|
|
|
|
实践证明,对于大规模的开发团队,即使成员的系统编程水平不同,Rust 仍是高效的协作工具。底层代码中容易出现很多不易察觉的 bug。在其他编程语言中想要找到它们,只能设计大量的测试,并且让经验丰富的开发者细心审核代码。在 Rust 中,编译器充当了守门员的角色。如果代码中存在这些难找的 bug,比如并发的 bug,它会拒绝编译。只要与编译器协同工作,团队就可以花更多的时间聚焦在程序逻辑上,无需费心找 bug。
|
|
|
|
|
|
|
|
|
|
|
|
Rust 也为系统编程世界带来了现代化的开发工具:
|
|
|
|
Rust 也为系统编程世界带来了现代化的开发工具:
|
|
|
|
|
|
|
|
|
|
|
|
* Cargo,内置的依赖管理器和构建工具,它能轻松增加、编译和管理依赖,并使其在 Rust 生态系统中保持一致。
|
|
|
|
* Cargo 是内置的依赖管理器和构建工具,它能轻松增加、编译和管理依赖,并使依赖在 Rust 生态系统中保持一致。
|
|
|
|
* Rustfmt 确保开发者遵循一致的代码风格。
|
|
|
|
* Rustfmt 确保开发者遵循一致的代码风格。
|
|
|
|
* Rust Language Server 为集成开发环境(IDE)提供了强大的代码补全和内联错误信息功能。
|
|
|
|
* Rust Language Server 为集成开发环境(IDE)提供了强大的代码补全和内联错误信息功能。
|
|
|
|
|
|
|
|
|
|
|
|
通过使用 Rust 生态系统中的这些和其他工具,开发者可以在编写系统层面代码时保持高生产力。
|
|
|
|
通过使用 Rust 生态系统中丰富的工具,开发者可以更高效地编写系统层面代码。
|
|
|
|
|
|
|
|
|
|
|
|
### 学生
|
|
|
|
### 学生
|
|
|
|
|
|
|
|
|
|
|
|
Rust 适用于学生和有兴趣学习系统概念的人。通过 Rust,很多人已经了解了操作系统开发等主题。社区非常欢迎和乐于解答学生们的问题。通过本书的努力,Rust 团队希望系统概念能被更多人了解,特别是编程新手。
|
|
|
|
Rust 适合学生群体,也适合有兴趣学习系统概念的人。很多人利用 Rust 学习了操作系统开发等内容。Rust 社区欢迎学生提问,也乐于解答问题。Rust 团队希望系统概念能让更多人了解,尤其是编程新手,为此编写了这本书以及其他内容。
|
|
|
|
|
|
|
|
|
|
|
|
### 公司
|
|
|
|
### 公司
|
|
|
|
|
|
|
|
|
|
|
|
数以百计的公司,无论规模大小,都在生产中使用Rust来完成各种任务。这些任务包括命令行工具、web 服务、DevOps 工具、嵌入式设备、音视频分析与转码、加密货币(cryptocurrencies)、生物信息学(bioinformatics)、搜索引擎、物联网(internet of things, IOT)程序、机器学习,甚至还包括 Firefox 浏览器的大部分内容。
|
|
|
|
大大小小的公司都已在生产中使用 Rust 来完成各种任务,包括命令行工具、网络服务、DevOps 工具、嵌入式设备、音视频分析与转码、加密货币、生物信息学、搜索引擎、物联网(IOT)程序、机器学习等,甚至 Firefox 浏览器的主要部分也是用 Rust 编写的。
|
|
|
|
|
|
|
|
|
|
|
|
### 开源开发者
|
|
|
|
### 开源开发者
|
|
|
|
|
|
|
|
|
|
|
|
Rust 适用于希望构建 Rust 编程语言、社区、开发工具和库的开发者。我们很乐意您为 Rust 语言做贡献。
|
|
|
|
Rust 适合那些希望构建 Rust 编程语言、社区、开发工具和库的开发者。我们欢迎你为 Rust 语言贡献力量。
|
|
|
|
|
|
|
|
|
|
|
|
### 重视速度和稳定性的开发者
|
|
|
|
### 重视速度和稳定性的开发者
|
|
|
|
|
|
|
|
|
|
|
|
Rust 适用于追求编程语言的速度与稳定性的开发者。所谓速度,是指你用 Rust 开发出的程序运行速度,以及 Rust 提供的程序开发速度。Rust 的编译器检查确保了增加功能和重构代码时的稳定性。这与缺少这些检查的语言形成鲜明对比,开发者通常害怕修改那些脆弱的遗留代码。力求零开销抽象(zero-cost abstractions),把高级的特性编译成底层的代码,这样写起来很快,运行起来也很快,Rust 致力于使安全的代码也同样快速。
|
|
|
|
Rust 适合追求编程语言的速度与稳定性的开发者。使用 Rust,不仅写出来的程序运行速度快,写代码的速度也快。Rust 编译器会检查代码,确保增加功能、重构代码时的稳定性。与之相比,其他的一些语言没有检查功能,导致开发者往往不敢修改脆弱的祖传代码。Rust 力求将高级语言特性编译成底层代码,并且与手写的代码运行速度同样快,这一概念称为零开销抽象(zero-cost abstractions),可以让代码又安全又快速。
|
|
|
|
|
|
|
|
|
|
|
|
Rust 语言也希望能支持很多其他用户,这里提及的只是最大的利益相关者。总的来讲,Rust 最重要的目标是消除数十年来程序员不得不做的权衡:安全 **与** 生产力,速度 **与** 人机交互的顺畅度(ergonomics)。请尝试 Rust,看看这个选择是否适合你。
|
|
|
|
这里提到的只是较大的几个受益群体,Rust 语言也希望能支持更多其他用户。总之,Rust 最重要的目标是消除数十年来程序员习以为常的取舍,让安全和高效、速度和易读易用**可以兼得**。试试看 Rust,说不定它的选择就适合你。
|
|
|
|
|
|
|
|
|
|
|
|
## 本书是写给谁的
|
|
|
|
## 本书适合哪些人
|
|
|
|
|
|
|
|
|
|
|
|
本书假设你已经使用其他编程语言编写过代码,但并不假设你使用的是何种语言。我们尝试使这些参考资料能广泛的适用于来自很多不同编程背景的开发者。我们不会花费很多时间讨论编程 **是** 什么或者如何理解它。如果编程对于你来说是完全陌生的,你最好先阅读专门介绍编程的书籍。
|
|
|
|
本书假设你已经有其他编程语言的经验,任何语言均可,我们尽可能让各种语言背景的人都能读懂。本书的重点不是程序设计**本身**,也不是程序设计思维。如果你完全没学过编程,建议你先阅读专门介绍程序设计的书籍。
|
|
|
|
|
|
|
|
|
|
|
|
## 如何阅读本书
|
|
|
|
## 如何阅读本书
|
|
|
|
|
|
|
|
|
|
|
|
总体来说,本书假设你会从头到尾顺序阅读。稍后的章节建立在之前章节概念的基础上,同时之前的章节可能不会深入讨论某个主题的细节;通常稍后的章节会重新讨论这些主题。
|
|
|
|
本书推荐从头到尾顺序阅读,因为靠后的章节需要前面章节的概念基础。前面的章节可能不会深入介绍部分主题,而是留待后续章节重新讨论。
|
|
|
|
|
|
|
|
|
|
|
|
你会在本书中发现两类章节:概念章节和项目章节。在概念章节中,我们学习 Rust 的某个方面。在项目章节中,我们应用目前所学的知识一同构建小的程序。第二、十二和二十章是项目章节;其余都是概念章节。
|
|
|
|
本书分为两类章节:概念章节和项目章节。在概念章节中,我们学习 Rust 的某个方面。在项目章节中,我们应用目前所学的知识一同构建小型程序。第 2、12、20 章是项目章节;其余都是概念章节。
|
|
|
|
|
|
|
|
|
|
|
|
第一章介绍如何安装 Rust,如何编写 “Hello, world!” 程序,以及如何使用 Rust 的包管理器和构建工具 Cargo。第二章是 Rust 语言的实战介绍。我们会站在较高的层次介绍一些概念,而将详细的介绍放在稍后的章节中。如果你希望立刻就动手实践一下,第二章正好适合你。开始阅读时,你甚至可能希望略过第三章,它介绍了 Rust 中类似其他编程语言中的功能,并直接阅读第四章学习 Rust 的所有权系统。然而,如果你是特别重视细节的学习者,并倾向于在继续之前学习每一个细节,你可能希望略过第二章并直接阅读第三章,并在想要构建项目来实践这些细节时再回来阅读第二章。
|
|
|
|
第 1 章介绍如何安装 Rust,如何编写 “Hello, world!” 程序,以及如何使用 Rust 的包管理器和构建工具 Cargo。第 2 章是 Rust 语言的实战介绍。我们会站在较高的层次介绍一些概念,而将详细的介绍放在稍后的章节中。如果你希望立刻就动手实践一下,第 2 章正好适合你。第 3 章介绍 Rust 中类似其他编程语言的特性,你可以选择跳过,直接阅读第 4 章学习 Rust 的所有权(ownership)系统。不过,如果你注重细节,可以跳过第 2 章直接看第 3 章,之后想要写项目的时候再回来看第 2 章。
|
|
|
|
|
|
|
|
|
|
|
|
第五章讨论结构体和方法,第六章介绍枚举、`match` 表达式和 `if let` 控制流结构。在 Rust 中,你将使用结构体和枚举创建自定义类型。
|
|
|
|
第 5 章讨论结构体(struct)和方法,第 6 章介绍枚举(enum)、`match` 表达式和 `if let` 控制流结构。在 Rust 中,创建自定义类型需要用到结构体和枚举。
|
|
|
|
|
|
|
|
|
|
|
|
第七章你会学习 Rust 的模块系统和私有性规则来组织代码和公有应用程序接口(Application Programming Interface, API)。第八章讨论了一些标准库提供的常见集合数据结构,比如 可变长数组(vector)、字符串和哈希 map。第九章探索了 Rust 的错误处理哲学和技术。
|
|
|
|
第 7 章介绍 Rust 的模块(module)系统,其中的私有性规则用来组织代码和公开的 API(应用程序接口)。第 8 章讨论标准库提供的常见集合数据结构,例如 Vector(向量)、字符串和 Hash Map(散列表)。第 9 章探索 Rust 的错误处理技术和理念。
|
|
|
|
|
|
|
|
|
|
|
|
第十章深入介绍泛型、trait 和生命周期,他们提供了定义出适用于多种类型的代码的能力。第十一章全部关于测试,即使 Rust 有安全保证,也需要测试确保程序逻辑正确。第十二章,我们构建了属于自己的在文件中搜索文本的命令行工具 `grep` 的子集功能实现。为此会利用之前章节讨论的很多概念。
|
|
|
|
第 10 章深入介绍泛型(generic)、Trait 和生命周期(lifetime),用这些特性可以写出适用多种类型的代码。第 11 章介绍测试,因为就算 Rust 有安全保证,也需要测试确保程序逻辑正确。`grep` 命令可以查找文件中的文本,第 12 章中我们将会构建一个命令行工具实现它的部分功能,为此会用到之前章节讨论的很多概念。
|
|
|
|
|
|
|
|
|
|
|
|
第十三章探索了闭包和迭代器:Rust 中来自函数式编程语言的功能。第十四章会更深层次的理解 Cargo 并讨论向他人分享库的最佳实践。第十五章讨论标准库提供的智能指针以及启用这些功能的 trait。
|
|
|
|
第 13 章探索闭包(closure)和迭代器(iterator),这两个特性来自函数式编程语言。第 14 章会深入探讨 Cargo 并介绍分享代码库的最佳实践。第 15 章讨论标准库提供的智能指针以及相关的 Trait。
|
|
|
|
|
|
|
|
|
|
|
|
第十六章会学习不同的并发编程模型,并讨论 Rust 如何助你无畏的编写多线程程序。第十七章着眼于比较 Rust 风格与你可能熟悉的面向对象编程原则。
|
|
|
|
第 16 章介绍几类并发编程模型,并讨论 Rust 如何助你无畏地编写多线程程序。第 17 章着眼于比较 Rust 风格与 OOP(面向对象编程)原则。
|
|
|
|
|
|
|
|
|
|
|
|
第十八章是关于模式和模式匹配的参考章节,它是在Rust程序中表达思想的有效方式。第十九章是一个高级主题大杂烩,包括 unsafe Rust、宏和更多关于生命周期、 trait、类型、函数和闭包的内容。
|
|
|
|
第 18 章介绍模式和模式匹配,它是在 Rust 程序中表达思想的有效方式。第 19 章是一个高级主题大杂烩,包括不安全 Rust(unsafe Rust)、宏(macro)和更多关于生命周期、Trait、类型、函数和闭包的内容。
|
|
|
|
|
|
|
|
|
|
|
|
第二十章将会完成一个项目,我们会实现一个底层的、多线程的 web server!
|
|
|
|
第 20 章我们将会完成一个项目,实现一个底层的、多线程的网络服务器!
|
|
|
|
|
|
|
|
|
|
|
|
最后是一些附录,包含了一些关于语言的参考风格格式的实用信息。附录 A 介绍了 Rust 的关键字。附录 B 介绍 Rust 的运算符和符号。附录 C 介绍标准库提供的派生 trait。附录 D 涉及了一些有用的开发工具,附录 E 介绍了 Rust 的不同版本。
|
|
|
|
最后的附录包含一些实用信息,格式类似参考文档。附录 A 介绍 Rust 的关键字,附录 B 介绍 Rust 的运算符和符号,附录 C 介绍标准库提供的可派生 Trait,附录 D 涉及一些有用的开发工具,附录 E 介绍 Rust 的不同版本。
|
|
|
|
|
|
|
|
|
|
|
|
怎样阅读本书都不会有任何问题:如果你希望略过一些内容,请继续!如果你发现疑惑可能会再跳回之前的章节。请随意阅读。
|
|
|
|
本书没有错误的阅读方式,可以尽管跳过部分内容,遇到困惑时再回看前面的章节。
|
|
|
|
|
|
|
|
|
|
|
|
<span id="ferris"></span>
|
|
|
|
<span id="ferris"></span>
|
|
|
|
|
|
|
|
|
|
|
|
学习 Rust 的过程中一个重要的部分是学习如何阅读编译器提供的错误信息:它们会指导你编写出能工作的代码。为此,我们会提供很多不能编译的示例,以及各个情况下编译器会展示的错误信息。请注意如果随便输入并运行随机的示例代码,它们可能无法编译!请确保阅读任何你尝试运行的示例周围的内容,检视他们是否有意写错。Ferris 也会帮助你区别那些有意无法工作的代码:
|
|
|
|
学习 Rust 的一个重点在于了解如何阅读编译器提供的错误信息,它们会指导你编写出能运行的代码。为此,我们会提供很多无法通过编译的示例,并附上错误信息。运行示例代码的时候务必阅读上下文,看看这段代码是否是故意写错的,部分示例代码就是无法编译的!Ferris 也会帮助你分辨哪些代码是故意写错的:
|
|
|
|
|
|
|
|
|
|
|
|
| Ferris | 意义 |
|
|
|
|
| Ferris | 含义 |
|
|
|
|
|------------------------------------------------------------------------|--------------------------------------------------|
|
|
|
|
|---------------------------------------------------------------------------------------------------------|--------------------------------|
|
|
|
|
| <img src="img/ferris/does_not_compile.svg" class="ferris-explain" alt="Ferris with a question mark"> | 这些代码不能编译! |
|
|
|
|
| <img src="img/ferris/does_not_compile.svg" class="ferris-explain" alt="Ferris 头上有问号"/> | 这段代码无法通过编译! |
|
|
|
|
| <img src="img/ferris/panics.svg" class="ferris-explain" alt="Ferris throwing up their hands"> | 这些代码会 panic! |
|
|
|
|
| <img src="img/ferris/panics.svg" class="ferris-explain" alt="Ferris 举起两只钳子"/> | 这段代码会 Panic! |
|
|
|
|
| <img src="img/ferris/not_desired_behavior.svg" class="ferris-explain" alt="Ferris with one claw up, shrugging"> | 这些代码不会产生期望的行为。 |
|
|
|
|
| <img src="img/ferris/not_desired_behavior.svg" class="ferris-explain" alt="Ferris 举起一只钳子并耸肩"/> | 这段代码的运行结果不符合预期。 |
|
|
|
|
|
|
|
|
|
|
|
|
在大部分情况,我们会指引你将任何不能编译的代码纠正为正确版本。
|
|
|
|
在大部分情况,我们会指导你将无法通过编译的代码修改为正确版本。
|
|
|
|
|
|
|
|
|
|
|
|
## 源代码
|
|
|
|
## 源代码
|
|
|
|
|
|
|
|
|
|
|
@ -94,6 +93,6 @@ Rust 语言也希望能支持很多其他用户,这里提及的只是最大的
|
|
|
|
|
|
|
|
|
|
|
|
[book]: https://github.com/rust-lang/book/tree/main/src
|
|
|
|
[book]: https://github.com/rust-lang/book/tree/main/src
|
|
|
|
|
|
|
|
|
|
|
|
> 译者注:本译本的 [GitHub 仓库][trpl-zh-cn],欢迎 Issue 和 PR :)
|
|
|
|
> 译者注:本译本的也有 [GitHub 仓库][trpl-zh-cn],欢迎提交 Issue 和 PR :)
|
|
|
|
|
|
|
|
|
|
|
|
[trpl-zh-cn]: https://github.com/KaiserY/trpl-zh-cn
|
|
|
|
[trpl-zh-cn]: https://github.com/KaiserY/trpl-zh-cn
|
|
|
|