猜你喜欢
深入Rust标准库:必备的Rust语言高级指南

深入Rust标准库:必备的Rust语言高级指南

书籍作者:任成珺 ISBN:9787121475863
书籍语言:简体中文 连载状态:全集
电子书格式:pdf,txt,epub,mobi,azw3 下载次数:5843
创建日期:2024-06-27 发布日期:2024-06-27
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板
内容简介

本书深入分析了Rust标准库的源代码,并厘清了分析Rust标准库源代码的脉络。全书共14章。第1章对Rust标准库体系进行了概述性介绍;第2章分析了Rust的一些独特性;第3~8章分析了CORE库与ALLOC库,这两个库可用于编写操作系统内核与用户态应用程序;第9~13章分析了STD库,STD库仅用于编写用户态应用程序;第14章对异步编程进行了简单分析。

本书试图以标准库的源代码为基础分析Rust的一些最本质的内容,从而加快程序员掌握Rust的进程。Rust标准库也是Rust编码技巧、程序设计、架构设计的“结晶”,因此,本书大量篇幅集中在对这些内容的分析上。


作者简介

任成珺

拥有超过20年的系统级程序架构及开发经验,至今仍活跃在开发一线。

王晓娜

博士,任职于中国兵器工业集团公司北方科技信息研究所,善于深入浅出地解读艰深技术。

韩龙

硕士,任职于中信银行,从事多年IT基础设施及云服务规划与设计。


编辑推荐
适读人群 :资深程序员,准备深入学习RUST,已经对RUST有一定经验的程序员

本书是Rust操作系统编程指南,深入浅出地介绍了Rust语言的核心奥秘

本书由具有20年系统级程序架构及开发经验的专家领衔撰写

本书对Rust的标准库代码进行了深入分析,适合具有一定Rust经验的程序员阅读


前言

前言




我对Rust的兴趣始于一个新闻:Linux Torvalds有意向将Rust作为Linux Kernel的开发语言(Linux Kernel 6.1已经正式被纳入Rust)。开始学习Rust后,我便立刻意识到它对所有程序员的巨大价值。Rust是较理想的编程语言,使用它开发的程序在执行效率上不输于其他任何高级编程语言。同时,Rust是一门内存安全的语言,具有极高的生产力(掌握它之后),其语法会自然导出良好的程序设计与架构。Rust的缺点也是显而易见的,相比于其他语言,它明显需要程序员花费更多的时间入门,这是因为Rust把程序世界的许多奥秘放在了入门阶段。

本书目的

本书试图通过对Rust标准库源代码系统的分析,帮助读者理解标准库所定义的类型、函数,缩短读者在Rust入门阶段所花费的时间。

熟练掌握一门编程语言的最佳途径就是深入分析、学习、理解优秀的代码。Rust标准库源代码正是最理想的素材。

Rust标准库具有完善的注释,但这些注释的目的是作为标准库的指南,缺乏系统性及一些语言语法性质的内容,这促使了本书的诞生。

本书疏理了标准库源代码的脉络以便读者学习及研究,避免读者在学习Rust时陷入一团混乱中。本书对标准库源代码中与所有权、生命周期、内存安全相关的部分着重进行了注释分析,以加快读者对这3个概念的理解。本书还对每一个标准库数据类型背后的需求及解决方案思路进行了探讨,并针对Rust的某些设计理念、设计架构、设计思路进行了重点说明,以便读者理解Rust程序设计的思维和习惯。

目标读者

本书不适合初学编程的读者。本书的最佳学习对象是资深的、掌握了Rust初步语法的C/C++程序员。本书也适合已经对Rust基础语法比较熟悉的,希望对Rust有更深了解的,尤其是希望进行操作系统内核编程或通用框架编程的程序员。对于资深的Java、Python、Go程序员,可以将本书作为与其他编程语言相比较的一个参考。

阅读本书之前,读者应该已经学习过官方教程《Rust程序设计语言》。本书不是标准库参考手册,如需要参考手册,请见《Rust标准库参考手册》。

内容脉络

本书按如下脉络对Rust标准库进行分析。

Rust标准库的目录结构展示了其精细的模块化设计。CORE库、ALLOC库、STD库的分工明晰且内聚,而Rust标准库的概述包含了这些内容。

Rust具有一些自身的特征,包括泛型、内存安全框架、安全封装类型、解封装等,本书总结了这些特征。

程序员精通C语言的标志是能熟练地使用指针。Rust的裸指针是学习Rust最基础、最核心的知识点之一。本书将以裸指针为代表的内存模块作为代码分析的起点,*const T、*mut T、MaybeUninit、ManuallyDrop有助于读者理解所有权、生命周期、借用等,它们是非常重要的数据类型,只有理解了这些类型,才能攻克Rust的难点。Rust提供了开放的接口以便程序员自行设计动态内存的申请与释放机制,并使标准库所有的动态内存都可以基于此机制。

