編程卓越之道(捲1):深入理解電腦(第2版) Write Great Code, Volume 1 : Understanding the Machine, 2/e

Randall Hyde 覃宇

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

商品描述

卓越的代碼需要利用現代編程語言的先進特性來實現軟件功能。但軟件最終都要運行在電腦上,無論它是採用哪種編程語言編寫的。因此,卓越的軟件代碼也要充分地利用電腦中的各種資源,將電腦的性能發揮到極致。現代編程語言將這些知識隱藏了起來,容易被我們忽視。因此,《編程卓越之道》系列的第一捲《深入理解電腦》將重點放在軟件執行背後的電腦底層上,深入淺出地介紹了電腦體系結構的方方面面,幫助我們理解如何才能寫出在電腦上高效運行的代碼。本書具體內容包括:數字、字符串及復合數據結構在電腦中的表示形式,以及如何在內存層次結構中訪問這些數據;基本的二進制運算、位運算、布爾邏輯,以及如何設計完成運算的中央處理器指令集;輸入/輸出、大容量存儲等豐富多彩的外設,以及把這些外設和電腦相連進行通信的各種總線技術。本書適合軟/硬件開發人員及系統程序員、移動及嵌入式設備開發者、體系結構設計人員,以及高校電腦相關專業師生。

目錄大綱

