Rust 實戰 Rust in Action

Tim McNamara 譯者 金偉唐剛

  • 出版商: 人民郵電
  • 出版日期: 2022-08-01
  • 售價: $779
  • 貴賓價: 9.5$740
  • 語言: 簡體中文
  • 頁數: 406
  • 裝訂: 平裝
  • ISBN: 7115591393
  • ISBN-13: 9787115591395
  • 相關分類: Rust 語言
  • 此書翻譯自: Rust in Action (Paperback)
  • 立即出貨

買這商品的人也買了...

商品描述

本書通過探索多種系程概念和技術引入Rust編程語言,在深入探索計算機工作原理的同時,
幫助讀者了解Rust的所有權系統、Trait、包管理、錯誤處理、條件編譯等概念,
並通過源自現實的示例來幫助讀者了解Rust中的內存模型、文件操作、多線程、網絡編程等內容。
本書旨在幫助讀者理解如何用Rust進行系程,並提供了一些使用Rust編寫代碼的技巧。
本書給出了10餘個源自現實的示例,讓讀者不僅能了解Rust語法,還能了解Rust的實際運用。
本書適合所有對Rust感興趣的讀者閱讀。
要好地掌握本書涵蓋的內容,讀者應具備一定的編程經驗,
至少應對計算機編程的基本概念有所了解。

作者簡介

Tim McNamara
是文本挖掘、自然語言處理和數據工程等領域的專家。
他是Rust Wellington(新西蘭Rust開發者活動)的組織者,
並且定期通過社交網站主持Rust編程教學

目錄大綱

第一部分Rust語言的特色
第1章Rust語言介紹3
1.1 哪些地方使用了Rust?4
1.2 在工作中提倡使用Rust 5
1.3 Rust初體驗6
1.3.1 直通“Hello, world!” 6
1.3.2 第一個Rust程序8
1.4 下載本書源代碼10
1.5 使用Rust語言的感受如何10
1.6 Rust語言是什麼?13
1.6.1 Rust的目標:安全性14
1.6.2 Rust的目標:生產力18
1.6.3 Rust的目標:控制19
1.7 Rust的主要特點20
1.7.1 性能20
1.7.2 並發21
1.7.3 內存使用效率21
1.8 Rust的缺點21
1.8.1 循環數據結構21
1.8.2 編譯速度22
1.8.3 嚴格22
1.8.4 語言的大小22
1.8.5 炒作22
1.9 TLS安全性問題的研究22
1.9.1 “心臟出血” 23
1.9.2 跳轉到失敗23
1.10 Rust 適用於哪些領域?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.9 Web 27
1.10.10 系程27
1.11 Rust的隱式特性:它的社區27
1.12 Rust術語表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.1 for循環:迭代的中心支柱43
2.4.2 continue:跳過本次迭代餘下的部分45
2.4.3 while:循環,直到循環條件改變了循環的狀態45
2.4.4 loop:Rust循環結構的基本組件46
2.4.5 break:立即退出循環46
2.4.6 if、if else和else:條件測試47
2.4.7 match:類型感知的模式匹配48
2.5 定義函數50
2.6 使用引用50
2.7 項目:繪製芒德布羅集51
2.8 函數定義54
2.8.1 顯式生命週期註解54
2.8.2 泛型函數55
2.9 創建grep-lite 58
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的trait 95
3.6.2 為類型實現std::fmt::Display 96
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.1 CPU原型1:加法器153
5.7.2 CPU原型1完整的清單157
5.7.3 CPU原型2:累加器159
5.7.4 CPU原型3:調用函數162
5.7.5 CPU 4:添加額外功能168
本章小結168
第6章內存169
6.1 指針169
6.2 探索Rust的引用和指針類型171
6.2.1 Rust中的原始指針176
6.2.2 Rust指針的生態系統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.4 Rust中的文件操作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.6 Actionkv v1:前端代碼215
7.7 理解ACTIONKV的核心:LIBACTIONKV包219
7.7.1 初始化ActionKV結構體219
7.7.2 處理單條記錄221
7.7.3 以確定的字節順序將多字節二進制數據寫入磁盤223
7.7.4 使用校驗和來驗證IO錯誤225
7.7.5 向已存在的數據庫中插入一個新的鍵值對227
7.7.6 actionkv的完整清單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.3 trait對象247
8.3.1 trait對象能做什麼?247
8.3.2 trait對像是什麼?247
8.3.3 創建一個微型的角色扮演遊戲:rpg項目248
8.4 TCP 251
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.6 MAC地址268
8.7 使用Rust的枚舉體來實現狀態機271
8.8 原始TCP 272
8.9 創建一個虛擬網絡設備272
8.10 原始HTTP 273
本章小結282
第9章時間與時間保持283
9.1 背景284
9.2 時間源285
9.3 一些相關的術語定義286
9.4 時間的編碼287
9.5 clock v0.1.0:教會一個應用程序如何報時288
9.6 clock v0.1.1:格式化時間戳以符合ISO 8601和電子郵件的標準289
9.6.1 重構clock v0.1.0的代碼以支持廣泛的體系結構290
9.6.2 時間的格式化291
9.6.3 提供一個完整的命令行接口291
9.6.4 clock v0.1.1:完整的項目代碼293
9.7 clock v0.1.2:設置時間295
9.7.1 相同的行為模式295
9.7.2 給使用libc的操作系統來設置時間296
9.7.3 在Windows上設置時間298
9.7.4 clock v0.1.2:完整的清單300
9.8 改善錯誤處理303
9.9 clock v0.1.3:使用NTP來解決時鐘之間的差異304
9.9.1 發送NTP請求並解析響應304
9.9.2 依據服務器的響應來調整本地時間306
9.9.3 在使用了不同的精度和紀元的時間表示法之間進行轉換308
9.9.4 clock 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.4 WebAssembly 353
10.5.5 容器353
10.5.6 為什麼要使用操作系統呢?354
本章小結354
第11章內核355
11.1 初級操作系統(FledgeOS) 355
11.1.1 搭建開發環境,用於開發操作系統內核355
11.1.2 驗證開發環境357
11.2 Fledgeos-0:先讓一些東西能運行起來358
11.2.1 第一次引導啟動358
11.2.2 編譯的步驟359
11.2.3 源清單360
11.2.4 處理panic 364
11.2.5 使用VGA兼容的文本模式寫入屏幕365
11.2.6 _start():FledgeOS的main()函數366
11.3 fledgeos-1:避免使用忙循環367
11.3.1 通過直接與CPU交互來降低功耗367
11.3.2 fledgeos-1的源代碼368
11.4 fledgeos-2:自定義異常處理369
11.4.1 幾乎可以正確地處理異常369
11.4.2 fledgeos-2的源代碼369
11.5 fledgeos-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.6 fledgeos-3的源代碼373
11.6 fledgeos-4:自定義恐慌處理375
11.6.1 實現一個恐慌處理程序,能夠向用戶報告錯誤375
11.6.2 使用core::fmt::Write來重新實現panic() 376
11.6.3 實現core::fmt::Write 376
11.6.4 fledgeos-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.1 sjlj項目的介紹399
12.9.2 在程序中設置固有函數399
12.9.3 把指針轉換成其他類型401
12.9.4 編譯sjlj項目402
12.9.5 sjlj項目的源代碼403
12.10 將這些技術應用於不支持信號的平台的說明406
12.11 修訂異常406
本章小結406