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,而非示意。 作者解释说,他之所以重写后半部分,是因为第一版从简单的存储代码一下跳到20世纪70年代微处理器的指令集,要求读者凭信任接受太多东西。新的第21–24章逐个门电路地搭出处理器,面向大众读者的书很少这样做。
- 具体而新近的例子。 第11章逐位解读UPC条形码和QR码;第二版把Unicode的内容扩充到数页,并用可以在浏览器中运行的JavaScript取代了ALGOL。
- 可交互的图示。 配套网站把关键电路做成了动画,读者可以亲眼看到电流流过加法器、触发器和时钟,而不只是靠想象。
局限
- 中段颇为吃力。 序言提醒觉得快要“溺水”的读者“浮上来换口气”,作者还写道,畏惧第21–24章的读者不妨跳过。这几章篇幅长(每章20–24页),细节多。
- 没有习题。 样章中没有习题,学生需要自己设计练习,例如在模拟器中搭建电路。
- 简化的、历史性的硬件。 书中的CPU实现的是20世纪70年代英特尔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 的项目中实际搭建门电路和加法器。出版社的勘误页面列出了更正内容和替换图。