通过对标量类型、切片类型、元组类型等基本类型的分析,就能看到Rust的基本类型可以利用特征语法无限扩展自身的行为,这展现了Rust更有表现力的语法功能。本书对基本类型做了分析。

Option、Result等类型完全由标准库定义,而不是由编译器支持的Rust基本类型定义,这一点可以从本书的源代码分析中发现。

Marker Trait通常由编译器实现,也是较难理解的语言特征。因此,本书对Marker Trait进行了详细的阐述。

标准库除了加、减、乘、除及位运算,还包括下标运算、范围运算、Try运算等,所有运算符都可以重载,且可以跨越类型重载,运算符重载揭示了Rust的很多编码奥秘及技巧。

Iterator闭包是函数式编程的基础构架,Iterator适配器构成了函数式编程的基础设施,标准库完整地实现了这些内容,并且几乎为每个类型都实现了迭代器,尽可能为函数式编程做好准备。本书分析了所有基本类型的Iterator实现。

Cell、RefCell、Pin、Lazy代码阐释了在Rust的基础语法下,如何创造性地解决问题。

Rust标准库其他智能指针类型的堆内存申请及释放基本都由Box、RawVec这两个类型负责。

Rc、Arc是一个杰作,系统级的程序员会仅因为这两个类型而喜欢上Rust。

Vec、VecDeque、LinkList等智能指针类型都可用于实现经典的数据结构示例。

标准库对不同操作系统的适配能让程序员不必像使用C/C++那样重复耗费精力编写代码,节省了编程时间,提高了工作效率。

Future、Poll、Waker与Context揭示了异步编程最基础的思考和实现。

本书约定

本书的代码分析遵循了人们的阅读习惯,在代码中插入了中文注释,以便读者理解相关代码。

由于编著者写作水平有限,书中难免存在疏漏与不足之处,恳请广大读者给予批评、指正。


任成珺

2024年3月1日


目录

目录

第1章 Rust标准库体系概述 1

1.1 CORE库 2

1.2 ALLOC库 3

1.3 STD库 4

1.4 回顾 4

第2章 Rust特征小议 5

2.1 泛型小议 6

2.1.1 基于泛型的函数及Trait 6

2.1.2 泛型约束的层次 6

2.2 Rust内存安全杂述 7

2.3 获取封装类型变量的内部变量 9

2.3.1 使用“?”运算符解封装 9

2.3.2 函数调用+自动解引用 10

2.3.3 采用闭包 10

2.3.4 获取引用 11

2.3.5 获取所有权 11

2.4 回顾 12

第3章 内存操作 13

3.1 裸指针——不安全的根源 15

3.1.1 裸指针具体实现 16

3.1.2 固有模块裸指针关联函数 18

3.1.3 裸指针操作 19

3.1.4 裸指针番外 22

3.2 MaybeUninit——未初始化变量方案 23

3.2.1 MaybeUninit定义 23

3.2.2 ManuallyDrop定义 24

3.2.3 MaybeUninit构造函数 25

3.2.4 MaybeUninit初始化函数 26

3.2.5 MaybeUninit数组类型操作 27

3.2.6 典型案例 28

3.3 裸指针再论 29

3.4 非空裸指针——NonNull 30

3.4.1 构造关联函数 31

3.4.2 类型转换函数 32

3.4.3 其他函数 32

3.5 智能指针的基座——Unique 33

3.6 mem模块函数 34

3.6.1 构造泛型变量函数 34

3.6.2 泛型变量所有权转移函数 34

3.6.3 其他函数 36

3.7 动态内存申请及释放 36

3.7.1 内存布局 36

3.7.2 动态内存申请与释放接口 38

3.8 全局变量内存探讨 42

3.9 drop总结 43

3.10 Rust所有权、生命周期、借用探讨 44

3.11 回顾 47

第4章 基本类型及基本Trait 48

4.1 固有函数库 49

4.1.1 原子操作函数 49

4.1.2 数学函数及位操作函数 49

4.1.3 指令预取优化函数、断言类函数及栈获取函数 49

4.2 基本类型分析 49

4.2.1 整数类型 50

4.2.2 浮点类型 53

4.2.3 Option类型 54

4.2.4 引用类型match语法研究 59

4.2.5 Result类型 60

4.3 基本Trait 64

4.3.1 编译器内置Marker Trait 64

4.3.2 算术运算符Trait 67

4.3.3 “?”运算符Trait 74

4.3.4 范围运算符Trait 76

4.3.5 索引运算符Trait 78

4.4 回顾 83

第5章 迭代器 84

5.1 三种迭代器 85

5.2 Iterator Trait分析 86

5.3 Iterator与其他集合类型转换 89

