《Rust实战》是由人民邮电出版社出版的一本关于Rust方面的书籍,作者是蒂姆·麦克纳马拉,主要介绍了关于Rust实战、Rust方面的知识内容,目前在Rust类书籍综合评分为:7.3分。
书籍介绍
编辑推荐
*赠送源代码示例文件
*涵盖数十个有趣的示例,简洁易懂,帮你了解Rust语法和Rust的实际运用
*内容由浅入深,通过探索多种系统编程概念和技术引入Rust编程语言,推荐给对rust编程感兴趣的你!
内容简介
本书通过探索多种系统编程概念和技术引入Rust编程语言,在深入探索计算机工作原理的同时,帮助读者了解Rust的所有权系统、Trait、包管理、错误处理、条件编译等概念,并通过源自现实的示例来帮助读者了解Rust中的内存模型、文件操作、多线程、网络编程等内容。
本书旨在帮助读者理解如何用Rust进行系统编程,并提供了一些使用Rust编写代码的技巧。本书给出了10余个源自现实的示例,让读者不仅能了解Rust语法,还能了解Rust的实际运用。
本书适合所有对Rust感兴趣的读者阅读。要更好地掌握本书涵盖的内容,读者应具备一定的编程经验,至少应对计算机编程的基本概念有所了解。
目录
- 第 一部分Rust语言的特色
- 第 1章Rust语言介绍3
- 1.1哪些地方使用了Rust?4
- 1.2在工作中提倡使用Rust5
- 1.3Rust初体验6
- 1.3.1直通“Hello, world!”6
- 1.3.2第 一个Rust程序8
- 1.4下载本书源代码10
- 1.5使用Rust语言的感受如何10
- 1.6Rust语言是什么?13
- 1.6.1Rust的目标:安全性14
- 1.6.2Rust的目标:生产力18
- 1.6.3Rust的目标:控制19
- 1.7Rust的主要特点20
- 1.7.1性能20
- 1.7.2并发21
- 1.7.3内存使用效率21
- 1.8Rust的缺点21
- 1.8.1循环数据结构21
- 1.8.2编译速度22
- 1.8.3严格22
- 1.8.4语言的大小22
- 1.8.5炒作22
- 1.9TLS安全性问题的研究22
- 1.9.1 “心脏出血”23
- 1.9.2跳转到失败23
- 1.10Rust最适用于哪些领域?25
- 1.10.1命令行实用程序25
- 1.10.2数据处理25
- 1.10.3扩展应用程序25
- 1.10.4资源受限的环境26
- 1.10.5服务器端应用26
- 1.10.6桌面应用程序26
- 1.10.7桌面26
- 1.10.8移动端27
- 1.10.9Web27
- 1.10.10系统编程27
- 1.11Rust的隐式特性:它的社区27
- 1.12Rust术语表28
- 本章小结28
- 第 2章Rust语言基础29
- 2.1创建一个可运行的程序30
- 2.1.1编译单文件的Rust程序30
- 2.1.2使用cargo编译Rust项目31
- 2.2初探Rust语法32
- 2.3数字类型34
- 2.3.1整数和浮点数34
- 2.3.2整数的二进制、八进制及十六进制表示法35
- 2.3.3数字的比较运算36
- 2.3.4有理数、复数和其他数字类型41
- 2.4流程控制43
- 2.4.1for循环:迭代的中心支柱43
- 2.4.2continue:跳过本次迭代余下的部分45
- 2.4.3while:循环,直到循环条件改变了循环的状态45
- 2.4.4loop:Rust循环结构的基本组件46
- 2.4.5break:立即退出循环46
- 2.4.6if、if else和else:条件测试47
- 2.4.7match:类型感知的模式匹配48
- 2.5定义函数50
- 2.6使用引用50
- 2.7项目:绘制芒德布罗集51
- 2.8高级函数定义54
- 2.8.1显式生命周期注解54
- 2.8.2泛型函数55
- 2.9创建grep-lite58
- 2.10使用数组、切片和动态数组来创建数据列表61
- 2.10.1数组61
- 2.10.2切片63
- 2.10.3动态数组63
- 2.11包含第三方代码65
- 2.11.1增加对正则表达式的支持66
- 2.11.2生成包的本地化文档67
- 2.11.3使用rustup管理Rust工具链68
- 2.12命令行参数的支持68
- 2.13从文件中读取70
- 2.14从标准输入中读取72
- 本章小结73
- 第3章复合数据类型75
- 3.1使用普通函数对API进行实验76
- 3.2使用结构体为文件建模77
- 3.3使用impl为结构体添加方法81
- 3.4返回错误信息84
- 3.4.1修改一个著名的全局变量85
- 3.4.2使用Result作为返回类型88
- 3.5定义并使用枚举体91
- 3.6使用trait来定义共有的行为95
- 3.6.1创建名为Read的trait95
- 3.6.2为类型实现std::fmt::Display96
- 3.7将类型暴露给外部使用99
- 3.8创建内联文档100
- 3.8.1使用rustdoc给单个源文件生成文档101
- 3.8.2使用cargo为一个包及其依赖的包生成文档101
- 本章小结103
- 第4章生命周期、所有权和借用104
- 4.1实现一个模拟的立方体卫星地面站105
- 4.1.1遇到第 一个生命周期问题106
- 4.1.2基本类型的特殊行为109
- 4.2本章图例的说明110
- 4.3所有者是什么?它有什么职责?111
- 4.4所有权是如何移动的?112
- 4.5解决所有权的问题114
- 4.5.1在不需要完整所有权的地方,使用引用116
- 4.5.2使用更少的长存活期的值119
- 4.5.3在需要完整所有权的地方,复制长存活期的值124
- 4.5.4把数据包装到特殊的类型中127
- 本章小结129
- 第二部分揭开系统编程的神秘面纱
- 第5章深入理解数据133
- 5.1位模式和类型133
- 5.2整数的生存范围135
- 5.3小数的表示形式139
- 5.4浮点数139
- 5.4.1观察f32的内部140
- 5.4.2分离出符号位141
- 5.4.3分离出指数142
- 5.4.4分离出尾数143
- 5.4.5剖析一个浮点数145
- 5.5定点数格式147
- 5.6从随机字节中生成随机概率151
- 5.7实现一个CPU模拟器以建立函数也是数据的观念153
- 5.7.1CPU原型1:加法器153
- 5.7.2CPU原型1完整的清单157
- 5.7.3CPU原型2:累加器159
- 5.7.4CPU原型3:调用函数162
- 5.7.5CPU 4:添加额外功能168
- 本章小结168
- 第6章内存169
- 6.1指针169
- 6.2探索Rust的引用和指针类型171
- 6.2.1Rust中的原始指针176
- 6.2.2Rust指针的生态系统178
- 6.2.3智能指针构建块180
- 6.3为程序提供存储数据的内存181
- 6.3.1栈181
- 6.3.2堆183
- 6.3.3什么是动态内存分配?187
- 6.3.4分析动态内存分配的影响192
- 6.4虚拟内存194
- 6.4.1背景195
- 6.4.2第 一步:让一个进程来扫描它自己的内存196
- 6.4.3把虚拟地址翻译为物理地址198
- 6.4.4第二步:通过操作系统来扫描地址空间201
- 6.4.5第三步:读取和写入进程内存中的字节数据203
- 本章小结203
- 第7章文件与存储204
- 7.1文件格式是什么?204
- 7.2创建你自己的用于存储数据的文件格式206
- 7.3实现一个hexdump的克隆208
- 7.4Rust中的文件操作211
- 7.4.1使用Rust打开一个文件并控制文件的模式211
- 7.4.2使用std::fs::Path以一种类型安全的方式与文件系统进行交互212
- 7.5使用基于日志结构、仅追加的存储架构,来实现一个键值存储213
- 7.5.1键值模型213
- 7.5.2讲解actionkv v1:一个带有命令行接口的内存中的键值存储214
- 7.6Actionkv v1:前端代码215
- 7.7理解ACTIONKV的核心:LIBACTIONKV包219
- 7.7.1初始化ActionKV结构体219
- 7.7.2处理单条记录221
- 7.7.3以确定的字节顺序将多字节二进制数据写入磁盘223
- 7.7.4使用校验和来验证I/O错误225
- 7.7.5向已存在的数据库中插入一个新的键值对227
- 7.7.6actionkv的完整清单228
- 7.7.7使用HashMap和BTreeMap来处理键和值232
- 7.7.8创建一个HashMap并用值来填充它234
- 7.7.9从HashMap和BTreeMap中来检索值235
- 7.7.10在HashMap和BTreeMap之间如何选择236
- 7.7.11给actionkv v2.0添加数据库索引237
- 本章小结240
- 第8章网络242
- 8.1全部的网络体系都在7个分层中243
- 8.2使用reqwest来生成一个HTTP GET请求245
- 8.3trait对象247
- 8.3.1trait对象能做什么?247
- 8.3.2trait对象是什么?247
- 8.3.3创建一个微型的角色扮演游戏:rpg项目248
- 8.4TCP251
- 8.4.1端口号是什么?252
- 8.4.2把主机名转换为IP地址252
- 8.5以符合工效学的方式处理来自多个包的错误258
- 8.5.1问题:无法返回多种错误类型259
- 8.5.2通过定义错误类型来包装下游的错误262
- 8.5.3使用unwrap()和expect()来“作弊”267
- 8.6MAC地址268
- 8.7使用Rust的枚举体来实现状态机271
- 8.8原始TCP272
- 8.9创建一个虚拟网络设备272
- 8.10原始HTTP273
- 本章小结282
- 第9章时间与时间保持283
- 9.1背景284
- 9.2时间源285
- 9.3一些相关的术语定义286
- 9.4时间的编码287
- 9.5clock v0.1.0:教会一个应用程序如何报时288
- 9.6clock v0.1.1:格式化时间戳以符合ISO 8601和电子邮件的标准289
- 9.6.1重构clock v0.1.0的代码以支持更广泛的体系结构290
- 9.6.2时间的格式化291
- 9.6.3提供一个完整的命令行接口291
- 9.6.4clock v0.1.1:完整的项目代码293
- 9.7clock v0.1.2:设置时间295
- 9.7.1相同的行为模式295
- 9.7.2给使用libc的操作系统来设置时间296
- 9.7.3在Windows上设置时间298
- 9.7.4clock v0.1.2:完整的清单300
- 9.8改善错误处理303
- 9.9clock v0.1.3:使用NTP来解决时钟之间的差异304
- 9.9.1发送NTP请求并解析响应304
- 9.9.2依据服务器的响应来调整本地时间306
- 9.9.3在使用了不同的精度和纪元的时间表示法之间进行转换308
- 9.9.4clock v0.1.3:完整的清单309
- 本章小结316
- 第 10章进程、线程和容器318
- 10.1匿名函数319
- 10.2产生线程320
- 10.2.1引入闭包320
- 10.2.2产生一个新线程321
- 10.2.3产生几个线程的效果321
- 10.2.4产生很多个线程的效果322
- 10.2.5重新生成这些结果324
- 10.2.6共享的变量328
- 10.3闭包与函数的差异330
- 10.4从多线程解析器和代码生成器中程序化地生成头像331
- 10.4.1如何运行render-hex以及预期的输出331
- 10.4.2单线程版本render-hex的概要介绍 333
- 10.4.3为每个逻辑上的任务产生一个线程341
- 10.4.4使用线程池和任务队列343
- 10.5并发与任务虚拟化350
- 10.5.1线程352
- 10.5.2上下文切换是什么?352
- 10.5.3进程353
- 10.5.4WebAssembly353
- 10.5.5容器353
- 10.5.6为什么要使用操作系统呢?354
- 本章小结354
- 第 11章内核355
- 11.1初级操作系统(FledgeOS)355
- 11.1.1搭建开发环境,用于开发操作系统内核355
- 11.1.2验证开发环境357
- 11.2Fledgeos-0:先让一些东西能运行起来358
- 11.2.1第 一次引导启动358
- 11.2.2编译的步骤359
- 11.2.3源清单360
- 11.2.4处理panic364
- 11.2.5使用VGA兼容的文本模式写入屏幕365
- 11.2.6_start():FledgeOS的main()函数366
- 11.3fledgeos-1:避免使用忙循环367
- 11.3.1通过直接与CPU交互来降低功耗367
- 11.3.2fledgeos-1的源代码368
- 11.4fledgeos-2:自定义异常处理369
- 11.4.1几乎可以正确地处理异常369
- 11.4.2fledgeos-2的源代码369
- 11.5fledgeos-3:文本的输出370
- 11.5.1把彩色的文本输出到屏幕371
- 11.5.2控制枚举体的内存表示形式371
- 11.5.3为何要使用枚举体?372
- 11.5.4创建出一个类型,能够用来输出到VGA的帧缓冲区372
- 11.5.5输出到屏幕373
- 11.5.6fledgeos-3的源代码373
- 11.6fledgeos-4:自定义恐慌处理375
- 11.6.1实现一个恐慌处理程序,能够向用户报告错误375
- 11.6.2使用core::fmt::Write来重新实现panic()376
- 11.6.3实现core::fmt::Write376
- 11.6.4fledgeos-4的源代码377
- 本章小结379
- 第 12章信号、中断和异常380
- 12.1术语表380
- 12.2中断是如何影响应用程序的?383
- 12.3软件中断384
- 12.4硬件中断385
- 12.5信号处理386
- 12.5.1默认的行为386
- 12.5.2用来暂停和恢复一个程序的操作386
- 12.5.3列出操作系统支持的所有信号389
- 12.6使用自定义的行为来处理信号389
- 12.6.1在Rust中使用全局变量390
- 12.6.2使用全局变量来指示已经启动了关机392
- 12.7发送由应用程序定义的信号394
- 12.8如何忽略信号?396
- 12.9从深层嵌套的调用栈中关闭程序397
- 12.9.1sjlj项目的介绍399
- 12.9.2在程序中设置固有函数399
- 12.9.3把指针转换成其他类型401
- 12.9.4编译sjlj项目402
- 12.9.5sjlj项目的源代码403
- 12.10将这些技术应用于不支持信号的平台的说明406
- 12.11修订异常406
- 本章小结406