本書由兩位知名的計算機科學教育家編寫,全面而細致地介紹了計算機科學的各個方面。書中從信息層開始,歷經硬件層、程序設計層、操作系統層、應用程序層和通信層,深入剖析了計算系統的每個分層,后討論了計算的限制。此外,正文中穿插了大量的人物傳記、歷史點評、道德問題和新的技術發展信息,有助于你進一步了解計算機科學。每章后面都附帶有大量的練習,可以幫助你即時重溫并掌握這一章所述的內容。
前 言Computer Science Illuminated, Fifth Edition
論題選擇為了制定這本CS0教材的論題大綱,我們利用了許多資源,包括課程目錄、教材大綱以及一個電子郵件調查問卷。設計這個調查問卷的目的在于了解我們的同事對這門課應該包括哪些內容的想法。我要求大家(包括自己)列出下列三種清單:
如果CS0這門課是學生在大學階段學習的唯一一門計算機科學的課程,請列出四種你認為他們應該掌握的論題。
請列出四種你想要學生在進入CS1這門課之前掌握的論題。
請補充四種你想要學習CS1的學生熟悉的論題。
這些資源的交集反映出的大多數人的意見,也就構成了本書的大綱。在學習CS1之前掌握了本書內容的學生將為繼續學習計算機科學打下堅實的基礎。盡管我們的意圖是編寫一本CS0教材,但是許多評論家都認為本書的覆蓋面非常廣泛,可以作為一種程序設計語言的計算機科學導論的參考書。
結構說明在第1章中,我們介紹了硬件和軟件的歷史,并且用洋蔥的結構來類比計算機系統的結構。計算機和它的機器語言構成了洋蔥的芯,軟件層和更復雜的硬件一層層地裹住了這個芯。首先介紹的是機器語言,然后是高級語言,包括FORTRAN、Lisp、Pascal、C、C++和Java。在介紹這些語言的同時,還介紹了利用它們進行程序設計的過程,包括自頂向下的設計和面向對象的設計。我們對抽象數據類型所扮演的角色及其實現的理解已經成熟了。操作系統及其資源管理技術(包括更大、更快的二級存儲介質上的文件)包圍著這些程序,并對它們進行管理。
接下來的一層由更復雜的通用或專用軟件系統構成,它們覆蓋了操作系統。這些功能強大的程序由計算機科學中的并行理論支持。最后一層由網絡和網絡軟件構成,網絡軟件包括計算機之間通信必需的所有工具。Internet和萬維網給這一層畫上了最后一筆。
當這些層隨著時間的推移逐漸出現時,用戶對計算機系統的硬件接觸得越來越少。每個層都是它下面的計算機系統的抽象。隨著每個層的發展,新層的用戶和內部層的用戶聯合起來,在經濟領域的高科技部門創造了大量的生產力。本書的目的是提供各個層的概述,介紹基本的硬件和軟件技術,使學生了解和欣賞計算系統的方方面面。
在介紹這種洋蔥式結構時,我們有兩種選擇,一種是從內向外逐層介紹,另一種是從外向內進行介紹。從外向內的方法看起來非常吸引人。我們可以從最抽象的層開始介紹,一次剝掉一個層,直到具體的機器層為止。但是,研究表明,比起抽象的例子,學生們更容易理解具體的例子,即使他們本身是抽象思想家。因此,我們選擇從具體的機器層開始,按照層的創建順序進行分析,當學生完全理解了一個層之后,再轉移到下一個層就比較容易。
第5版中的變化在計劃這次改版時,我們咨詢了CS教育學院的同事,要求他們給予一些反饋。37人回復了我們,非常感謝這些有思考、有見解的回應。
第15章中添加了“云計算”一節,并更新了域名部分。第16章中加入了HTML5。此外,專門用一章(第17章)討論計算機安全。老版的第17章是現在的第18章。目前,大多數的安全問題集中在網絡時代信息的安全使用上,因此把第17章放在通信層的最后一章。
除了新的章節,現在每章結尾部分的道德問題有了更為一致的主題,從道德責任的定義和一個專業計算機人士的道德責任開始,展示了兩個主要的計算協會ACM和IEEE的道德準則,也給出了選擇計算機專業可能面臨的案例研究。這些材料在計算機課程中稱為the Tenth Strand,其中對涉及計算的主要社會問題進行了討論,包括政治、版權、工作場所監視和游戲成癮方面。
當然,我們對整書進行了全面調整,對“你知道嗎”板塊和傳記部分也進行了更新。
摘要第1章是我們探索計算機科學(計算機系統“洋蔥”)的基礎,描述了本書的組織結構。第2章和第3章則分析了包含在物理硬件中的層。這個層稱為信息層,它反映了如何在計算機上表示信息。第2章介紹了二進制數制以及它與其他數制(如人們日常用的十進制系統)的關系。第3章研究了如何獲取多種類型(如數字、文本、圖像、音頻和視頻)的信息以及如何用二進制格式表示它們。
第4章和第5章介紹了硬件層。計算機硬件包括的設備有晶體管、門和電路,它們都按照基本原理控制電流。正是這些核心電路使專用的元件(如計算機的中央處理器——CPU)得以運轉。第4章介紹了門和電路。第5章介紹了計算機的元件,以及在馮·諾伊曼體系結構中這些元件是如何交互的。當然,第5章開頭的廣告已經更新了,在你閱讀本書時,它可能又過時了。
第6~9章介紹了程序設計層。第6章使用模擬計算機Pep/8介紹了機器語言和匯編語言的概念。該章引入了用偽代碼編寫算法的功能,介紹了循環與選擇的概念,并在Pep/8中以偽代碼的方式實現。
第7章分析了問題求解過程,同時涉及人類和計算機的問題求解方法。引導這個論題的是George Polya的人類問題求解策略。該章介紹了自頂向下的方法來設計簡單算法,并在討論算法時選擇經典的搜索和排序算法。因為算法是對數據進行操作,所以在此研究數據的結構,以便更有效地處理數據。該章也介紹了子算法(子程序)語句。
第8章介紹了抽象數據類型或容器,容器是只知道其屬性或行為的復合結構。該章介紹了列表、有序列表、棧、隊列、二叉檢索樹和圖,擴展討論了子算法,包括引用參數與值參、參數傳遞。
第9章介紹了高級程序設計語言的概念。許多杰出的高級語言包含與面向對象編程相關的功能,我們先繞過這個設計過程,討論語言范型以及編譯過程。我們用四種編程語言設計了一些小例子來說明偽代碼的概念,即Python、VB.NET、Java和C++。
第10章和第11章介紹了操作系統層。第10章討論了操作系統的資源管理任務,介紹了一些用于實現這些任務的基本算法。第11章介紹了文件系統,包括什么是文件系統,以及操作系統如何管理它們。
第12~14章介紹了應用程序層。這一層由人們用來解決問題的通用應用程序和專用應用程序構成。我們根據這些程序的基礎,把這一層分到了計算機科學的幾個子學科中。第12章分析了信息系統,第13章分析了人工智能,第14章分析了模擬、圖形學、游戲和其他應用。
第15~17章介紹了通信層。第15章說明了計算機之間通信的理論和應用。第16章介紹了萬維網和它對當今生活的影響,包括修訂的社交媒體部分。全新的第17章討論計算機安全,涵蓋了當今信息時代與保護信息安全相關的各個方面。
第2~17章都是說明計算機可以做什么以及它是如何做的。第18章進行了總結,討論了計算機硬件和軟件的固有局限性,以及計算機能夠解決和不能解決的問題。在討論算法的有效性時,采用了大O符號,以便討論算法的分類。此外還介紹了停機問題,以說明某些不能解決的問題。
本書的第1章和最后一章就像一對書檔,第1章說明了計算系統是什么,第18章告誡我們計算系統不能做什么。它們之間的章節則深入探討了構成計算系統的各個層。
特性本書具有三種特性,用于強調計算的歷史、廣度以及新技術帶來的道德義務。首先,每一章都有一個簡短的名人傳記,介紹對計算做出杰出貢獻的人。這些人包括對數據層做出貢獻的George Boole和Ada Lovelace,以及對通信層做出貢獻的Doug Engelbart和Tim Berners-Lee。這些傳記的目的是讓學生了解計算界的歷史以及那些對計算界做過貢獻和正在做貢獻的人。
我們稱第二個特性為“你知道嗎”,因為沒有更好的詞可以表達它。這部分顯示在方框中,是過去、現在和未來的一些軼聞趣事,它們來自歷史記錄、當今的報紙和作者的見聞。這些小插曲的目的是使學生開心、鼓舞他們、激發他們的興趣,當然也為了教育他們。
第三個特性是每章中的“道德問題”小節。這些小節的目的是說明在利用計算的好處時要承擔的義務。隱私權、黑客、病毒和言論自由都屬于我們的論題。在每章練習的結尾處有一個思考題部分,涉及這些道德問題和這一章的內容。
致謝對于這一版來說,讀者是最有用的信息和建議來源。衷心感謝受調查者花時間填寫了我們的網絡調查問卷。還要感謝前幾版的審校者,以及這一版的審校者,他們是:
Tim Bower,堪薩斯州立大學;Mikhail Brikman,塞勒姆州立學院;Jacques Carette,麥克馬斯特大學;Howard Francis,派克維爾學院;Jim Jones,格雷斯蘭大學;Murray Levy,西洛杉磯學院;Lew Lowther,約克大學;Jeffrey McConnell,凱尼休斯學院;Richard Schlesinger,肯尼索州立大學;Richard Spinello,波士頓學院;Herman Tavani,里韋學院;Amy Woszczynski,肯尼索州立大學;C. Michael Allen,北卡羅來納大學夏洛特分校;Lofton Bullard,佛羅里達亞特蘭大大學;Cerian Jones,阿爾伯塔大學;Calvin Ribbens,弗吉尼亞理工大學; Susan Sells,威奇托州立大學;R. Mark Meyer,凱尼休斯學院;Tom Wiggen,北達科他大學; Mary Dee Harris,Chris Edmonson-Yurkanan,Ben Kuipers, Glenn Downin,得克薩斯大學奧斯汀分校;Dave Stauffer,賓夕法尼亞大學; John McCormick,北艾奧瓦大學;Dan Joyce,維拉諾瓦大學;Mike Goldwasser,圣路易斯大學;Andrew Harrington,洛約拉大學芝加哥分校;Daniel R. Collins,馬薩諸塞州灣社區學院;J. Stanley Warford,佩珀代因大學;Richard C. Detmer,中田納西州立大學;Chip Weems,馬薩諸塞大學阿默斯特分校;Heather Chandler,西木學院;Mark Holthouse, 西木高等學校;Robert Vermilyer,國托馬斯阿奎那斯學院。
特別感謝凱尼休斯學院的Jeffrey McConnell,他編寫了第14章中的圖形學部分;感謝里韋學院的Herman Tavani,他參與了修改“道德問題”的工作;感謝波士頓學院的Richard Spinello,他撰寫了博客的道德問題一文。
感謝審稿人與同事對第5版的內容給出了意見與建議,他們是:
Bob Blucher,雷恩社區學院;Dale Fletter,福爾瑟姆湖學院;Jerry Westfall博士,利伯蒂大學;Dwayne Towell,艾伯林基督大學;Kara Nance,阿拉斯加大學;Lisa Michaud,梅里馬克學院;Jeffery Bergamini,門多西諾學院;Johanna Horowitz,西耶那學院;Lonnie R. Nelson,漢尼拔拉格朗日學院;Marie Hartlein,蒙哥馬利縣社區學院;Mark Holthouse,西木高等學校;Mikhail S. Brikman博士,塞勒姆州立大學;Patricia Roth Pierce,南理工州立大學;Quentin J. White,SR,帕洛馬學院;Rakesh Arya,馬里蘭大學東海岸分校;Tim Bower,堪薩斯州立大學;William Honig,洛約拉大學芝加哥分校;Barbara Zimmerman,維拉諾瓦大學;Maria Jump博士,國王學院;Joe Pistone,巴洛瑪社區學院;Derek Merck,佐治亞佩雷米特學院。
還要感謝Jones&Bartlett Learning的許多人,尤其是Tim Anderson(資深編輯)、Amy Bloom(主編)、Amy Rose(出版總監)。
我還必須感謝我的網球朋友使我有一個健康的體魄,感謝我的橋牌朋友使我的頭腦十分機敏,感謝我的家人做我的堅強后盾。
出版者的話
譯者序
前言
第一部分 基礎篇
第1章 全景圖 2
1.1 計算系統 2
1.1.1 計算系統的分層 3
1.1.2 抽象 4
1.2 計算的歷史 5
1.2.1 計算硬件簡史 5
1.2.2 計算軟件簡史 12
1.2.3 預言 16
1.3 計算工具與計算學科 16
小結 18
道德問題:the Tenth Strand 18
練習 19
思考題 20
第二部分 信息層
第2章 二進制數值與記數系統 22
2.1 數字與計算 22
2.2 位置記數法 23
2.2.1 二進制、八進制和十六進制 26
2.2.2 其他記數系統中的運算 27
2.2.3 以2的冪為基數的記數系統 27
2.2.4 把十進制數轉換成其他數制的數 29
2.2.5 二進制數值與計算機 29
小結 31
道德問題:the Tenth Strand的知識單元 31
練習 33
思考題 34
第3章 數據表示法 35
3.1 數據與計算機 35
3.1.1 模擬數據與數字數據 36
3.1.2 二進制表示法 38
3.2 數字數據表示法 39
3.2.1 負數表示法 39
3.2.2 實數表示法 42
3.3 文本表示法 44
3.3.1 ASCII字符集 45
3.3.2 Unicode字符集 45
3.3.3 文本壓縮 46
3.4 音頻數據表示法 49
3.4.1 音頻格式 50
3.4.2 MP3音頻格式 50
3.5 圖像與圖形表示法 51
3.5.1 顏色表示法 51
3.5.2 數字化圖像與圖形 52
3.5.3 圖形的矢量表示法 53
3.6 視頻表示法 53
小結 55
道德問題:道德準則 55
練習 56
思考題 58
第三部分 硬件層
第4章 門和電路 60
4.1 計算機和電學 60
4.2 門 62
4.2.1 非門 62
4.2.2 與門 63
4.2.3 或門 63
4.2.4 異或門 64
4.2.5 與非門和或非門 64
4.2.6 門處理回顧 65
4.2.7 具有更多輸入的門 65
4.3 門的構造 66
4.4 電路 67
4.4.1 組合電路 68
4.4.2 加法器 70
4.4.3 多路復用器 71
4.5 存儲器電路 72
4.6 集成電路 73
4.7 CPU芯片 73
小結 74
道德問題:這些違反道德規范嗎? 74
練習 75
思考題 77
第5章 計算部件 78
5.1 獨立的計算機部件 78
5.2 存儲程序的概念 82
5.2.1 馮·諾伊曼體系結構 82
5.2.2 讀取-執行周期 87
5.2.3 RAM和ROM 88
5.2.4 二級存儲設備 89
5.2.5 觸摸屏 92
5.3 嵌入式系統 93
5.4 并行體系結構 94
5.4.1 并行計算 94
5.4.2 并行硬件分類 95
小結 96
道德問題:數字鴻溝 96
練習 97
思考題 98
第四部分 程序設計層
第6章 低級程序設計語言與偽代碼 102
6.1 計算機操作 102
6.2 機器語言 103
6.3 一個程序實例 108
6.3.1 手工模擬 109
6.3.2 Pep/8模擬程序 109
6.4 匯編語言 111
6.4.1 Pep/8匯編語言 112
6.4.2 匯編器指令 112
6.4.3 Hello程序的匯編語言版本 113
6.4.4 一個新程序 113
6.4.5 具有分支的程序 115
6.4.6 具有循環的程序 116
6.5 表達算法 118
6.5.1 偽代碼的功能 118
6.5.2 執行偽代碼算法 121
6.5.3 寫偽代碼算法 123
6.5.4 翻譯偽代碼算法 124
6.6 測試 125
小結 126
道德問題:版權與軟件盜版 127
練習 127
思考題 129
第7章 問題求解與算法設計 130
7.1 如何解決問題 130
7.1.1 提出問題 130
7.1.2 尋找熟悉的情況 132
7.1.3 分治法 132
7.1.4 算法 133
7.1.5 計算機問題求解過程 133
7.1.6 方法總結 134
7.1.7 測試算法 135
7.2 有簡單參數的算法 135
7.2.1 帶有選擇的算法 135
7.2.2 帶有循環的算法 136
7.3 復雜變量 139
7.3.1 數組 139
7.3.2 記錄 140
7.4 搜索算法 141
7.4.1 順序搜索 141
7.4.2 有序數組中的順序搜索 141
7.4.3 二分檢索 142
7.5 排序 144
7.5.1 選擇排序 144
7.5.2 冒泡排序 145
7.5.3 插入排序 147
7.6 遞歸算法 147
7.6.1 子程序語句 148
7.6.2 遞歸階乘 149
7.6.3 遞歸二分檢索 149
7.6.4 快速排序 150
7.7 幾個重要思想 153
7.7.1 信息隱蔽 153
7.7.2 抽象 154
7.7.3 事物命名 155
7.7.4 測試 155
小結 155
道德問題:開源軟件 156
練習 157
思考題 159
第8章 抽象數據類型與子程序 160
8.1 抽象數據類型 160
8.2 棧 161
8.3 隊列 161
8.4 列表 162
8.5 樹 164
8.5.1 二叉樹 164
8.5.2 二叉檢索樹 165
8.5.3 其他操作 169
8.6 圖 169
8.6.1 創建圖 171
8.6.2 圖算法 171
8.7 子程序 176
8.7.1 參數傳遞 177
8.7.2 值參與引用參數 178
小結 180
道德問題:工作場所監視 180
練習 181
思考題 183
第9章 面向對象設計與高級程序設計語言 184
9.1 面向對象方法 184
9.1.1 面向對象 185
9.1.2 設計方法 185
9.1.3 一個計算機示例 187
9.2 翻譯過程 189
9.2.1 編譯器 190
9.2.2 解釋器 190
9.3 程序設計語言的范型 192
9.3.1 命令式范型 192
9.3.2 聲明式范型 193
9.4 高級程序設計語言的功能性 194
9.4.1 布爾表達式 194
9.4.2 數據歸類 196
9.4.3 輸入/輸出結構 199
9.4.4 控制結構 200
9.5 面向對象語言的功能性 204
9.5.1 封裝 204
9.5.2 類 205
9.5.3 繼承 206
9.5.4 多態 207
9.6 過程設計與面向對象設計的區別 207
小結 208
道德問題:惡作劇與詐騙 209
練習 210
思考題 212
第五部分 操作系統層
第10章 操作系統 214
10.1 操作系統的角色 214
10.1.1 內存、進程與CPU管理 216
10.1.2 批處理 216
10.1.3 分時 217
10.1.4 其他OS要素 218
10.2 內存管理 218
10.2.1 單塊內存管理 219
10.2.2 分區內存管理 220
10.2.3 頁式內存管理 221
10.3 進程管理 223
10.3.1 進程狀態 223
10.3.2 進程控制塊 224
10.4 CPU調度 224
10.4.1 先到先服務 225
10.4.2 最短作業優先 226
10.4.3 輪詢法 226
小結 227
道德問題:醫療隱私——健康保險攜帶與責任法案 228
練習 229
思考題 231
第11章 文件系統和目錄 232
11.1 文件系統 232
11.1.1 文本文件和二進制文件 233
11.1.2 文件類型 233
11.1.3 文件操作 234
11.1.4 文件訪問 235
11.1.5 文件保護 236
11.2 目錄 237
11.2.1 目錄樹 237
11.2.2 路徑名 239
11.3 磁盤調度 241
11.3.1 先到先服務磁盤調度法 242
11.3.2 最短尋道時間優先磁盤調度法 242
11.3.3 SCAN磁盤調度法 242
小結 243
道德問題:選擇加入和選擇退出 243
練習 244
思考題 246
第六部分 應用程序層
第12章 信息系統 248
12.1 信息管理 248
12.2 電子制表軟件 249
12.2.1 電子數據表公式 250
12.2.2 循環引用 254
12.2.3 電子數據表分析 254
12.3 數據庫管理系統 255
12.3.1 關系模型 256
12.3.2 關系 257
12.3.3 結構化查詢語言 258
12.3.4 數據庫設計 260
12.4 電子商務 261
小結 262
道德問題:從競選來看政治與網絡 262
練習 263
思考題 265
第13章 人工智能 266
13.1 思維機 266
13.1.1 圖靈測試 267
13.1.2 AI問題的各個方面 268
13.2 知識表示 268
13.2.1 語義網 268
13.2.2 檢索樹 271
13.3 專家系統 273
13.4 神經網絡 275
13.4.1 生物神經網絡 275
13.4.2 人工神經網絡 276
13.5 自然語言處理 277
13.5.1 語音合成 277
13.5.2 語音識別 278
13.5.3 自然語言理解 279
13.6 機器人學 280
13.6.1 感知-規劃-執行范型 280
13.6.2 包孕體系結構 282
13.6.3 物理部件 283
小結 283
道德問題:從民眾來看政治與網絡 284
練習 284
思考題 286
第14章 模擬、圖形學、游戲和其他應用 287
14.1 什么是模擬 287
14.1.1 復雜系統 287
14.1.2 模型 288
14.1.3 構造模型 288
14.2 特殊模型 289
14.2.1 排隊系統 289
14.2.2 氣象模型 292
14.2.3 計算生物學 295
14.2.4 其他模型 295
14.2.5 必要的計算能力 296
14.3 計算機圖形學 296
14.3.1 光的工作原理 297
14.3.2 物體形狀 298
14.3.3 光模擬 298
14.3.4 復雜對象的建模 299
14.3.5 讓物體動起來 303
14.4 游戲 304
14.4.1 游戲的歷史 304
14.4.2 創建虛擬世界 305
14.4.3 游戲設計與開發 305
14.4.4 游戲編程 306
小結 307
道德問題:游戲成癮 307
練習 308
思考題 309
第七部分 通信層
第15章 網絡 312
15.1 連網 312
15.1.1 網絡的類型 313
15.1.2 Internet連接 315
15.1.3 包交換 317
15.2 開放式系統與協議 318
15.2.1 開放式系統 318
15.2.2 網絡協議 319
15.2.3 TCP/IP 319
15.2.4 高層協議 320
15.2.5 MIME類型 321
15.2.6 防火墻 321
15.3 網絡地址 322
15.4 云計算 324
小結 325
道德問題:社交網絡的影響 326
練習 327
思考題 328
第16章 萬維網 329
16.1 Web簡介 329
16.1.1 搜索引擎 331
16.1.2 即時消息 331
16.1.3 博客 331
16.1.4 cookie 332
16.2 HTML 333
16.2.1 基本的HTML格式 335
16.2.2 圖像與鏈接 335
16.2.3 HTML5 337
16.3 交互式網頁 337
16.3.1 Java小程序 337
16.3.2 Java服務器頁 338
16.4 XML 339
16.5 社交網絡 341
小結 342
道德問題:賭博與互聯網 344
練習 344
思考題 346
第17章 計算機安全 347
17.1 各級安全 347
17.2 阻止未授權訪問 349
17.2.1 密碼 349
17.2.2 驗證碼 351
17.2.3 指紋分析 352
17.3 惡意代碼 352
17.3.1 殺毒軟件 353
17.3.2 安全攻擊 353
17.4 密碼學 355
17.5 保護你的在線信息 357
17.5.1 安全與可移動設備 359
17.5.2 維基解密 359
小結 360
道德問題:博客 361
練習 362
思考題 363
第八部分 總結
第18章 計算的限制 366
18.1 硬件 366
18.1.1 算術運算的限制 366
18.1.2 部件的限制 370
18.1.3 通信的限制 371
18.2 軟件 372
18.2.1 軟件的復雜度 372
18.2.2 當前提高軟件質量的方法 373
18.2.3 臭名昭著的軟件錯誤 376
18.3 問題 377
18.3.1 算法比較 377
18.3.2 圖靈機 382
18.3.3 停機問題 384
18.3.4 算法分類 386
小結 387
道德問題:Therac-25災難剖析 387
練習 388
思考題 389
參考文獻 390
索引 396