书海网短评:
适读人群:适合本书的读者群体包括:1.有一定编程经验,想要学习Rust的初学者。2.对Rust有一定了解,还想对Rust深入学习的进阶者。本书不适合完全没有编程基础的人学习。√Rust,集安全、高性能、高效率、高可读
√Rust,集安全、高性能、高效率、高可读性于一身,是开发一款优秀产品不得不考虑的编程语言,学习Rust势在必行!
√《Rust编程之道》作者作为Rust语言的早期实践者,以及中国社区的管理运营者,对Rust的设计理念有深入理解,并有丰富的实践经验。
√从设计哲学、源码分析、工程视角、底层原理多个维度,对Rust语言进行系统化梳理,帮助读者理清知识脉络,降低学习曲线。
√《Rust编程之道》附有随书源码,配套运行,方便读者在实践中巩固理论知识,熟悉Rust在生产环境中的应用,避免纸上谈兵的尴尬。
Rust是一门利用现代化的类型系统,有机地融合了内存管理、所有权语义和混合编程范式的编程语言。它不仅能科学地保证程序的正确性,还能保证内存安全和线程安全。同时,还有能与C/C++语言媲美的性能,以及能和动态语言媲美的开发效率。
《Rust编程之道》并非对语法内容进行简单罗列讲解,而是从四个维度深入全面且通透地介绍了Rust语言。从设计哲学出发,探索Rust语言的内在一致性;从源码分析入手,探索Rust地道的编程风格;从工程角度着手,探索Rust对健壮性的支持;从底层原理开始,探索Rust内存安全的本质。
《Rust编程之道》涵盖了Rust2018的特性,适合有一定编程经验且想要学习Rust的初学者,以及对Rust有一定的了解,想要继续深入学习的进阶者。
张汉东,80后,资深软件工程师、企业独立咨询师、技术作者译者。爱好读书、写作,喜欢研究技术、学习之道,以及心智和认知开发模式。曾在互联网行业沉浮十余载,先后效力于电商、社交游戏、广告和众筹领域。作为企业独立咨询师,先后为思科、平安科技和闪迪等公司提供咨询服务。目前在心智教育及创客领域开疆拓土。是《Ruby原理剖析》一书的译者。喜欢Rust语言,为Rust语言提交了三次编译器Bug,并协助修复其中之一。为官方Rust2018Guide做过贡献,并数次提出改进意见。参与了国内Rust社区的管理和运营,在2018年打造了《Rust每日新闻》频道,深受Rustacean们的喜爱。为初学者精心打造了Rust必学第一课:知乎Live《如何系统地学习Rust语言》,获得五星好评。
EventhoughIhadtoreadthisbookthroughGoogleTranslate,TheTaoofRustisanextremelyinterestingbook.Itstartsoffexplainingexactlywhyitisdifferent:it'sabookthatgetsyoutothinkaboutRust,anditsperspectiveontheworld.IonlywishIcouldreaditinitsnativetounge,asI'msureit'sevenbetterthen!IhavebeenworkingonRustforsixyearsnow,andthisbookchangedmyperspectiveonsomeaspectsofthelanguage.That'sverypowerful!
即便我不得不通过谷歌翻译阅读这《Rust编程之道》,但也不难发现《Rust编程之道》是一本非常有趣的书。它解释了Rust为何与众不同:这《Rust编程之道》可以让你思考Rust,以及Rust语言所蕴含的世界观。我好希望能读懂中文原版书,因为我相信它会更精彩!我已经从事Rust的相关工作六年了,这《Rust编程之道》改变了我对Rust语言的某些看法。这非常强大!
——SteveKlabnik,Rust官方核心团队成员及文档团队负责人
IknewRustwasanotoriouslydifficultprogramminglanguagetolearn,butitwasn’tuntilIreadtheprefacetoTheTaoofRust,byAlexZhang,thatIrealizedwhyitissodifficult.Alexwrites:
Rustcoversawiderangeofknowledge,includingobject-oriented,functionalprogramming,generics,underlyingmemorymanagement,typesystems,designpatterns,andmore.
AlexcoversallofthesetopicsandmoreinTheTaoofRust.AsingletextthattiesallofthistogetherwillbeinvaluableforRustlearners.SofarI’vereadacoupleofchapterstranslatedfromtheoriginalChinese,andIcan’twaittoreadmore.
Rust语言难学,这已经是众所周知的了。但是直到我看到Alex(张汉东)的《Rust编程之道》的前言时,我才明白它为什么如此难学,Alex写道:
“Rust涉及的知识范围非常广泛,涵盖了面向对象、函数式、泛型、底层内存管理、类型系统、设计模式等知识。”
《Rust编程之道》一书涵盖了所有这些主题和内容,并且将这些内容有机地联系在一起,这对于Rust的学习者来说是非常宝贵的。我阅读了《Rust编程之道》部分内容的英文译稿后,就已经迫不及待地想要阅读更多的内容了。
——PatrickShaughnessy,《Ruby原理剖析》原著作者
Rust是一门相对难学的语言,我个人认为它的学习曲线比C++的学习曲线更陡峭,但我相信,通过《Rust编程之道》,大家能快速掌握Rust,体验使用Rust编程的乐趣,也能更快地在项目中使用Rust来保证程序的健壮性。如果你遇到了困难,不用害怕,你可以很方便地从Rust社区得到帮助。
——唐刘,PingCAP首席架构师,TiKV负责人
Rust自诞生之初就背上了晦涩难学的名声,以至于很多程序员想学而无法窥得门径。这本《Rust编程之道》是国内Rust社区里难得的优秀作品,它由浅入深,剥茧抽丝,把一个个概念阐释得清晰通透。我们知道,学习一门语言,语法是皮毛,概念是肌理,思想是精髓。汉东在《Rust编程之道》的各个章节中,不断地阐述Rust语言的思想和灵魂,帮助读者真正理解Rust创作者的苦心。之前我听过汉东做的Rust培训,感觉醍醐灌顶;又看了《Rust编程之道》的三章样章,对《Rust编程之道》便有了满满的期待。
——陈天,ArcBlock(区块基石)技术VP终于看见由国内资深
Rust程序员所写的Rust著作了,《Rust编程之道》从语言宗旨到语义逻辑,由浅入深地将Rust语言介绍给国内的读者,相信能够解决目前大部分Rust初学者的问题及疑惑。
——杨梓杰(KiChjang@美国),Rust开发者,Servo资深贡献者
《Rust编程之道》内容翔实,示例丰富且易于理解,相信能够为读者学习和使用Rust扫清种种障碍。我在一年前首次使用Rust开发了知乎新一代搜索系统,我多么希望那时就能读到这《Rust编程之道》,那样就可以解答当时的种种疑惑,并避免一路上所犯的错误和付出的昂贵代价了。
——孙晓光,知乎搜索技术架构Leader
BiliBili正尝试在自己的持续集成系统、分布式文件系统、KV系统、缓存系统中使用Rust语言开发一些组件。Rust本身具备的线程安全、零成本、便利的FFI等特性,使之非常适合开发一些系统底层组件和基础系统。但是,Rust的学习曲线颇陡,需要一本讲解细致、逻辑清晰的书籍作为指导。张老师的这本《Rust编程之道》就非常适合Rust的初学者,值得每一位想了解或深入学习Rust的程序员细细品读。同时也希望Rust在中国乃至世界范围内的影响力越来越大,生态越来越好。
——赵雪松(wayslog),BiliBili高级工程师
一年以来,汉东的《Rust每日新闻》为大家提供了极丰富的信息,大大推动了国内Rust社区的发展。《Rust编程之道》正是汉东多年深入探索Rust语言本身以及通用编程之道的匠心之作。愿《Rust编程之道》的出版能成为Rust语言在国内推广普及的重要里程碑。感谢汉东的工作!
——唐刚,RustWeb框架Sapper作者
Rust语言内存安全,拥有强大的类型系统、高度的抽象表达能力以及方便的FFI,这些特点让它成为了一门前景光明的编程语言。一门好的语言自然需要一位好的引路人,《Rust编程之道》从设计哲学出发,结合代码实践,层次分明、逻辑通透,能帮助读者形成更系统化的理解,是一本优秀的Rust中文书籍。
——LeetCode(领扣网络)
第1章新时代的语言1
1.1缘起1
1.2设计哲学3
1.2.1内存安全3
1.2.2零成本抽象4
1.2.3实用性5
1.3现状与未来7
1.3.1语言架构8
1.3.2开源社区9
1.3.3发展前景9
1.4Rust代码如何执行10
1.5小结10
第2章语言精要11
2.1Rust语言的基本构成11
2.1.1语言规范11
2.1.2编译器12
2.1.3核心库12
2.1.4标准库12
2.1.5包管理器13
2.2语句与表达式13
2.3变量与绑定14
2.3.1位置表达式和值表达式15
2.3.2不可变绑定与可变绑定15
2.3.3所有权与引用16
2.4函数与闭包17
2.4.1函数定义17
2.4.2作用域与生命周期18
2.4.3函数指针19
2.4.5CTFE机制20
2.4.6闭包20
2.5流程控制22
2.5.1条件表达式22
2.5.2循环表达式23
2.5.3match表达式与模式匹配24
2.5.4iflet和whilelet表达式25
2.6基本数据类型26
2.6.1布尔类型26
2.6.2基本数字类型26
2.6.3字符类型27
2.6.4数组类型28
2.6.5范围类型29
2.6.6切片类型29
2.6.7str字符串类型30
2.6.8原生指针31
2.6.9never类型31
2.7复合数据类型32
2.7.1元组32
2.7.2结构体33
2.7.3枚举体36
2.8常用集合类型38
2.8.1线性序列:向量38
2.8.2线性序列:双端队列39
2.8.3线性序列:链表40
2.8.4Key-Value映射表:HashMap和BTreeMap40
2.8.5集合:HashSet和BTreeSet41
2.8.6优先队列:BinaryHeap42
2.9智能指针42
2.10泛型和trait43
2.10.1泛型43
2.10.2trait44
2.11错误处理47
2.12表达式优先级48
2.13注释与打印48
2.14小结50
第3章类型系统51
3.1通用概念51
3.1.1类型系统的作用51
3.1.2类型系统的分类52
3.1.3类型系统与多态性53
3.2Rust类型系统概述53
3.2.1类型大小53
3.2.2类型推导58
3.3泛型60
3.3.1泛型函数60
3.3.2泛型返回值自动推导62
3.4深入trait62
3.4.1接口抽象63
3.4.2泛型约束69
3.4.3抽象类型71
3.4.4标签trait77
3.5类型转换83
3.5.1Deref解引用83
3.5.2as操作符86
3.5.3From和Into88
3.6当前trait系统的不足89
3.6.1孤儿规则的局限性90
3.6.2代码复用的效率不高91
3.6.3抽象表达能力有待改进93
3.7小结94
第4章内存管理95
4.1通用概念95
4.1.1栈96
4.1.2堆99
4.1.3内存布局101
4.2Rust中的资源管理103
4.2.1变量和函数103
4.2.2智能指针与RAII106
4.2.3内存泄漏与内存安全110
4.2.4复合类型的内存分配和布局115
4.3小结117
第5章所有权系统119
5.1通用概念120
5.2所有权机制123
5.3绑定、作用域和生命周期125
5.3.1不可变与可变126
5.3.2绑定的时间属性——生命周期127
5.4所有权借用131
5.5生命周期参数135
5.5.1显式生命周期参数136
5.5.2省略生命周期参数143
5.5.3生命周期限定145
5.5.4trait对象的生命周期145
5.6智能指针与所有权146
5.6.1共享所有权Rc和Weak149
5.6.2内部可变性Cell和RefCell151
5.6.3写时复制Cow153
5.7并发安全与所有权156
5.8非词法作用域生命周期157
5.9小结161
第6章函数、闭包与迭代器162
6.1函数162
6.1.1函数屏蔽164
6.1.2函数参数模式匹配164
6.1.3函数返回值165
6.1.4泛型函数166
6.1.5方法与函数167
6.1.6高阶函数168
6.2闭包171
6.2.1闭包的基本语法172
6.2.2闭包的实现173
6.2.3闭包与所有权178
6.2.4闭包作为函数参数和返回值184
6.2.5高阶生命周期190
6.3迭代器194
6.3.1外部迭代器和内部迭代器194
6.3.2Iteratortrait195
6.3.3IntoIteratortrait和迭代器199
6.3.4迭代器适配器202
6.3.5消费器207
6.3.6自定义迭代器适配器211
6.4小结214
第7章结构化编程216
7.1面向对象风格编程217
7.1.1结构体217
7.1.2枚举体225
7.1.3析构顺序230
7.2常用设计模式233
7.2.1建造者模式234
7.2.2访问者模式236
7.2.3RAII模式239
7.3小结243
第8章字符串与集合类型244
8.1字符串244
8.1.1字符编码244
8.1.2字符247
8.1.3字符串分类249
8.1.4字符串的两种处理方式251
8.1.5字符串的修改253
8.1.6字符串的查找256
8.1.7与其他类型相互转换265
8.1.8回顾270
8.2集合类型271
8.2.1动态可增长数组271
8.2.2映射集281
8.3理解容量289
8.4小结292
第9章构建健壮的程序294
9.1通用概念294
9.2消除失败295
9.3分层处理错误297
9.3.1可选值Option298
9.3.2错误处理Result302
9.4恐慌(Panic)314
9.5第三方库316
9.6小结319
第10章模块化编程320
10.1包管理321
10.1.1使用Cargo创建包321
10.1.2使用第三方包323
10.1.3Cargo.toml文件格式331
10.1.4自定义Cargo337
10.2模块系统339
10.3从零开始实现一个完整功能包344
10.3.1使用Cargo创建新项目345
10.3.2使用structopt解析命令行参数345
10.3.3定义统一的错误类型347
10.3.4读取CSV文件348
10.3.5替换CSV文件中的内容351
10.3.6进一步完善包353
10.4可见性和私有性358
10.5小结360
第11章安全并发362
11.1通用概念362
11.1.1多进程和多线程363
11.1.2事件驱动、异步回调和协程364
11.1.3线程安全365
11.2多线程并发编程370
11.2.1线程管理371
11.2.2Send和Sync375
11.2.3使用锁进行线程同步379
11.2.4屏障和条件变量384
11.2.5原子类型386
11.2.6使用Channel进行线程间通信388
11.2.7内部可变性探究397
11.2.8线程池399
11.2.9使用Rayon执行并行任务407
11.2.10使用Crossbeam409
11.3异步并发412
11.3.1生成器413
11.3.2Future并发模式418
11.3.3async/await421
11.4数据并行428
11.4.1什么是SIMD429
11.4.2在Rust中使用SIMD430
11.5小结434
第12章元编程435
12.1反射436
12.1.1通过is函数判断类型436
12.1.2转换到具体类型437
12.1.3非静态生命周期类型439
12.2宏系统440
12.2.1起源440
12.2.2Rust中宏的种类441
12.2.3编译过程442
12.2.4声明宏445
12.2.5过程宏458
12.3编译器插件472
12.4小结475
第13章超越安全的边界477
13.1UnsafeRust介绍477
13.1.1Unsafe语法478
13.1.2访问和修改可变静态变量480
13.1.3Union联合体480
13.1.4解引用原生指针483
13.2基于Unsafe进行安全抽象484
13.2.1原生指针484
13.2.2子类型与型变489
13.2.3未绑定生命周期494
13.2.4Drop检查495
13.2.5NonNull指针505
13.2.6Unsafe与恐慌安全508
13.2.7堆内存分配508
13.2.8混合代码内存安全架构三大原则510
13.3和其他语言交互510
13.3.1外部函数接口510
13.3.2与C/C++语言交互514
13.3.3使用Rust提升动态语言性能528
13.4Rust与WebAssembly532
13.4.1WebAssembly要点介绍533
13.4.2使用Rust开发WebAssembly539
13.4.3打造WebAssembly开发生态541
13.5小结543
附录ARust开发环境指南544
附录BRust如何调试代码549
序
当我2015年开始学习Rust的时候,我绝对没有想过要写一本Rust编程的书。
缘起
当时我刚刚翻译完《Ruby原理剖析》一书,开始对底层开发产生了一点点兴趣。从2006年入行以来,我就一直和动态语言打交道。虽然自己也想学习底层开发,但能选择的语言几乎只有C++。我在学校里浅浅地学过C++这门语言,也许是第一印象作怪,总难以提起对C++的兴趣。
当Rust1.0发布时,我去官方网站了解了一下Rust语言,发现它的主要特点有以下几方面:
?系统级语言
?无GC
?基于LLVM
?内存安全
?强类型+静态类型
?混合编程范式
?零成本抽象
?线程安全
我一下子就被这些鲜明的特性“击中”了,从此开始了Rust的学习。
再一次爱上编程
第一次爱上编程是在上小学时。父亲给我买回来一台金字塔学习机,这台学习机有两种功能,一种是学习Logo语言,另一种是玩卡带游戏。编写Logo语言就是用小海龟画图,也许是因为太早了,也许是因为没有人引导,那时的我选择了痛快地玩游戏。总想着先玩游戏,再去学怎么编程,然后还幻想着能不能用Logo语言编写一个游戏。其实这时候的我对编程更多的是一种憧憬,并没有在学习编程上付出更多的实际行动。
第二次爱上编程是在大学初次学习C语言的时候。我本可以选择计算机科学专业,但是最后还是选了电子信息科学与技术专业。这样选是因为我想把软硬件都学了。想法是好的,可惜实施起来并不容易。最后的结果就是,软硬件都没学好。
第三次爱上编程是在遇到Ruby语言的时候。当时我在用Java,并且已经完全陷入了Java语言和Web框架纷繁复杂的细节中,痛苦不堪。RubyonRails框架的横空出世,把我从这种状态中解救了出来。Ruby语言的优雅和自由,以及“让程序员更快乐”的口号深深地吸引了我。这一次我是真正爱上了编程,并且积极付诸行动去学习和提升自己。此时也恰逢互联网创业大潮的开始,Ruby语言的开发效率让它迅速成为创业公司的宠儿,因此,我也借着Ruby这门语言参与到了这股创业洪流中。
第四次爱上编程是在遇到Rust的时候。此时,创业洪流已经退潮。技术圈有句话,叫“十年一轮回”。当年喜欢Ruby给开发过程带来的快乐,但是随着时代的变革和业务规模的增长,我不禁开始重新思考一个问题:何谓快乐?真正的快乐不仅仅是写代码时的“酸爽”,更应该是代码部署到生产环境之后的“安稳”。Rust恰恰可以给我带来这种“双重快乐”体验。
为什么是Rust
社区中有人模仿阿西莫夫的机器人三大定律,总结了程序的三大定律:
?程序必须正确。
?程序必须可维护,但不能违反第一条定律。
?程序必须高效,但不能违反前两条定律。
程序的正确性,一方面可以理解为该程序满足了实际的问题需求,另一方面是指满足了它自身的程序规约。那么如何保证程序的正确性呢?首先,可以通过对程序的各种测试、断言和错误处理机制,来保证其满足实际的问题需求。其次,在数学和计算机科学已经融合的今天,通过较为成熟的类型理论即可保证程序自身的规约正确。
以我最熟悉的Ruby语言为例,程序的正确性必须依赖于开发者的水平,并需要大量的测试代码来保证正确性。即便在100%测试覆盖率的条件下,也经常会遇到NilError之类的空指针问题。也就是说,Ruby程序自身的正确性还没有得到保证。以此类推,C、C++、Python、Java、JavaScript等语言都有同样的问题。
而函数式编程语言在这方面要好很多,尤其是号称纯函数式的Haskell语言,它具有融合了范畴理论的类型系统,利用了范畴理论自身的代数性质和定律保证了程序自身的正确性。然而,Haskell也有比较明显的缺点,比如它不满足上述第三条定律,运行效率不高。
反观Rust语言,对程序的三定律支持得恰到好处。它借鉴了Haskell的类型系统,保证了程序的正确性。但还不止于此,在类型系统的基础上,Rust借鉴了现代C++的内存管理机制,建立了所有权系统。不仅保证了类型安全,还保证了内存安全。同时,也解决了多线程并发编程中的数据竞争问题,默认线程安全。再来看代码的可维护性,Rust代码的可读性和抽象能力都是一流的。不仅拥有高的开发效率,还拥有可以和C/C++媲美的性能。当然,没有银弹,但Rust就是我目前想要的语言。
目前Rust被陆续应用在区块链、游戏、WebAssembly技术、机器学习、分布式数据库、网络服务基础设施、Web框架、操作系统和嵌入式等领域。时代在变化,未来的互联网需要的是安全和性能并重的语言,Rust必然会在其中大放异彩。
学习Rust带来了什么收获
Rust是一门现代化的语言,融合了多种语言特性,而且Rust语言可以应用的领域范围非常广泛。在学习Rust的过程中,我发现自己的编程能力在很多方面存在短板。突破这些短板的过程实际上就是一次自我提升的过程。
Rust是一门成长中的新语言,学习Rust,跟随Rust一起成长,可以体验并参与到一门真正工业化语言的发展进程中,感觉就像在创造历史。虽然我并未给Rust语言提交过PR,但也为Rust语言和社区多次提交过Bug,以及文档和工具的改进意见。
Rust自身作为一个开源项目,算得上是开源社区中的“明星”项目了。学习Rust的过程加深了我对开源社区的认识,也开拓了我的眼界。
为什么要写这《Rust编程之道》
在学习Rust一年之后,我写下了《如何学习一门新语言》一文,其中记录了我学习Rust的心得,这篇文章颇受好评。也正因为这篇文章,电子工业出版社的刘恩惠编辑找到了我,并询问是否可以出一本Rust编程的书籍。我当时也正想通过一《Rust编程之道》来完整地表达自己的学习心得,再加上中文社区中没有较全面系统的Rust书籍,于是,一拍即合。
写书的过程可以形容为痛并快乐着。Rust语言正值成长期,很多语言特性还在不断地完善。举一个极端的例子,比如写下某段代码示例并成功编译后,过了三天却发现它无法编译通过了。于是,我再一次跟进Rust的RFC、源码、ChangeLog去看它们的变更情况,然后再重新修订代码示例。这个过程虽然痛苦,但改完之后会发现Rust的这个改进确实是有必要的。
在这个过程中,我看到了Rust的成长,以及Rust团队为保证语言一致性和开发者的开发体验所付出的努力,让我感觉自己花再多时间和精力去修改《Rust编程之道》的内容都是值得的。
话说回来,任何人做事都是有动机或目的的,我也不例外。我写这《Rust编程之道》的目的主要有以下三个。
?为Rust中文社区带来一本真正可以全面系统地学习Rust的书。
?以教为学。在写作的过程中,让自己所学的知识进一步内化。
?传播一种自学方法。《Rust编程之道》内容以Rust语言的设计哲学为出发点,按照从整体到细节的思路逐个阐述每个语言特性,希望读者可以产生共鸣。
结语
我自己作为《Rust编程之道》的第一位读者,目前对这《Rust编程之道》是非常满意的。衷心希望每一位读者都能从《Rust编程之道》中收获新知。当然,我也知道不可能让每一位读者都满意。在我看来,写书不仅是在传播知识和思想,更是一种交流和沟通。所以,当你不满意的时候,可以来找我交流,提出更多建设性意见,帮助我成长。我争取在写下一《Rust编程之道》的时候,让更多的人满意。而且,如果你的建议确实中肯,让我得到了成长,我也为你准备了不错的小礼物。
在我刚开始学习Rust的时候,在社区里听到最多的声音就是“Rust学习曲线陡”。已经有一定编程经验的人在学习一门新语言时,都喜欢直接上手写代码,因为这样可以快速体验这门语言的特色。对于大多数语言来说,这样确实可以达到一定的学习目的。但是当他们在初次学习Rust的时候,就很难通过直接上手来体验这种快感。
我第一次学习Rust时就遇到了这样的情况。我按以往的编程经验直接写下了代码,但是编译无法通过;可是有时候简单调换两行代码的顺序,程序就能顺利编译成功了,这让我非常困惑。我想这也是大多数人感觉“Rust学习曲线陡”的原因吧。经过和Rust编译器的多次“斗争”之后,我不得不重新反思自己的学习方法。看样子,Rust编译器暗含了某种规则,只要程序员违反了这些规则,它就会检查出来并阻止你。这就意味着,作为程序员,你必须主动理解并遵守这些规则,编译器才能和你“化敌为友”。
所以,我就开始了对Rust的第二轮学习,忘掉自己以往的所学,抱着初学者的心态,从零开始系统地学习Rust。然而,事情并没有这么简单。
Rust官方虽然提供了RustBook,但是内容的组织非常不友好,基本就是对知识点的罗列,系统性比较差。后来官方也意识到了这个问题,推出了第2版的RustBook,内容组织方面改善了很多,对学习者也非常友好,但系统性还是差了点。后来又看了国内Rust社区组织群友们合著的RustPrimer,以及国外的ProgrammingRust,我才对Rust建立了基本的认知体系。
直到此时,我才意识到一个重要的问题:Rust学习曲线陡的根本原因在于Rust语言融合了多种语言特性和多种编程范式。这就意味着,Rust涉及的知识范围非常广泛,涵盖了面向对象、函数式、泛型、底层内存管理、类型系统、设计模式等知识。从底层到上层抽象,从模式到工程化健壮性,无所不包。可以说,Rust是编程语言发展至今的集大成者。对于大多数Rust语言的初学者来说,他掌握的知识体系范围是小于Rust所包含的知识量的,所以在学习Rust的过程中会遇到无法理解的内容。
我在学习Rust之前,所掌握的编程语言知识体系大多是和拥有GC的动态语言相关的,对于底层内存管理知之甚少。所以在我学习Rust所有权的时候,就很难理解这种机制对于内存安全的意义所在;而我所认识的一些拥有C语言编程经验的朋友,在学习Rust时面临的问题是,难以理解Rust支持的上层抽象,对他们来说,Rust中融合的类型系统和编程范式就是他们学习道路上的“拦路虎”;对于拥有Haskell等函数式编程经验的朋友,会感觉Rust的类型系统很容易理解,但是底层的内存管理和所有权机制又成了需要克服的学习障碍;来自C++编程圈的朋友,尤其是懂现代C++的朋友,对Rust所有权机制理解起来几乎没有困难,但是类型系统和函数式编程范式可能会阻碍他们的学习。当然,如果正好你没有上述情况,那说明你的相关知识体系已经很全面了,你在Rust的学习之路上将会非常顺利。
这是不是意味着,在学习Rust之前需要把其他语言都学一遍呢?答案是否定的。
Rust编程语言虽然融合了很多其他语言的特性和范式,但它不是进行简单的内容堆叠,而是有机地融合了它们。也就是说,Rust遵循着高度的一致性内核来融合这些特性。我们只需要从Rust的设计哲学出发,牢牢地把握它的设计一致性,就可以把它的所有特性都串起来,从而达到掌握它的目的。这正是《Rust编程之道》遵循的写作逻辑。
《Rust编程之道》特点
从设计哲学出发,探索Rust语言的内在一致性。设计哲学是一门优秀编程语言保持语言一致性的关键所在。设计哲学是语言特性和语法要素设计的诱因和准则。理解Rust语言的设计哲学,有助于把握Rust语言的内核与一致性,把Rust看似纷繁复杂的特性都系统地串起来。
从源码分析入手,探索Rust地道的编程风格。Rust是一门自举的语言,也就是说,Rust语言由Rust自身实现。通过阅读Rust标准库和一些第三方库的源码,不仅可以深入理解Rust提供的数据类型和数据结构,更能体验和学习地道的Rust编程风格。
从工程角度着手,探索Rust对健壮性的支持。Rust通过类型系统、断言、错误处理等机制保证内存安全的同时,还保证了系统的健壮性。从工程角度去看Rust,才能看到Rust对系统健壮性的支持是多么优雅。
从底层原理开始,探索Rust内存安全的本质。只有深入底层,才能理解Rust所有权机制对于内存安全的意义。而且可以进一步理解Rust的类型系统,以及UnsafeRust存在的必要性。
读者群体
适合《Rust编程之道》的读者群体包括:
?有一定编程经验,想要学习Rust的初学者。
?对Rust有一定了解,还想对Rust深入学习的进阶者。
《Rust编程之道》不适合完全没有编程基础的人学习。
如何阅读《Rust编程之道》
对于Rust初学者,建议按照章节顺序去阅读。因为《Rust编程之道》每一章内容基本都依赖于前一章内容的前置知识。
对于Rust有一定了解的朋友,可以选择你感兴趣的章节去阅读。因为《Rust编程之道》的每一章也是对一个垂直主题的深入探讨。
一些章节的开头罗列出了通用概念,这是为了更通透地讲解相关知识的来龙去脉。如果你对这部分内容不了解,那么建议你把这部分内容(属于前置知识)认真看完再去看后面的内容。如果你对这部分内容已经有了充分的了解,那么完全可以跳过,直接选择你最关心的内容去阅读。
章节概述
第1章新时代的语言。这一章将从Rust语言的发展历史概述开始,引出Rust的设计哲学,通过设计哲学进一步阐述Rust的语言架构。该语言架构也是《Rust编程之道》组织内容时遵循的准则之一。这一章还将介绍Rust语言社区的现状和未来展望。最重要的是,这一章将介绍Rust代码的执行流程,这对于理解《Rust编程之道》后面的章节会有所帮助。
第2章语言精要。学习任何一门语言时,首先要做的就是了解其语法。这一章将罗列Rust语言中的常用语法,但不是简单罗列,而是遵循一定的逻辑进行罗列。在介绍语法之前,这一章会先对Rust语言的基本构成做整体概述。然后将介绍一个非常重要的概念:表达式。它是Rust语法遵循的最简单的准则之一。接下来才会依次介绍Rust中最常用的语法,让读者对Rust语言有一个初步的了解。
第3章类型系统。类型系统是现代编程语言的重要支柱。这一章首先将以通用概念的形式介绍类型系统相关的概念,目的是帮助不了解类型系统的读者建立初步认知。接下来将从三方面阐述Rust的类型系统。为了理解Rust基于栈来管理资源的思想,有必要先了解Rust中对类型的分类,比如可确定大小类型、动态大小类型和零大小类型等。这一章还将介绍Rust类型推导功能及其不足。接下来将介绍Rust中的泛型编程。泛型是Rust类型系统中最重要的一个概念。最后会介绍Rust的“灵魂”,trait系统。对类型系统建立一定的认知,有利于学习后面的内容。
第4章内存管理。这一章首先将介绍底层内存管理的通用概念。在此基础上,围绕内存安全这个核心,从变量定义到智能指针,逐渐阐述Rust中资源管理的哲学。这部分内容是真正理解Rust所有权机制的基础。
第5章所有权系统。这一章首先会介绍关于值和引用语义的通用概念,然后在此基础上探讨Rust的所有权机制。读者将看到,Rust如何结合类型系统和底层内存管理机制,以及上层值和引用的语义形成现在的Rust所有权系统。然后,进一步围绕内存安全的核心,阐述借用检查和生命周期参数的意义。通过这一章的学习,读者将会对Rust的所有权系统有全面深入的了解。
第6章函数、闭包和迭代器。在对Rust的类型系统和内存安全机制有了一定了解之后,我们将开始深入学习Rust编程最常用的语法结构。函数是Rust中最常用的语法单元。Rust的函数承载了诸多函数式编程范式的特性,比如高阶函数、参数模式匹配等,同时也承载了面向对象范式的特性,比如为结构体及其实例实现方法,实际上就是一个函数调用的语法糖。然后将介绍闭包的用法和特性,帮助读者对闭包建立全面深入的认知,更重要的是,通过学习闭包的实现原理,进一步了解Rust中零成本抽象的哲学思想。最后介绍迭代器模式,以及Rust中的迭代器实现机制。迭代器也是Rust最常用的特性,通过这一章的学习,你将彻底了解迭代器。
第7章结构化编程。这一章将对Rust混合范式编程进行探讨,会重点介绍Rust中的结构体和枚举体,以及它们如何在日常编程中以面向对象风格编程。同时,还将介绍三种设计模式,前两种是Rust标准库以及第三方库常用的设计模式,最后是一种合理利用Rust资源管理哲学的设计模式。通过学习这一章的内容,有利于掌握地道的Rust编程风格。
第8章字符串与集合类型。字符串是每门编程语言最基本的数据类型,Rust自然也不例外。出于内存安全的考虑,Rust中的字符串被分为了多种,并且语言自身没有自带正则表达式引擎。这一章将从字符编码开始,围绕内存安全,对Rust中的字符和字符串做彻底梳理,并且阐述如何在没有正则表达式引擎的情况下,满足字符串进行匹配搜索等的需求。集合类型也是编程中必不可少的数据结构。这一章将着重介绍动态数组Vector和Key-Value映射集HashMap的使用,而且还会深入挖掘HashMap底层的实现原理,介绍Rust标准库提供的HashMap安全性,进一步探讨如何用Rust实现一个生产级的数据结构。最后将通过探讨一个Rust安全漏洞的成因,来帮助读者正确理解容量的概念,从而写出更安全的代码。
第9章构建健壮的程序。对于如何构建健壮的系统,Rust给出了非常工程化的解决方案。Rust将系统中的异常分为了多个层次,分别给出了对应的处理手段。在这一章,读者将学习Rust是如何以分层的错误处理解决方案来帮助开发者构建健壮系统的。
第10章模块化编程。现代编程语言的一大特色就是可以方便地进行模块化,这样有利于系统的设计、维护和协作。Rust在模块化编程方面做得很好。这一章首先将介绍Rust强大的包管理系统Cargo。然后会以真实的代码实例阐述Rust的模块系统,并且将包含Rust2018版本中模块系统的重大改进。最后将以一个完整的项目为例阐述如何使用Rust开发自己的crate。
第11章安全并发。Rust从两方面支持并发编程。首先,利用类型安全和内存安全的基础,解决了多线程并发安全中的痛点:数据竞争。Rust可以在编译时发现多线程并发代码中的安全问题。其次,Rust为了达成高性能服务器开发的目标,开始全面拥抱异步开发。这一章将从线程安全的通用概念开始,从Rust多线程并发讲到异步并发支持,带领读者逐步形成全面、深入、通透的理解。
第12章元编程。元编程即程序生成程序的能力。Rust为开发者提供了多种元编程能力。这一章将从反射开始介绍Rust中的元编程。虽然Rust的反射功能没有动态语言的那么强大,但是Rust提供了强大的宏系统。这一章将从Rust的编译过程出发,带领读者深入理解Rust的宏系统的工作机制,并且以具体的实例帮助读者理解编写宏的技巧。从声明宏到过程宏,再到编译器插件,以及第三方库syn和quote最新版的配合使用,都将在本章进行阐述。
第13章超越安全的边界。前面的章节内容基本都是建立在SafeRust的基础上的。而这一章将主要围绕UnsafeRust的内容来构建,主要分为4大部分。首先将介绍UnsafeRust的基本语法和特性。然后,围绕基于Unsafe进行安全抽象的核心,阐述UnsafeRust开发过程中可能引起未定义行为的地方,以及相应的解决方案。然后介绍FFI,通过具体的实例来阐述Rust如何和其他语言交互,涉及C、C++、Ruby、Python、Node.js等语言,还将介绍相关的第三方库。最后,将介绍未来互联网的核心技术WebAssembly,以及Rust如何开发WebAssembly和相关的工具链。
相信通过这13章的内容,读者将会对Rust有全面、深入和系统的认识。
勘误及更多资源
有人的地方就有Bug,此书当然也不例外。写书不仅是正确地传播知识和思想的途径,更是一种交流和沟通的方式。如果你发现《Rust编程之道》中的任何错误、遗漏和解释不清楚的地方,欢迎提出反馈。
随书源码地址:https://github.com/ZhangHanDong/tao-of-rust-codes
勘误说明:
?直接提交issues。
?标明具体的页码、行数和错误信息。
?积极提出勘误者将获得合金Rust勋章一枚。
更多的学习资源:
?官方doc.rust-lang.org列出了很多学习文档和资源。
?订阅Rust每日新闻1,了解Rust社区生态发展,学习Rust。
致谢
首先,我要感谢Rust社区中每一位帮助过我的朋友,没有你们的奉献,就没有这《Rust编程之道》。感谢Mike组织社区编写的免费书籍RustPrimer。感谢Rust社区中不知名的翻译者翻译官方的RustBook。感谢知乎《Rust编程》专栏作者辛苦的写作。感谢KiChjang、ELTON、CrLF0710、F001、Lingo、tennix、iovxw、wayslog、Xidorn、42、黑腹喵等其他社区里的朋友们,你们在我学习的过程中给予了我无私的帮助和解答,Rust社区有你们真好。感谢知道我写作并一直鼓励和支持我的朋友们。衷心希望Rust社区可以一直这么强大、温柔和友好。然后,我要感谢电子工业出版社的刘恩惠编辑。感谢你给了我这个机会,让这《Rust编程之道》从想法成为了现实。
最后,感谢我的妻子宋欣欣,因为她的温柔、大度、包容、信任和支持,才让我能够踏实且满含信心地做我自己想做的事。感谢我的父母,正是他们的培养,才使我具有积极、坚持不懈做事情的品格。
读者服务
轻松注册成为博文视点社区用户(www.broadview.com.cn),扫码直达《Rust编程之道》页面。
?下载资源:《Rust编程之道》如提供示例代码及资源文件,均可在下载资源处下载。
?提交勘误:您对书中内容的修改意见可在提交勘误处提交,若被采纳,将获赠博文视点社区积分(在您购买电子书时,积分可用来抵扣相应金额)。
?交流互动:在页面下方读者评论处留下您的疑问或观点,与我们和其他读者一同学习交流。
页面入口:http://www.broadview.com.cn/35485