1 編寫卓越代碼須知 1
1.1 《編程卓越之道》系列 1
1.2 本書涵蓋的主題 2
1.3 閱讀本書的前提 4
1.4 卓越代碼的特徵 5
1.5 本書要求的環境 6
1.6 額外建議 7
1.7 更多信息 7
2 數字表示 8
2.1 什麽是數字 8
2.2 計數系統 9
2.2.1 十進制位值計數系統 10
2.2.2 底數(基數) 11
2.2.3 二進制計數系統 12
2.2.4 十六進制計數系統 15
2.2.5 八進制計數系統 17
2.3 數字/字符串轉換 18
2.4 內部數字表示形式 20
2.4.1 位 20
2.4.2 位串 21
2.5 有符號和無符號數 24
2.6 二進制數的屬性 26
2.7 符號擴展、零擴展和收縮 27
2.8 飽和操作 31
2.9 二進制編碼的十進製表示 32
2.10 定點表示形式 33
2.11 比例數字格式 35
2.12 有理數表示形式 37
2.13 更多信息 38
3 二進制算術運算和位運算 39
3.1 二進制和十六進制數字的算術運算 39
3.1.1 二進制加法 40
3.1.2 二進制減法 41
3.1.3 二進制乘法 42
3.1.4 二進制除法 43
3.2 位的邏輯運算 45
3.3 二進制數值和位串的邏輯運算 47
3.4 有用的位運算 48
3.4.1 使用AND運算判斷位串中的一位 49
3.4.2 使用AND運算判斷多個位為零或非零 49
3.4.3 比較二進制字符串中的多個位 50
3.4.4 使用AND運算創建模n計數器 51
3.5 移位和旋轉 52
3.6 位字段和打包數據 55
3.7 數據的打包和解包 60
3.8 更多信息 65
4 浮點表示形式 66
4.1 浮點運算簡介 66
4.2 IEEE 浮點格式 72
4.2.1 單精度浮點格式 72
4.2.2 雙精度浮點格式 74
4.2.3 擴展精度浮點格式 75
4.2.4 四精度浮點格式 76
4.3 規約形式與非規約形式 76
4.4 舍入 77
4.5 特殊的浮點值 79
4.6 浮點數異常 80
4.7 浮點運算 81
4.7.1 浮點表示形式 82
4.7.2 浮點數的加減法 82
4.7.3 浮點數的乘除法 93
4.8 更多信息 102
5 字符表示形式 103
5.1 字符數據 103
5.1.1 ASCII字符集 104
5.1.2 EBCDIC字符集 107
5.1.3 雙字節字符集 108
5.1.4 Unicode字符集 109
5.1.5 Unicode碼位 110
5.1.6 Unicode編碼平面 111
5.1.7 代用碼位 111
5.1.8 字形、字符和字素簇 112
5.1.9 Unicode規範和規範等價性 115
5.1.10 Unicode編碼 116
5.1.11 Unicode組合字符 118
5.2 字符串 120
5.2.1 字符串格式 120
5.2.2 靜態字符串、偽動態字符串和動態字符串 127
5.2.3 字符串的引用計數 129
5.2.4 Delphi字符串 130
5.2.5 自定義字符串格式 130
5.3 字符集數據類型 130
5.3.1 字符集的冪集表示形式 131
5.3.2 字符集的列表表示形式 132
5.4 設計自定義字符集 133
5.4.1 設計高效的字符集 134
5.4.2 數字字符的編碼分組 135
5.4.3 字母字符分組 135
5.4.4 比較字母字符 138
5.4.5 其他字符分組 140
5.5 更多信息 143
6 內存結構和訪問 144
6.1 基本系統組件 144
6.1.1 系統總線 145
6.2 內存的物理結構 148
6.2.1 8位數據總線 151
6.2.2 16位數據總線 152
6.2.3 32位數據總線 155
6.2.4 64位數據總線 156
6.2.5 非80x86處理器對小單位內存的訪問 156
6.3 大端序與小端序結構 157
6.4 系統時鐘 163
6.4.1 內存訪問和系統時鐘 165
6.4.2 等待狀態 166
6.4.3 緩存 168
6.5 CPU的內存訪問模式 172
6.5.1 直接內存尋址模式 172
6.5.2 間接尋址模式 173
6.5.3 變址尋址模式 174
6.5.4 比例變址尋址模式 175
6.6 更多信息 175
7 復合數據類型與內存對象 176
7.1 指針類型 176
7.1.1 指針的實現 178
7.1.2 指針與動態內存分配 179
7.1.3 指針操作與指針運算 179
7.2 數組 184
7.2.1 數組聲明 185
7.2.2 內存中的數組表示形式 188
7.2.3 訪問數組元素 190
7.2.4 多維數組 190
7.3 記錄/結構體 200
7.3.1 Pascal/Delphi記錄 201
7.3.2 C/C++記錄 202
7.3.3 HLA記錄 203
7.3.4 Swift記錄(元組) 203
7.3.5 記錄的內存存儲 204
7.4 判別聯合 207
7.4.1 C/C++聯合 208
7.4.2 Pascal/Delphi聯合 208
7.4.3 Swift聯合 209
7.4.4 HLA聯合 211
7.4.5 聯合的內存存儲 211
7.4.6 聯合的其他用途 213
7.5 類 214
7.5.1 繼承 216
7.5.2 類構造函數 221
7.5.3 多態 224
7.5.4 抽象方法和抽象基類 225
7.6 C++類 229
7.6.1 C++中的抽象成員函數和類 230
7.6.2 C++的多重繼承 231
7.7 Java類 233
7.8 Swift類 234
7.9 協議與接口 235
7.10 泛型和模板 239
7.11 更多信息 241
8 布爾邏輯與數字設計 242
8.1 布爾代數 243
8.1.1 布爾運算符 243
8.1.2 布爾假設 243
8.1.3 布爾運算符優先級 246
8.2 布爾函數與真值表 246
8.3 函數編號 248
8.4 布爾表達式的代數運算 250
8.5 規範形式 250
8.5.1 極小項和規範形式與真值表 252
8.5.2 使用代數方法得到極小項和規範形式 254
8.5.3 極大項積規範形式 255
8.6 布爾函數簡化 256
8.7 這和電腦有什麽關系 264
8.7.1 電路與布爾函數 265
8.7.2 組合電路 267
8.7.3 時序與時鐘邏輯 274
8.8 更多信息 278
9 CPU 體系結構 280
9.1 CPU設計基礎 280
9.2 指令的解碼與執行:隨機邏輯與微碼 283
9.3 指令執行詳解 284
9.3.1 mov指令 285
9.3.2 add指令 286
9.3.3 jnz指令 288
9.3.4 loop指令 289
9.4 RISC還是CISC:通過執行更多更快的指令來提高性能 290
9.5 提高處理速度的關鍵:並行 291
9.5.1 功能單元 294
9.5.2 預取隊列 296
9.5.3 影響預取隊列性能的情況 299
9.5.4 同時執行多條指令的流水線 299
9.5.5 指令緩存:提供多條內存訪問通路 304
9.5.6 流水線冒險 306
9.5.7 超標量運算:並行執行指令 308
9.5.8 亂序執行 310
9.5.9 寄存器重命名 310
9.5.10 甚長指令字體系結構 312
9.5.11 並行處理 312
9.5.12 多處理 313
9.6 更多信息 315
10 指令集體系結構 316
10.1 指令集設計的重要性 317
10.2 指令設計的基本目標 318
10.2.1 操作碼的長度選擇 320
10.2.2 規劃未來 322
10.2.3 選擇指令 322
10.2.4 分配指令操作碼 323
10.3 假想處理器Y86 324
10.3.1 Y86的限制 324
10.3.2 Y86指令 325
10.3.3 Y86的尋址模式 327
10.3.4 Y86指令編碼 327
10.3.5 Y86指令編碼示例 330
10.3.6 擴展Y86指令集 335
10.4 80x86 指令編碼 336
10.4.1 指令操作碼的編碼 339
10.4.2 add指令編碼的例子 346
10.4.3 x86的立即(常量)操作數編碼 351
10.4.4 8位、16位和32位操作數的編碼 352
10.4.5 64位操作數編碼 353
10.4.6 指令的替代編碼 353
10.5 指令集設計對程序員的意義 354
10.6 更多信息 354
11 內存體系結構與組織 355
11.1 內存層次結構 355
11.2 內存層次結構的工作原理 359
11.3 內存子系統的性能差距 360
11.4 緩存體系結構 362
11.4.1 直接映射緩存 364
11.4.2 全相聯緩存 365
11.4.3 n路組相聯緩存 365
11.4.4 緩存行置換策略 367
11.4.5 緩存寫入策略 368
11.4.6 緩存使用與軟件 369
11.5 NUMA與外設 370
11.6 虛擬內存、內存保護與分頁 370
11.7 編寫理解內存層次結構的軟件 375
11.8 運行時的內存結構 376
11.8.1 靜態對象與動態對象,綁定與生命期 378
11.8.2 代碼段、只讀數據段與常量段 379
11.8.3 靜態變量段 380
11.8.4 存儲變量段 380
11.8.5 棧 381
11.8.6 堆與動態內存分配 381
11.9 更多信息 388
12 輸入與輸出 389
12.1 連接CPU與外界 389
12.2 埠和系統連接的其他方式 393
12.3 輸入/輸出機制 394
12.3.1 內存映射輸入/輸出 395
12.3.2 I/O映射輸入/輸出 396
12.3.3 直接內存訪問 396
12.4 輸入/輸出速度等級 397
12.5 系統總線與數據傳輸速率 398
12.5.1 PCI總線的性能 400
12.5.2 ISA總線的性能 401
12.5.3 AGP總線 401
12.6 緩沖 402
12.7 握手 403
12.8 I/O埠超時 404
12.9 中斷與輪詢式I/O 405
12.10 保護模式操作與設備驅動程序 406
12.10.1 設備驅動模型 407
12.10.2 與設備驅動程序通信 408
12.11 更多信息 409
13 電腦外設總線 410
13.1 小型電腦系統接口 410
13.1.1 限制 411
13.1.2 改進 412
13.1.3 SCSI協議 413
13.1.4 SCSI的優點 415
13.2 IDE/ATA接口 416
13.2.1 SATA接口 417
13.2.2 光纖通道 418
13.3 通用串行總線 418
13.3.1 USB設計 418
13.3.2 USB性能 420
13.3.3 USB傳輸的類型 421
13.3.4 USB-C 423
13.3.5 USB設備驅動程序 424
13.4 更多信息 425
14 大容量存儲設備與文件系統 426
14.1 磁盤驅動器 426
14.1.1 軟盤驅動器 427
14.1.2 硬盤驅動器 427
14.1.3 RAID系統 433
14.1.4 光盤機 435
14.1.5 CD、DVD與藍光盤機動器 436
14.2 磁帶驅動器 438
14.3 快閃內存 439
14.4 RAM盤 441
14.5 固態硬盤 442
14.6 混合硬盤 443
14.7 大容量存儲設備上的文件系統 443
14.7.1 順序文件系統 444
14.7.2 高效的文件分配策略 445
14.8 編寫操作大容量存儲設備數據的軟件 454
14.8.1 文件訪問的性能 454
14.8.2 同步與異步I/O 456
14.8.3 I/O類型的影響 457
14.8.4 內存映射文件 457
14.9 更多信息 459
15 豐富多彩的輸入/輸出設備 460
15.1 探索特定PC上的外設 460
15.1.1 鍵盤 461
15.1.2 標準PC並口 462
15.1.3 串口 464
15.2 鼠標、觸控板及其他定點設備 465
15.3 操縱桿與游戲控制器 466
15.4 聲卡 467
15.4.1 音頻接口外設如何產生聲音 468
15.4.2 音頻與MIDI文件格式 470
15.4.3 音頻設備編程 471
15.5 更多信息 472
後記:運用底層語言思想,編寫高級語言代碼 473