书 · 1999-09 · 查尔斯·佩措尔德(Charles Petzold)

《编码》

计算机与 AI书单第 1 名

一句话结论

计算机没有魔法:它是把“是/否”两态信号,用开关一层一层搭成加法器、内存、处理器,再用软件一层一层包起来的东西,而且普通人只靠一支手电筒的类比就能从头搞懂。

值不值得读完整本?

值得读完,尤其适合想真正弄懂计算机底层、但没有电子或计算机背景的人。它的长处是一条不断档的因果链,中途跳读会断线;读完后你对“计算机到底在干什么”会有踏实的直觉。

  • 先读第 1–6 章:编码、手电筒、电报和继电器。这几章在搭整本书的比喻,不要跳,数学很少,读起来像故事。
  • 第 7–11 章(进制、位、逻辑与门)是全书地基,要细读。后面所有电路都靠它们。
  • 第 12–17 章(加法器、触发器、内存、自动化)是高潮:一台能跑程序的计算机在这里被一步步搭出来。如果只细读一部分,就读这一段,并且拿笔把电路图画一遍。
  • 第 18–19 章讲计算机历史和 8080、6800 两款经典处理器,可以快读;第 20–25 章(ASCII、总线、操作系统、浮点数、语言、图形界面)是向上的一层层抽象,按兴趣取舍。
  • 这本书没有习题,但配合动手(在面包板上搭、用模拟器画门电路)效果会好很多。书中的硬件止于上世纪七八十年代,现代处理器的流水线和缓存不在其中,需要另读别的书。

核心观点

1. 代码是一套约定,信息就是在有限选项里做选择

摩尔斯电码、盲文、二进制,本质都是约定好的符号规则:用少量基本信号的不同组合,表示任意多种信息。

为什么:作者从“两个朋友隔窗用手电筒传话”讲起。一支手电筒只有亮和灭两种状态,一次只能传很少的信息;但把几次亮灭排成序列,组合数就按 2 的 n 次方增长,足以编出整个字母表。编码与解码两边必须共享同一张对照表,所以“代码”首先是一种社会约定,而不是物理属性。一旦承认信息就是在可区分选项中做选择,文字、数字、图片、声音原则上都能用同一种底层语言记录。

2. 二进制是机器的天然语言,十进制只是人类的习惯

十进制来自我们有十根手指,并没有数学上的特殊性;对电路来说,只分两种状态的二进制才是最容易造、最可靠的。

为什么:作者先指出,进制只是计数的约定,换成别的基数,算术规则本质不变。再往下推:电路里最容易稳定区分的只有“有电/没电”或“开/关”两态;要让元件稳定地区分十种电压,就要面对噪声和误差,代价高得多。因此机器用二进制,并不是数学更高明,而是物理实现最便宜、最稳。位(bit)因此成为信息的最小单位,把若干位成组(字节)就能表达数、字符和指令。

3. 逻辑可以用开关和线路直接实现

布尔代数里的“与、或、非”,等价于电路中开关的串联、并联和反转,所以逻辑推理可以交给电路来执行。

为什么:作者的推理链是这样的:先用开关表示“真/假”,两个开关串联,只有都闭合电流才通,这就是“与”;并联,任何一个闭合电流就通,这就是“或”。继电器用小电流控制大电流的开关,于是它既能放大信号,又能当“非”门用。把这些组合封装成门电路后,设计者就可以用逻辑语言设计硬件,而不必每次去想电流怎么走。逻辑与电路的这层对应,是数字计算机能存在的理论基础。

4. 复杂功能来自简单部件的逐层叠加

一台计算机不是一块神秘的整体,而是由门电路组成加法器,加法器、寄存器和内存再组成处理器,每一层只需要理解它的下一层接口。

为什么:作者用一个“由下往上”的叙事来论证:先用逻辑门搭出半加器和全加器,把它们连成能加多位二进制数的加法器;再用补码把减法变成加法,同一套线路就既能加也能减。每一层搭好后就被当作黑盒使用,下一层只关心它的输入输出,不必再想里面的电流。这种分层使人类有限的理解力足以应付十亿级晶体管的整体复杂度。作者的立场是:复杂并不神秘,只是层数多。

5. 记忆和反馈让机器有了状态,程序存进内存后就自动运转

触发器用反馈回路把一个位“锁”住,成千上万个触发器就构成内存;当指令也存进内存,处理器就能反复取指令、执行,自己跑完一段程序。

为什么:纯粹的组合逻辑电路没有历史:输入一变,输出立刻跟着变,不会“记住”任何东西。作者说明,把输出接回输入形成反馈回路,电路就能稳定停在两种状态之一,这就是触发器,即 1 位的记忆。再加上时钟信号让各部件步调一致,以及地址线选择内存中的某一格,就得到可读写的内存。然后他指出:如果让指令也用数字编码,和数据放在同一块内存里,处理器只要重复“取指令、译码、执行”的循环,就能自动完成一连串操作,包括跳转和循环。这就是“自动化”,也是通用计算机区别于计算器的地方。

6. 软件是一层层的抽象,每一层把下层的复杂藏起来

机器码、汇编语言、高级语言、操作系统、图形界面,每一层都是对下层的包装,这样人才能在不理解全部细节的情况下使用和编写程序。

为什么:处理器只认识一串二进制的指令,直接用它们写程序又慢又容易出错。作者的推理是:先用助记符代替数字,就有了汇编语言;再用编译器把更接近人类思维的语句翻译成机器码,就有了高级语言。操作系统进一步把磁盘、屏幕、键盘这类硬件细节统一成文件和接口,程序不必每次重写。图形界面再把这些包装成直观的窗口和图标。每多一层,用户离硬件更远,也更能专注自己的问题,代价是不再看得见底下发生了什么。

反对意见

现代计算机的难点和价值在体系结构的量化权衡,不在“能搭出来”(Hennessy 与 Patterson)

在《计算机体系结构:量化研究方法》(1990)中,两位作者主张体系结构设计要靠对真实程序负载的测量来取舍,流水线、缓存、并行性才是现代处理器性能的来源。从这个角度看,《编码》那种“取指、执行”的简化模型虽然有利于入门,但没有触及性能为什么成立,读完也不足以理解现代芯片。这是对两本书定位差异的解读,并非两位作者直接批评《编码》。

理解计算不必从硬件开始,抽象与程序才是核心(Abelson 与 Sussman)

《计算机程序的构造和解释》(1985)主张计算机科学的核心是对“过程”的抽象与描述,从程序和抽象出发就能讲清计算,不必先学晶体管和逻辑门。按这种立场,《编码》自下而上的路线虽然直观,但对写软件的人来说,理解抽象和递归比理解加法器更重要。这是教学路线上的不同取向。

只读不够,要自己动手搭一遍才算懂(Nisan 与 Schocken)

《计算系统要素》(2005)让读者用十二个项目从最基础的与非门开始,一路搭出能运行俄罗斯方块的完整计算机系统。它隐含的教学观是:读懂和亲手建造是两回事,只读《编码》这类叙述性的书,容易产生“我懂了”的错觉。这是教学方式的补充性批评,并非对《编码》论点本身的反驳。

内容偏旧,且不涉及网络和分布式(读者与教师的常见评语)

有教师和读者指出,书中硬件止于上世纪七八十年代的处理器,显得有些过时,而且作者有意没有讲联网和分布式系统,所以读完仍然不足以理解今天以网络为中心的计算。作者在 2022 年出版了扩充的第二版,加深了对处理器内部的讲解。

相关推荐

导读由 AI 根据公开资料整理,没有读取原书全文,一切以原著为准。导读 Primer 首页