Charles Petzold:code——the Hidden Language Of Computer Hardware And Software@2009
《編碼:電腦硬體與軟體的隱藏語言》主要論點闡述
查爾斯·佩茨爾德(Charles Petzold)的著作《編碼:電腦硬體與軟體的隱藏語言》(Code: The Hidden Language of Computer Hardware and Software)的核心論點在於,徹底理解電腦運作的基礎,並非難以企及的深奧知識,而是可以透過追溯其歷史演變,從最簡單的元件和概念開始,逐步建構起來的。作者透過從十九世紀的技術(如摩斯電碼、電報、電磁繼電器)出發,層層疊加,解釋了構成現代電腦的複雜系統,是如何從最基本的二進位(binary)原理和邏輯操作中誕生的。全書旨在揭示電腦硬體和軟體之間隱藏的語言,證明無論其表面多麼複雜,其底層都是基於簡單、通用且一致的規則。
書中首先確立了「編碼」作為資訊傳遞系統的基本概念,並透過摩斯電碼和盲人點字(Braille)這兩種非電腦領域的例子,展示了如何利用有限的、通常是二元的符號(點與劃,或凸點與平點),透過不同的組合來表示字母、數字乃至更複雜的資訊。這引入了二進位概念,即資訊可以用只有兩種狀態的元素來表示。
接著,作者將這種二元概念與電學的基本原理聯繫起來。簡單的電路,如手電筒的開關,天然地就是二元的:開關只有開和關兩種狀態,對應著電流的通過或不通過。這種電氣上的二元性,為處理二進位資訊提供了物質基礎。電報機的電磁繼電器(relay)被引入作為一個關鍵的過渡技術,它不僅能通過電信號控制開關狀態,還能作為信號放大器,克服長距離電線的電阻損耗,實現遠距離通信。更重要的是,繼電器本身就是一个可以用電信號控制的開關,這為构建更複雜的電氣邏輯電路奠定了基礎。
在二元狀態和電氣開關的基礎上,書中進一步引入了喬治·布爾(George Boole)的布林代數(Boolean algebra)概念。布林代數處理的是真/假或開/關這樣的邏輯值,並定義了基本的邏輯運算符,如 AND(且)、OR(或)和 NOT(非)。令人驚嘆的是,作者證明了簡單的電氣開關串聯即可實現 AND 邏輯(只有兩個開關都閉合時,電路才導通),並聯即可實現 OR 邏輯(只要其中一個開關閉合,電路就導通)。透過繼電器,這些邏輯門(logic gate)可以由其他電信號控制,從而實現自動化的邏輯運算。
邏輯門是電腦執行運算的核心。書中詳細解釋了如何利用邏輯門來建構二進位加法器(adder)。從最基本的半加法器(Half Adder,處理兩個二進位數位元並產生一個和位元和一個進位位元),到全加法器(Full Adder,處理兩個二進位數位元和一個來自低位元的進位位元),再到能夠處理多個位元(如八個位元)的漣波進位加法器(ripple carry adder),展示了複雜的算術運算如何分解為一系列簡單的邏輯操作。減法也被解釋為利用二補數(two’s complement)技巧,将其轉化為加法來實現,這說明了即使是看似不同的運算,在電腦底層也可以用統一的方式處理。
除了運算單元,電腦還需要記憶體(memory)來儲存指令和資料。書中介紹了觸發器(flip-flop)或閂鎖(latch)這種能夠記住一個二元狀態(1 或 0)的電路。觸發器由逻辑門組成,它們具有反饋回路,使其能够在電源供應下保持其狀態。這些基本的記憶體單元可以组合起來形成更大的記憶體陣列(RAM array),如隨機存取記憶體(RAM)。RAM 的關鍵特性是可以通過位址訊號(address signal)隨機存取(讀取或寫入)其中任何一個儲存單元。記憶體的大小通常是二的冪次方,並引入了位元組(byte,通常為 8 位元)、千位元組(kilobyte,1024 位元組)、百萬位元組(megabyte)等單位,這反映了二進位在電腦中的普及。記憶體與處理器之間通過匯流排(bus)連接,匯流排傳遞位址、資料和控制信號。書中還區分了揮發性記憶體(如 RAM)和非揮發性儲存(如磁盘),前者断电后資料丢失,後者则持久保存。
電腦之所以強大,在於其可編程性。書中描述了一個簡化的處理器(processor),它包含算術邏輯單元(ALU)、暫存器(register,處理器內部的快速儲存單元)、程式計數器(program counter,指向下一條要執行的指令的記憶體位址)和堆疊指標(stack pointer,用於管理堆疊,方便子程序呼叫)。處理器按照程式計數器的指示,從記憶體中讀取一條條機器碼(machine code)指令並執行。機器碼是最低階的語言,由位元組组成,直接對應於處理器能理解的操作(operation,稱為 opcode)。作者展示了如何將簡單的 LOAD(載入)、ADD(相加)、STORE(儲存)等操作定義為指令。更關鍵的是,引入了跳躍(Jump)指令,特别是條件跳躍(conditional jump)指令(例如「如果結果為零則跳躍」)。條件跳躍使得程式能够根據運算結果改變執行流程,這是一個通用計算機(universal computer)的關鍵特性,使其能夠執行循環和更複雜的控制結構,從而實現乘法、除法等非直接由硬體實現的運算,甚至能模擬其他任何計算機(圖靈機的概念)。
機器碼雖然能直接控制處理器,但编写和閱讀都極為困難。書中介紹了组合語言(assembly language)作為機器碼的符號表示。组合語言使用助記符(mnemonic)來表示機器碼操作碼,並使用標籤(label)來代表記憶體位址,這大大提高了程式碼的可讀性和可寫性。編譯器(assembler)程式能將组合語言源代碼(source code)翻譯成機器碼可執行檔案(executable file)。從组合語言到高階語言(high-level language)是程式設計的另一個抽象層次。高階語言(如 ALGOL, FORTRAN, COBOL, C 等)使用更接近人類自然語言和數學符號的語句,讓程式設計師無需關心處理器的具體细节。編譯器(compiler)則負責將高階語言程式翻譯成目標處理器能理解的機器碼。這雖然可能導致程式效率略低於手寫的组合語言,但極大地提高了開發效率和程式碼的可移植性。
除了數字和指令,書中還探討了其他類型資訊的编码。例如,文本字符使用 ASCII 或 EBCDIC(後者是 IBM 的標準)這樣的字元編碼系統表示,後來發展到支援更多語言的 Unicode。圖片被表示為點陣圖(bitmap),由像素(pixel)組成,每個像素的位元數決定顏色深度。聲音被數位化為波形檔案,通过脉冲编码调制(PCM)記錄振幅样本。這些不同類型資訊的數位化,使得電腦能夠處理文字、圖像、聲音等多媒體內容,並需要相應的硬體(如顯示卡、音效卡)和軟體支援。
最終,所有這些硬體組件和不同層次的程式碼,都由作業系統(operating system,如 CP/M, MS-DOS, UNIX, Windows)來管理。作業系統負責協調硬體資源、管理文件系統(files system)以組織儲存上的資料,並提供應用程式介面(API),讓應用程式(application program)能夠以一種與具體硬體無關的方式與電腦硬體互動。
總之,本書的核心論點是,電腦從根本上來說是基於二元原理和邏輯運算的機器。其複雜性在於簡單元件和操作的巨大數量和層次疊加。通過理解從二元編碼、電氣開關、邏輯門、算術運算、記憶體、處理器、指令集、組合語言到高階語言和作業系統的演變和構成原理,任何看似神秘的電腦功能都可以被理解和解釋。這是一趟從點劃到像素、從開關到軟體的旅程,揭示了現代數位世界之下隱藏的簡潔而優雅的語言。
comments
comments for this post are closed