卓越的代碼需要利用現(xiàn)代編程語言的先進特性來實現(xiàn)軟件功能。但軟件最終都要運行在計算機上,無論它是采用哪種編程語言編寫的。因此,卓越的軟件代碼也要充分地利用計算機中的各種資源,將計算機的性能發(fā)揮到極致。現(xiàn)代編程語言將這些知識隱藏了起來,容易被我們忽視。因此,《編程卓越之道》系列的第一卷《深入理解計算機》將重點放在軟件執(zhí)行背后的計算機底層上,深入淺出地介紹了計算機體系結(jié)構(gòu)的方方面面,幫助我們理解如何才能寫出在計算機上高效運行的代碼。本書具體內(nèi)容包括:數(shù)字、字符串及復(fù)合數(shù)據(jù)結(jié)構(gòu)在計算機中的表示形式,以及如何在內(nèi)存層次結(jié)構(gòu)中訪問這些數(shù)據(jù);基本的二進制運算、位運算、布爾邏輯,以及如何設(shè)計完成運算的中央處理器指令集;輸入/輸出、大容量存儲等豐富多彩的外設(shè),以及把這些外設(shè)和計算機相連進行通信的各種總線技術(shù)。本書適合軟/硬件開發(fā)人員及系統(tǒng)程序員、移動及嵌入式設(shè)備開發(fā)者、體系結(jié)構(gòu)設(shè)計人員,以及高校計算機相關(guān)專業(yè)師生。
Randall Hyde是The Art of Assembly Language(《匯編語言的編程藝術(shù)》)和Write Great Code(《編程卓越之道》) 1~3卷(均由No Starch Press出版),以及Using 6502 Assembly Language和P-Source(由Datamost出版)的作者。他也是Microsoft Macro Assembler 6.0 Bible(由Waite Group出版)一書的合著者。在過去的40年里,Hyde一直從事嵌入式軟件/硬件工程師的工作,為核反應(yīng)堆、交通控制系統(tǒng)和其他電子設(shè)備開發(fā)相關(guān)指令集。他還在加州理工大學(xué)波莫納分校和加州大學(xué)河濱分校教授計算機科學(xué)課程。
覃宇,Thoughtworks咨詢師/應(yīng)用架構(gòu)專家,12年軟件開發(fā)經(jīng)驗,移動應(yīng)用開發(fā)專家,作為架構(gòu)師和技術(shù)教練專注于輔導(dǎo)客戶團隊改進持續(xù)交付實踐。譯有《Kotlin實戰(zhàn)》、《領(lǐng)域驅(qū)動設(shè)計精粹》、《Serverless架構(gòu):無服務(wù)器應(yīng)用與AWS Lambda》和《云原生安全與DevOps保障》;合著有《代碼管理核心技術(shù)及實踐》。
1 編寫卓越代碼須知 1
1.1 《編程卓越之道》系列 1
1.2 本書涵蓋的主題 2
1.3 閱讀本書的前提 4
1.4 卓越代碼的特征 5
1.5 本書要求的環(huán)境 6
1.6 額外建議 7
1.7 更多信息 7
2 數(shù)字表示 8
2.1 什么是數(shù)字 8
2.2 計數(shù)系統(tǒng) 9
2.2.1 十進制位值計數(shù)系統(tǒng) 10
2.2.2 底數(shù)(基數(shù)) 11
2.2.3 二進制計數(shù)系統(tǒng) 12
2.2.4 十六進制計數(shù)系統(tǒng) 15
2.2.5 八進制計數(shù)系統(tǒng) 17
2.3 數(shù)字/字符串轉(zhuǎn)換 18
2.4 內(nèi)部數(shù)字表示形式 20
2.4.1 位 20
2.4.2 位串 21
2.5 有符號和無符號數(shù) 24
2.6 二進制數(shù)的屬性 26
2.7 符號擴展、零擴展和收縮 27
2.8 飽和操作 31
2.9 二進制編碼的十進制表示 32
2.10 定點表示形式 33
2.11 比例數(shù)字格式 35
2.12 有理數(shù)表示形式 37
2.13 更多信息 38
3 二進制算術(shù)運算和位運算 39
3.1 二進制和十六進制數(shù)字的算術(shù)運算 39
3.1.1 二進制加法 40
3.1.2 二進制減法 41
3.1.3 二進制乘法 42
3.1.4 二進制除法 43
3.2 位的邏輯運算 45
3.3 二進制數(shù)值和位串的邏輯運算 47
3.4 有用的位運算 48
3.4.1 使用AND運算判斷位串中的一位 49
3.4.2 使用AND運算判斷多個位為零或非零 49
3.4.3 比較二進制字符串中的多個位 50
3.4.4 使用AND運算創(chuàng)建模n計數(shù)器 51
3.5 移位和旋轉(zhuǎn) 52
3.6 位字段和打包數(shù)據(jù) 55
3.7 數(shù)據(jù)的打包和解包 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 規(guī)約形式與非規(guī)約形式 76
4.4 舍入 77
4.5 特殊的浮點值 79
4.6 浮點數(shù)異常 80
4.7 浮點運算 81
4.7.1 浮點表示形式 82
4.7.2 浮點數(shù)的加減法 82
4.7.3 浮點數(shù)的乘除法 93
4.8 更多信息 102
5 字符表示形式 103
5.1 字符數(shù)據(jù) 103
5.1.1 ASCII字符集 104
5.1.2 EBCDIC字符集 107
5.1.3 雙字節(jié)字符集 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規(guī)范和規(guī)范等價性 115
5.1.10 Unicode編碼 116
5.1.11 Unicode組合字符 118
5.2 字符串 120
5.2.1 字符串格式 120
5.2.2 靜態(tài)字符串、偽動態(tài)字符串和動態(tài)字符串 127
5.2.3 字符串的引用計數(shù) 129
5.2.4 Delphi字符串 130
5.2.5 自定義字符串格式 130
5.3 字符集數(shù)據(jù)類型 130
5.3.1 字符集的冪集表示形式 131
5.3.2 字符集的列表表示形式 132
5.4 設(shè)計自定義字符集 133
5.4.1 設(shè)計高效的字符集 134
5.4.2 數(shù)字字符的編碼分組 135
5.4.3 字母字符分組 135
5.4.4 比較字母字符 138
5.4.5 其他字符分組 140
5.5 更多信息 143
6 內(nèi)存結(jié)構(gòu)和訪問 144
6.1 基本系統(tǒng)組件 144
6.1.1 系統(tǒng)總線 145
6.2 內(nèi)存的物理結(jié)構(gòu) 148
6.2.1 8位數(shù)據(jù)總線 151
6.2.2 16位數(shù)據(jù)總線 152
6.2.3 32位數(shù)據(jù)總線 155
6.2.4 64位數(shù)據(jù)總線 156
6.2.5 非80x86處理器對小單位內(nèi)存的訪問 156
6.3 大端序與小端序結(jié)構(gòu) 157
6.4 系統(tǒng)時鐘 163
6.4.1 內(nèi)存訪問和系統(tǒng)時鐘 165
6.4.2 等待狀態(tài) 166
6.4.3 緩存 168
6.5 CPU的內(nèi)存訪問模式 172
6.5.1 直接內(nèi)存尋址模式 172
6.5.2 間接尋址模式 173
6.5.3 變址尋址模式 174
6.5.4 比例變址尋址模式 175
6.6 更多信息 175
7 復(fù)合數(shù)據(jù)類型與內(nèi)存對象 176
7.1 指針類型 176
7.1.1 指針的實現(xiàn) 178
7.1.2 指針與動態(tài)內(nèi)存分配 179
7.1.3 指針操作與指針運算 179
7.2 數(shù)組 184
7.2.1 數(shù)組聲明 185
7.2.2 內(nèi)存中的數(shù)組表示形式 188
7.2.3 訪問數(shù)組元素 190
7.2.4 多維數(shù)組 190
7.3 記錄/結(jié)構(gòu)體 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 記錄的內(nèi)存存儲 204
7.4 判別聯(lián)合 207
7.4.1 C/C++聯(lián)合 208
7.4.2 Pascal/Delphi聯(lián)合 208
7.4.3 Swift聯(lián)合 209
7.4.4 HLA聯(lián)合 211
7.4.5 聯(lián)合的內(nèi)存存儲 211
7.4.6 聯(lián)合的其他用途 213
7.5 類 214
7.5.1 繼承 216
7.5.2 類構(gòu)造函數(shù) 221
7.5.3 多態(tài) 224
7.5.4 抽象方法和抽象基類 225
7.6 C++類 229
7.6.1 C++中的抽象成員函數(shù)和類 230
7.6.2 C++的多重繼承 231
7.7 Java類 233
7.8 Swift類 234
7.9 協(xié)議與接口 235
7.10 泛型和模板 239
7.11 更多信息 241
8 布爾邏輯與數(shù)字設(shè)計 242
8.1 布爾代數(shù) 243
8.1.1 布爾運算符 243
8.1.2 布爾假設(shè) 243
8.1.3 布爾運算符優(yōu)先級 246
8.2 布爾函數(shù)與真值表 246
8.3 函數(shù)編號 248
8.4 布爾表達式的代數(shù)運算 250
8.5 規(guī)范形式 250
8.5.1 極小項和規(guī)范形式與真值表 252
8.5.2 使用代數(shù)方法得到極小項和規(guī)范形式 254
8.5.3 極大項積規(guī)范形式 255
8.6 布爾函數(shù)簡化 256
8.7 這和計算機有什么關(guān)系 264
8.7.1 電路與布爾函數(shù) 265
8.7.2 組合電路 267
8.7.3 時序與時鐘邏輯 274
8.8 更多信息 278
9 CPU 體系結(jié)構(gòu) 280
9.1 CPU設(shè)計基礎(chǔ) 280
9.2 指令的解碼與執(zhí)行:隨機邏輯與微碼 283
9.3 指令執(zhí)行詳解 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:通過執(zhí)行更多更快的指令來提高性能 290
9.5 提高處理速度的關(guān)鍵:并行 291
9.5.1 功能單元 294
9.5.2 預(yù)取隊列 296
9.5.3 影響預(yù)取隊列性能的情況 299
9.5.4 同時執(zhí)行多條指令的流水線 299
9.5.5 指令緩存:提供多條內(nèi)存訪問通路 304
9.5.6 流水線冒險 306
9.5.7 超標(biāo)量運算:并行執(zhí)行指令 308
9.5.8 亂序執(zhí)行 310
9.5.9 寄存器重命名 310
9.5.10 甚長指令字體系結(jié)構(gòu) 312
9.5.11 并行處理 312
9.5.12 多處理 313
9.6 更多信息 315
10 指令集體系結(jié)構(gòu) 316
10.1 指令集設(shè)計的重要性 317
10.2 指令設(shè)計的基本目標(biāo) 318
10.2.1 操作碼的長度選擇 320
10.2.2 規(guī)劃未來 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的立即(常量)操作數(shù)編碼 351
10.4.4 8位、16位和32位操作數(shù)的編碼 352
10.4.5 64位操作數(shù)編碼 353
10.4.6 指令的替代編碼 353
10.5 指令集設(shè)計對程序員的意義 354
10.6 更多信息 354
11 內(nèi)存體系結(jié)構(gòu)與組織 355
11.1 內(nèi)存層次結(jié)構(gòu) 355
11.2 內(nèi)存層次結(jié)構(gòu)的工作原理 359
11.3 內(nèi)存子系統(tǒng)的性能差距 360
11.4 緩存體系結(jié)構(gòu) 362
11.4.1 直接映射緩存 364
11.4.2 全相聯(lián)緩存 365
11.4.3 n路組相聯(lián)緩存 365
11.4.4 緩存行置換策略 367
11.4.5 緩存寫入策略 368
11.4.6 緩存使用與軟件 369
11.5 NUMA與外設(shè) 370
11.6 虛擬內(nèi)存、內(nèi)存保護與分頁 370
11.7 編寫理解內(nèi)存層次結(jié)構(gòu)的軟件 375
11.8 運行時的內(nèi)存結(jié)構(gòu) 376
11.8.1 靜態(tài)對象與動態(tài)對象,綁定與生命期 378
11.8.2 代碼段、只讀數(shù)據(jù)段與常量段 379
11.8.3 靜態(tài)變量段 380
11.8.4 存儲變量段 380
11.8.5 棧 381
11.8.6 堆與動態(tài)內(nèi)存分配 381
11.9 更多信息 388
12 輸入與輸出 389
12.1 連接CPU與外界 389
12.2 端口和系統(tǒng)連接的其他方式 393
12.3 輸入/輸出機制 394
12.3.1 內(nèi)存映射輸入/輸出 395
12.3.2 I/O映射輸入/輸出 396
12.3.3 直接內(nèi)存訪問 396
12.4 輸入/輸出速度等級 397
12.5 系統(tǒng)總線與數(shù)據(jù)傳輸速率 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 保護模式操作與設(shè)備驅(qū)動程序 406
12.10.1 設(shè)備驅(qū)動模型 407
12.10.2 與設(shè)備驅(qū)動程序通信 408
12.11 更多信息 409
13 計算機外設(shè)總線 410
13.1 小型計算機系統(tǒng)接口 410
13.1.1 限制 411
13.1.2 改進 412
13.1.3 SCSI協(xié)議 413
13.1.4 SCSI的優(yōu)點 415
13.2 IDE/ATA接口 416
13.2.1 SATA接口 417
13.2.2 光纖通道 418
13.3 通用串行總線 418
13.3.1 USB設(shè)計 418
13.3.2 USB性能 420
13.3.3 USB傳輸?shù)念愋?421
13.3.4 USB-C 423
13.3.5 USB設(shè)備驅(qū)動程序 424
13.4 更多信息 425
14 大容量存儲設(shè)備與文件系統(tǒng) 426
14.1 磁盤驅(qū)動器 426
14.1.1 軟盤驅(qū)動器 427
14.1.2 硬盤驅(qū)動器 427
14.1.3 RAID系統(tǒng) 433
14.1.4 光驅(qū) 435
14.1.5 CD、DVD與藍光驅(qū)動器 436
14.2 磁帶驅(qū)動器 438
14.3 閃存 439
14.4 RAM盤 441
14.5 固態(tài)硬盤 442
14.6 混合硬盤 443
14.7 大容量存儲設(shè)備上的文件系統(tǒng) 443
14.7.1 順序文件系統(tǒng) 444
14.7.2 高效的文件分配策略 445
14.8 編寫操作大容量存儲設(shè)備數(shù)據(jù)的軟件 454
14.8.1 文件訪問的性能 454
14.8.2 同步與異步I/O 456
14.8.3 I/O類型的影響 457
14.8.4 內(nèi)存映射文件 457
14.9 更多信息 459
15 豐富多彩的輸入/輸出設(shè)備 460
15.1 探索特定PC上的外設(shè) 460
15.1.1 鍵盤 461
15.1.2 標(biāo)準(zhǔn)PC并口 462
15.1.3 串口 464
15.2 鼠標(biāo)、觸控板及其他定點設(shè)備 465
15.3 操縱桿與游戲控制器 466
15.4 聲卡 467
15.4.1 音頻接口外設(shè)如何產(chǎn)生聲音 468
15.4.2 音頻與MIDI文件格式 470
15.4.3 音頻設(shè)備編程 471
15.5 更多信息 472
后記:運用底層語言思想,編寫高級語言代碼 473