5.4 范围类型迭代器 90

5.5 切片类型迭代器 93

5.6 字符串类型迭代器 98

5.7 数组类型迭代器 99

5.7.1 成员本身迭代器 99

5.7.2 成员引用迭代器 101

5.8 Iterator适配器 102

5.8.1 Map适配器 102

5.8.2 Chain适配器 103

5.8.3 其他适配器 105

5.9 Option适配器 105

5.10 回顾 106

第6章 基本类型(续) 107

6.1 整数类型 108

6.2 布尔类型 109

6.3 字符类型 110

6.4 字符串类型 114

6.5 切片类型 126

6.6 回顾 128

第7章 内部可变性类型 129

7.1 Borrow/BorrowMut分析 130

7.2 Cell类型分析 131

7.2.1 UnsafeCell分析 131

7.2.2 Cell分析 132

7.3 RefCell类型分析 134

7.3.1 Borrow Trait分析 136

7.3.2 BorrowMut Trait分析 138

7.3.3 RefCell的其他函数 140

7.4 Pin/UnPin类型分析 142

7.5 Lazy类型分析 145

7.6 回顾 149

第8章 智能指针 150

8.1 Box类型分析 151

8.2 RawVec类型分析 155

8.3 Vec类型分析 161

8.3.1 Vec基础分析 161

8.3.2 Vec的Iterator Trait 170

8.4 Rc类型分析 173

8.4.1 Rc类型的构造函数及析构函数 175

8.4.2 Weak类型分析 179

8.4.3 Rc的其他函数 180

8.5 Arc类型分析 183

8.5.1 Arc类型的构造函数及析构函数 183

8.5.2 Weak类型分析 188

8.5.3 Arc的其他函数 190

8.6 Cow类型分析 194

8.6.1 ToOwned Trait分析 194

8.6.2 Cow分析 195

8.7 LinkedList类型分析 197

8.8 String类型分析 203

8.8.1 初识String类型分析 203

8.8.2 格式化字符串分析 205

8.9 回顾 216

第9章 用户态标准库基础 217

9.1 Rust与C语言交互 218

9.1.1 C语言的类型适配 219

9.1.2 C语言的va_list类型适配 221

9.1.3 C语言字符串类型适配 222

9.1.4 OsString代码分析 228

9.2 代码工程中的一个技巧 229

9.3 内存管理之STD库 230

9.4 系统调用(SYSCALL)的封装 236

9.5 文件描述符及句柄 237

9.5.1 文件描述符所有权设计 237

9.5.2 文件逻辑操作适配层 241

9.6 回顾 244

第10章 进程管理 245

10.1 匿名管道 247

10.2 重定向实现分析 248

10.3 进程管理 251

10.3.1 OS相关适配层 251

10.3.2 对外接口层 259

10.4 回顾 263

第11章 并发编程 264

11.1 Futex分析 265

11.2 Mutex类型分析 267

11.2.1 OS相关适配层 267

11.2.2 OS无关适配层 269

11.2.3 对外接口层 271

11.3 Condvar类型分析 275

11.3.1 OS相关适配层 275

11.3.2 OS无关适配层 277

11.3.3 对外接口层 278

11.4 RwLock类型分析 280

11.4.1 OS相关适配层 280

11.4.2 OS无关适配层 286

11.4.3 对外接口层 287

11.5 Barrier类型分析 290

11.6 Once类型分析 292

11.7 OnceLock类型分析 296

11.8 LazyLock类型分析 299

11.9 线程分析 300

11.9.1 OS相关适配层 300

11.9.2 OS无关适配层 311

11.9.3 对外接口层 313

11.10 线程消息通信——MPSC 332

11.10.1 消息队列类型——Queue 334

11.10.2 阻塞及唤醒信号机制 336

11.10.3 一次性通信通道机制 338

11.10.4 Shared类型通道 342

11.10.5 对外接口层 350

11.11 Rust的RUNTIME 357

11.12 回顾 359

第12章 文件系统 360

12.1 OS相关适配层 361

12.1.1 路径名类型分析 361

12.1.2 普通文件操作分析 362

12.1.3 目录操作分析 371

12.2 对外接口层 377

12.3 回顾 381

第13章 I/O系统 382

13.1 标准输入Stdin类型分析 383

13.1.1 Read Trait 384

13.1.2 向量读/写类型分析 388

13.1.3 对外接口层 390

13.2 标准输出Stdout类型分析 405

13.3 网络I/O 420

13.4 回顾 420

第14章 异步编程 421

14.1 Rust协程框架简析 422

14.1.1 协程概述 422

14.1.2 Rust的I/O多路复用 423

14.2 Rust协程支持类型简析 428

14.2.1 Rust协程管理 428

14.2.2 Future Trait分析 429

14.3 回顾 434


产品特色