01 / 導讀
導讀
引用
Petzold, C. (2022). Code: The Hidden Language of Computer Hardware and Software (2nd ed.). Microsoft Press (Pearson).
章節概要
第二版共28章,正文約460頁(不含索引),前有一篇寫於2022年5月的序言。全書不是若干獨立主題的彙編,而是一條連續的論證:從編碼到開關,從開關到繼電器和邏輯閘,從邏輯閘到加法電路和記憶體,最後把這些元件組裝成一台能夠運作的中央處理器(CPU)。作者本人對這次改版的說明指出,前十七章與第一版大致相同(另新增一章談時鐘),其後講CPU的各章則是全新撰寫的。書中帶有圖示標記的電路圖,也可以在免費的配套網站 CodeHiddenLanguage.com 上以動畫、可互動的形式查看。
第1–3章:Best Friends(摯友);Codes and Combinations(編碼與組合);Braille and Binary Codes(點字與二進位碼)
全書從「編碼」這個概念談起。根據索引,前兩章討論摩斯電碼,第3章轉向點字——一種由凸點有無構成的編碼。這幾章共同說明:資訊可以由一連串二選一的組合來承載。
第4–8章:Anatomy of a Flashlight(手電筒剖析);Communicating Around Corners(隔著轉角通訊);Logic with Switches(用開關實現邏輯);Telegraphs and Relays(電報與繼電器);Relays and Gates(繼電器與邏輯閘)
硬體這條線從電池、燈泡和開關開始。第6章是 Pearson 公開的兩個試閱章之一:它從亞里斯多德的三段論和喬治·布爾的「類的代數」出發,藉寵物店的例子把顧客的要求寫成布林運算式,接著說明串聯的開關相當於AND,並聯的開關相當於OR。第7章介紹電報繼電器;第8章長達26頁,是全書較長的章節之一,它用繼電器組出包括NAND和NOR在內的邏輯閘。
第9–11章:Our Ten Digits(我們的十個數字);Alternative 10s(另類的「10」);Bit by Bit by Bit(一位元又一位元)
這幾章講數字系統:從十進位到其他進位,最後落到二進位和位元。作者指出,第10章結尾提出兩個對八進位數進行編碼和解碼的電路,好讓讀者不忘第8章的邏輯閘。另一個試閱章第11章在日常生活中尋找位元:保羅·列維爾夜奔故事中的燈籠信號、影評的判定、「毅力號」火星探測車的降落傘、帶有同位檢查的通用產品條碼(UPC),以及一步步解讀的QR碼。
第12–13章:Bytes and Hexadecimal(位元組與十六進位);From ASCII to Unicode(從ASCII到Unicode)
位元組和十六進位表示法比第一版更早登場。第13章談字元編碼,從早期電報碼到ASCII,再到Unicode,並以數頁篇幅介紹UTF-8轉換格式,以及誤用字元集時會發生的問題。
第14–16章:Adding with Logic Gates(用邏輯閘做加法);Is This for Real?(這是真的嗎?);But What About Subtraction?(那減法呢?)
把邏輯閘組合成能對二進位數做加法的電路。第15章提供歷史背景,並論證用電晶體做加法與用繼電器做加法在原理上相同;配套網站示範了前瞻進位邏輯。第16章處理減法。
第17–19章:Feedback and Flip-Flops(回授與正反器);Let's Build a Clock!(來做一台時鐘!);An Assemblage of Memory(組裝記憶體)
回授造就了能夠「記憶」的電路——正反器。新增的第18章用它製作一台帶有多種數字顯示方式的BCD(二進位編碼十進位)時鐘。第19章把正反器組裝成可定址的記憶體。
第20–24章:Automating Arithmetic(讓算術自動化);The Arithmetic Logic Unit(算術邏輯單元);Registers and Busses(暫存器與匯流排);CPU Control Signals(CPU控制訊號);Loops, Jumps, and Calls(迴圈、跳躍與呼叫)
這是第二版的核心。第20章讓存放在記憶體中的程式碼來控制一台加法機。全新的第21–24章打造一顆實作了英特爾8080一半以上指令集的CPU:算術邏輯單元、由匯流排連接的暫存器組、為每道指令安排時序的控制訊號,以及使機器具備圖靈完備性的條件跳躍。第24章也討論呼叫、返回和位移運算,但沒有實作。
第25–28章:Peripherals(周邊裝置);The Operating System(作業系統);Coding(程式設計);The World Brain(世界大腦)
最後幾章補齊了電腦及其軟體。第25章討論視訊顯示器、觸控螢幕,以及類比數位轉換器和數位類比轉換器。第26章談作業系統和圖形介面。第27章討論程式語言,選用讀者可以直接在瀏覽器裡嘗試的JavaScript,並談到浮點數等數值如何儲存。第28章追溯H. G. 威爾斯、范內瓦·布希和泰德·尼爾森關於全球資訊網路的構想,再說明位元如何透過調變傳輸、瀏覽器如何用HTTP取得網頁。
核心概念
第1–11章:編碼、開關與數字
- 二進位編碼:用兩種可區分狀態的組合來表示資訊,如摩斯電碼和點字。
- 布林代數:把布爾的「類的代數」重新詮釋為使用AND、OR、NOT以及0和1兩個值的邏輯。
- 串聯與並聯電路:開關依序相接實現AND,並排相接實現OR。
- 繼電器與邏輯閘:由電驅動的開關,以及由這種開關組成的邏輯閘(包括NAND和NOR)。
- 位元:資訊的最小單位,即在兩種可能之間的選擇。
第12–19章:資料、算術與記憶
- 位元組與十六進位:八個位元一組的單位,以及書寫它們所用的十六進位表示法。
- ASCII、Unicode與UTF-8:從7位元碼表到採用可變長度編碼的通用字元集的字元編碼。
- 加法器:用邏輯閘實現二進位加法的電路,減法也由此推導出來。
- 正反器:利用回授儲存一個位元的電路;大量正反器加上定址機制就構成記憶體。
第20–28章:處理器及其之上
- 算術邏輯單元(ALU):CPU中執行算術與邏輯運算的部分。
- 暫存器與匯流排:CPU內部容量小而速度快的儲存單元,以及在它們之間傳送資料的共用通道。
- 控制訊號:對指令解碼並協調CPU各部分完成該指令的訊號。
- 條件跳躍:讓機器能夠迴圈與判斷、從而具備圖靈完備性的指令。
評析
優點
- 一步一個台階,不留缺口。 序言提出的目標是從極簡單的概念出發,逐步爬升到對數位電腦運作原理的深入理解,並且使用工程師的語言和符號,而非堆疊比喻。試閱章印證了這一點:第6章不預設任何背景知識,從三段論談到布林運算式,再談到真實的開關電路。
- 真正的CPU,而非示意圖。 作者解釋,他之所以重寫後半部,是因為第一版從簡單的儲存碼一下子跳到1970年代微處理器的指令集,要讀者憑信任接受太多東西。新的第21–24章逐個邏輯閘地組出處理器,以一般讀者為對象的書很少這麼做。
- 具體而新近的例子。 第11章逐位元解讀UPC條碼和QR碼;第二版把Unicode的內容擴充到數頁,並以可在瀏覽器中執行的JavaScript取代ALGOL。
- 可互動的圖示。 配套網站把關鍵電路做成動畫,讀者可以親眼看到電流流過加法器、正反器和時鐘,而不只是靠想像。
局限
- 中段頗為吃力。 序言提醒覺得快要「溺水」的讀者「浮上來換口氣」,作者也寫道,畏懼第21–24章的讀者不妨跳過。這幾章篇幅長(每章20–24頁),細節多。
- 沒有習題。 試閱章中沒有習題,學生必須自己安排練習,例如在模擬器中組裝電路。
- 簡化的、歷史性的硬體。 書中的CPU實作的是1970年代英特爾8080的一個子集;管線化、快取記憶體、多核心處理器等現代主題不在本書範圍內。
- 網路部分較為簡略。 作者自己也承認談網際網路的最後一章很短,並希望有人另寫一本類似的網際網路專書。
在課程中的定位
在計算機結構課程中,本書是最平緩的入口:一部寫給沒有電子學或程式設計背景的讀者的敘事作品。尼桑和肖肯的 The Elements of Computing Systems 涵蓋從邏輯閘到一台可運作電腦的相近內容,但以一系列專題實作展開,學生要用提供的模擬器親手打造每一層;先讀佩措爾德的第6–24章,會讓這些實作更容易上手,也可以兩書對照閱讀。哈里斯夫婦的 Digital Design and Computer Architecture, RISC-V Edition 以教科書方式走同一條路,引入硬體描述語言,並一路講到管線化的RISC-V處理器。
布萊恩特和歐哈拉倫的 Computer Systems: A Programmer's Perspective 從程式設計師的角度看機器(資料表示、機器碼、記憶體與行程),讀完本書第12–13章和第26–27章後接著讀它很自然。亨尼西和派特森的 Computer Architecture: A Quantitative Approach,以及沈和利帕斯蒂的 Modern Processor Design,討論現代處理器的效能技術,需要先修計算機組織課程,內容遠超本書。
如何使用本書
本書適合想在硬體課程之前建立直觀圖像的資訊科系新生、其他學科的學生,以及從未看過自己所用程式語言底下是什麼的程式設計師。除算術外不需要任何先備知識。
- 依序閱讀。 每章都依賴前面的章節,談邏輯閘的各章和談數字系統的各章在第14章的加法器處匯合。
- 核心路線: 第1–20章完整走完從編碼到儲存程式式算術的全程。
- CPU各章: 第21–24章對計算機結構課程最有價值,也最難。閱讀時放慢速度,開著配套網站,用手逐一追蹤每個控制訊號。
- 收尾: 第25–28章較輕鬆,可以較快讀完;第27章很適合作為通往第一門程式設計課的橋樑。
由於沒有習題,主動閱讀格外重要:重畫電路,跟著 CodeHiddenLanguage.com 上的動畫走一遍,有條件的話在免費的邏輯模擬器或 The Elements of Computing Systems 的實作中實際組裝邏輯閘和加法器。出版社的勘誤頁面列出了更正內容和替換圖。
