計算機系統解密:從理解計算機到編寫高效代碼 The Secret Life of Programs: Understand Computers -- Craft Better Code

Jonathan E. Steinhart 張開元//張淼

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

商品描述

本書深入探討了計算機的基礎概念,比如計算機硬件、
軟件在硬件上的行為,以及隨著時間的推移,人們如何解決問題等主題;
介紹了現實世界是如何轉換成計算機能理解的形式的,組成計算機的基本構件,
以及為什麼設計與計算機硬件相匹配的程序可以提高性能;
還將介紹如何將程序轉換為計算機能夠理解的機器語言,
如何用軟件構建塊創造Web瀏覽器等程序,讓程序更高效的循環不變式、強度削弱和遞歸細分等技巧,
計算機安全和機器智能的基礎知識,以及項目設計、文檔編制、日程安排、可移植性、維護等內容。

作者簡介

Jonathan E. Steinhart

設計了圖形硬件和軟件,並建立了CAD系統、圖形工作站、電路模擬器、發電廠。
他曾在蘋果、英特爾、Sun、Welch-Allyn、Lulu等公司擔任諮詢顧問。

目錄大綱

譯者序
前言
致謝
作者簡介
審校者簡介
引言1
第1章 計算機的內部語言12
1.1 什麼是語言12
1.2 書面語言13
1.3 比特13
1.4 邏輯運算14
1.4.1 布爾代數14
1.4.2 德摩根定律15
1.5 用比特表示整數16
1.5.1 表示正數16
1.5.2 二進制加法18
1.5.3 表示負數20
1.6 表示實數23
1.6.1 定點表示法24
1.6.2 浮點表示法25
1.6.3 IEEE浮點標準26
1.7 二進制編碼的十進制系統27
1.8 處理二進制數的簡單方法27
1.8.1 八進製表示法27
1.8.2 十六進製表示法28
1.8.3 表示語境28
1.9 命名位組29
1.10 表示文本30
1.10.1 ASCII30
1.10.2 其他標準的演變32
1.10.3 UTF-832
1.11 用字符表示數字34
1.11.1 可打印字符引用編碼34
1.11.2 Base64編碼34
1.11.3 URL編碼35
1.12 表示顏色35
1.12.1 增加透明度37
1.12.2 編碼顏色38
1.13 本章小結39
第2章 組合邏輯40
2.1 數字計算機的案例40
2.1.1 模擬和數字之間的區別42
2.1.2 為什麼尺寸對硬件很重要43
2.1.3 數字使設備更加穩定44
2.1.4 模擬世界中的數字44
2.1.5 為什麼使用位而不是數字46
2.2 電學的簡單入門47
2.2.1 用管道理解電47
2.2.2 電源開關50
2.3 為位構建硬件52
2.3.1 繼電器52
2.3.2 真空管54
2.3.3 晶體管55
2.3.4 集成電路56
2.4 邏輯門57
2.4.1 利用遲滯現象提高抗噪聲能力58
2.4.2 差分信號59
2.4.3 傳播延遲60
2.4.4 輸出的變化61
2.5 構建更複雜的電路63
2.5.1 製作加法器63
2.5.2 製作解碼器65
2.5.3 製作多路輸出選擇器66
2.5.4 製作選擇器66
2.6 本章小結68
第3章 時序邏輯69
3.1 表示時間69
3.1.1 振盪器70
3.1.2 時鐘70
3.1.3 鎖存器71
3.1.4 鎖存器組成的門電路72
3.1.5 觸發器73
3.1.6 計數器75
3.1.7 寄存器77
3.2 內存組織和尋址78
3.2.1 隨機存取存儲器80
3.2.2 只讀存儲器81
3.3 塊設備83
3.4 閃存和固態磁盤驅動器85
3.5 檢錯和糾錯86
3.6 硬件和軟件87
3.7 本章小結88
第4章 計算機剖析89
4.1 內存89
4.2 輸入輸出91
4.3 中央處理器92
4.3.1 算術邏輯單元93
4.3.2 移位寄存器94
4.3.3 執行單元96
4.4 指令集97
4.4.1 指令97
4.4.2 尋址方式99
4.4.3 條件碼指令99
4.4.4 分支100
4.4.5 最終指令集100
4.5 最終設計103
4.5.1 指令寄存器103
4.5.2 數據通路和控制信號103
4.5.3 流量控制104
4.6 RISC和CISC指令集107
4.7 圖形處理單元108
4.8 本章小結108
第5章 計算機架構109
5.1 基本架構元素109
5.1.1 處理器核心110
5.1.2 微處理器和微型計算機110
5.2 過程、子程序和函數111
5.3 堆棧113
5.4 中斷116
5.5 相對尋址118
5.6 內存管理單元119
5.7 虛擬內存121
5.8 系統和用戶空間121
5.9 存儲器層次和性能122
5.10 協處理器123
5.11 在內存中排列數據124
5.12 運行程序125
5.13 內存功耗126
5.14 本章小結126
第6章 通信故障127
6.1 低電平I/O127
6.1.1 I/O端口128
6.1.2 按下按鈕129
6.1.3 讓燈光亮起131
6.1.4 燈光,動作132
6.1.5 奇思妙想133
6.1.6 2n種灰色134
6.1.7 正交134
6.1.8 並行通信135
6.1.9 串行通信136
6.1.10 捕捉一個波138
6.1.11 通用串行總線139
6.2 網絡140
6.2.1 現代局域網141
6.2.2 因特網141
6.3 數字世界中的模擬143
6.3.1 數模轉換143
6.3.2 模數轉換145
6.3.3 數字音頻148
6.3.4 數字圖像154
6.3.5 視頻156
6.4 人機界面設備157
6.4.1 終端157
6.4.2 圖形終端158
6.4.3 矢量圖159
6.4.4 光柵圖160
6.4.5 鍵盤和鼠標161
6.5 本章小結161
第7章 組織數據162
7.1 原始數據類型162
7.2 數組164
7.3 位圖165
7.4 字符串166
7.5 複合數據類型167
7.6 單鍊錶168
7.7 動態內存分配173
7.8 更有效的內存分配174
7.9 垃圾收集175
7.10 雙鍊錶175
7.11 層次數據結構176
7.12 塊存儲179
7.13 數據庫181
7.14 索引182
7.15 移動數據183
7.16 矢量I/O186
7.17 面向對象存在的問題187
7.18 排序188
7.19 哈希算法189
7.20 效率與性能191
7.21 本章小結192
第8章 語言處理193
8.1 彙編語言193
8.2 高級語言194
8.3 結構化程序設計195
8.4 詞法分析196
8.4.1 狀態機198
8.4.2 正則表達式199
8.5 從單詞到句子201
8.6 每日語言俱樂部203
8.7 語法樹203
8.8 解釋器205
8.9 編譯器207
8.10 優化209
8.11 小心硬件210
8.12 本章小結211
第9章 Web瀏覽器212
9.1 標記語言213
9.2 統一資源定位符214
9.3 HTML文檔214
9.4 文檔對像模型216
9.4.1 樹結構解析216
9.4.2 文檔對像模型解釋217
9.5 串聯樣式表218
9.6 XML和它的朋友們221
9.7 JavaScript224
9.8 jQuery226
9.9 SVG228
9.10 HTML5228
9.11 JSON228
9.12 本章小結230
第10章 應用程序和系統程序設計231
10.1 猜動物程序版本1:HTML和JavaScript233
10.1.1 應用程序級框架234
10.1.2 Web頁面主體235
10.1.3 JavaScript程序236
10.1.4 CSS238
10.2 猜動物程序版本2:C語言239
10.2.1 終端和命令行239
10.2.2 構建程序240
10.2.3 終端和設備驅動程序240
10.2.4 上下文切換240
10.2.5 標準I/O242
10.2.6 循環緩衝區243
10.2.7 通過合適的抽象實現更好的代碼244
10.2.8 一些技術細節244
10.2.9 緩衝區溢出245
10.2.10 C語言程序246
10.2.11 訓練251
10.3 本章小結252
第11章 捷徑和近似法253
11.1 表格查找253
11.1.1 轉換253
11.1.2 紋理映射254
11.1.3 字符分類256
11.2 整數方法258
11.2.1 直線261
11.2.2 曲線266
11.2.3 多項式268
11.3 遞歸細分269
11.3.1 螺旋線269
11.3.2 構造幾何學272
11.3.3 移位和屏蔽278
11.4 更多地迴避數學運算279
11.4.1 冪級數近似279
11.4.2 CORDIC算法280
11.5 隨機事物284
11.5.1 空間填充曲線284
11.5.2 L系統286
11.5.3 隨機287
11.5.4 量化288
11.6 本章小結297
第12章 死鎖和競態條件298
12.1 競態條件是什麼298
12.2 共享資源299
12.3 進程和線程299
12.4 鎖301
12.4.1 事務和粒度302
12.4.2 等待鎖302
12.4.3 死鎖303
12.4.4 短期鎖的實現303
12.4.5 長期鎖的實現304
12.5 瀏覽器JavaScript304
12.6 異步函數和承諾307
12.7 本章小結311
第13章 安全性312
13.1 安全和隱私概述313
13.1.1 威脅模型313
13.1.2 信任314
13.1.3 物理安全315
13.1.4 通信安全316
13.1.5 現代社會317
13.1.6 元數據和監控318
13.1.7 社會背景319
13.1.8 身份驗證與授權320
13.2 密碼學321
13.2.1 隱寫術321
13.2.2 替代密碼322
13.2.3 換位密碼324
13.2.4 更複雜的密碼325
13.2.5 一次一密325
13.2.6 密鑰交換問題326
13.2.7 公鑰密碼326
13.2.8 前向加密327
13.2.9 加密哈希函數327
13.2.10 數字簽名328
13.2.11 公鑰基礎設施328
13.2.12 區塊鏈328
13.2.13 密碼管理329
13.3 軟件衛生330
13.3.1 保護好正確的東西330
13.3.2 仔細檢查你的邏輯330
13.3.3 檢查錯誤331
13.3.4 最小化攻擊面331
13.3.5 待在界內331
13.3.6 生成合適的隨機數是有難度的332
13.3.7 了解代碼333
13.3.8 極端聰明是你的敵人335
13.3.9 明白什麼是可見的335
13.3.10 不要過度收集335
13.3.11 不要一直存儲335
13.3.12 動態內存分配不是你的朋友336
13.3.13 內存垃圾回收也不是你的朋友337
13.3.14 數據作為代碼338
13.4 本章小結340
第14章 機器智能341
14.1 概述342
14.2 機器學習343
14.2.1 貝葉斯344
14.2.2 高斯345
14.2.3 索貝爾348
14.2.4 Canny351
14.2.5 特徵提取352
14.2.6 神經網絡354
14.2.7 使用機器學習數據358
14.3 人工智能359
14.4 大數據361
14.5 本章小結363
第15章 現實世界的考慮364
15.1 價值主張364
15.2 來龍去脈366
15.2.1 短暫的歷史366
15.2.2 開源軟件368
15.2.3 創意共享370
15.2.4 可移植性的興起370
15.2.5 軟件包管理371
15.2.6 容器371
15.2.7 Java371
15.2.8 Node.js373
15.2.9 雲計算373
15.2.10 虛擬機373
15.2.11 便攜式設備374
15.3 編程環境374
15.3.1 你有工作經驗嗎374
15.3.2 學會估計374
15.3.3 調度項目375
15.3.4 決策376
15.3.5 與不同個性的人一起工作376
15.3.6 了解職場文化377
15.3.7 做出明智的選擇378
15.4 開發方法378
15.5 項目設計379
15.5.1 把想法寫下來379
15.5.2 快速原型發展法380
15.5.3 接口設計380
15.5.4 重用代碼或編寫自己的代碼383
15.6 項目開發383
15.6.1 談話384
15.6.2 成年人與計算機的關係384