---
schema_version: "library-reader-v1"
source_type: "original_book"
title: "编码 隐匿在计算机软硬件背后的语言"
author: null
edition: null
publisher: null
year: null
isbn: "9787121181184"
library_document_id: "38270854-596f-4a26-8183-db8c968c6020"
source_sha256: "249786274d83909f0bddc34d77f81ed8f0b14d1eac8843c772a37a3ecbfe2cfc"
pdf_physical_page_count: 438
pdf_physical_page_index_base: 0
range_start: 10
range_count: 10
html_url: "https://workshop.closeclaw.top/api/ai/read/38270854-596f-4a26-8183-db8c968c6020?start=10&limit=10"
markdown_url: "https://workshop.closeclaw.top/api/ai/read/38270854-596f-4a26-8183-db8c968c6020.md?start=10&limit=10"
previous_url: "https://workshop.closeclaw.top/api/ai/read/38270854-596f-4a26-8183-db8c968c6020.md?start=0&limit=10"
next_url: "https://workshop.closeclaw.top/api/ai/read/38270854-596f-4a26-8183-db8c968c6020.md?start=20&limit=10"
---

# 编码 隐匿在计算机软硬件背后的语言

> 页码规则：PDF_PHYSICAL_PAGE_INDEX 是从 0 开始的权威文件物理页索引；PRINTED_PAGE 是页面中识别出的印刷页码，可能为空，二者不得混用。

## PDF_PHYSICAL_PAGE_INDEX=10 | PRINTED_PAGE=X

尽管今天的计算机比起25年前，以及50年前的都复杂许多，但它们在本质上是完全一致的。学习技术发展史的重要意义正在于此：追溯的历史越久远，技术的脉络就变得越清晰。因此，我们需要做的就是确定某些关键的历史阶段，在这些阶段，技术最天然、最本质的一面将清晰可见。

在这本书中，我回溯了自己所能找得到资料的计算机发展史。令我自己也感到惊讶的是，有时竟然一直追溯到19世纪，甚至使用了早期的电报设备来演示计算机是如何构建的。至少从理论角度来看，本书的前17章中提到过的所有设备，都可以利用已经存在了一个世纪的简单电子器件来构造。

这些古董级技术的使用令本书蒙上了一层怀旧的面纱。我要强调的是Code是这样一本书，它永远不会被命名为诸如 The Faster New Faster Thing 或 Business @ the Speed of aDigital Nervous System。在这本书中，“bit”定义在第 70页，“byte”的定义则出现于第186页。晶体管直到第146页才被介绍，而且只是顺便提及而已。

在对计算机工作原理介绍方面，本书将会一直深入到本质（例如，只有少数书会去介绍计算机处理器的实际工作机制)，但整本书的节奏是相对缓和的。在保证内容深度的基础上，我尽量使读者在学习的旅程中保持轻松愉悦的心情。

我最后还是要说，书里面没有那种装载着一节又一节“0，1数据”的“火车”图片。

Charles Petzold

2000年8月16日

X

## PDF_PHYSICAL_PAGE_INDEX=11 | PRINTED_PAGE=XI

目 录

1 至亲密友/ 1

编码是什么？在本书中，这个词的意思是指一种用来在机器和人之间传递信息的方式。换句话说，编码就是交流。对任何能听见我们的声音并理解我们所说的语言的人来说，我们发出的声音所形成的词语就是一种编码。用手电筒能代替声音来与朋友交谈吗？当然值得一试。

2 编码与组合/ 7

莫尔斯码也被称做二进制码，因为这种编码的组成元素只有两个“点”和“划”。不过，点、划的组合却可以表示你想要的任意数目的码字。这其中的规律是什么？本章我们就来探讨一番。

3 布莱叶盲文与二进制码/ 13

布莱叶盲文是为了便于盲人阅读而发明的一种编码。在这一章中我们将解析布莱叶盲文，来看看它是如何工作的。我们并不是要真的学习布莱叶盲文，而且也无须刻意记住关于它的什么内容。我们仅仅希望从中归纳出编码的一些性质。

XI

## PDF_PHYSICAL_PAGE_INDEX=12 | PRINTED_PAGE=NOT_DETECTED

手电筒的剖析/ 21

为了理解电在计算机中的工作原理，我们先得仔细钻研一番电学，不过不要担心，只需要一部分基础知识就够了。在本章，我们将以手电筒为教学道具，引导你走入神秘的电学世界。

5 绕过拐角的通信/32

在第1章，我们曾经讲过用手电筒与朋友进行交谈的方法，但是这样的方式是有局限性的，你的交流对象必须住在街对过，而且你们卧室的窗口正好相对。但是，现实不会总是如此。当手电筒的光无法到达朋友的卧室时，怎样与他们进行无声的交流呢？电路或许可以助你一臂之力。

6 电报机与继电器/40

全球性即时通信对于我们来说已经司空见惯，你要是生活在19世纪早期，可没这么方便。你当然可以进行即时通信或者远距离通信，但是不能同时做到这两点。即时通信受声音传播距离的限制，或者受视野的限制。使用信件倒是可以进行更远距离的通信，但是寄信耗费的时间太多，并且需要借助于交通工具。为了解决这个问题，电报应运而生，而伴随着电报诞生的继电器更是具有重要意义的伟大发明。

我们的十个数字/47

人们很容易理解，语言只不过是一种编码。比如英文中的“cat”（猫）在其他语言中可以写做 gato、chat、Katze、KOIIIK或 kátta。然而，数字似乎并不是那么容易随文化的不同而改变。不论我们说什么语言，或使用什么样的发音，在这个星球上的所有人都用以下方式来书写数字：0，1，2，3，4，5，6，7，8，9。你了解这十个数字么？

8 十的替代品/55

对人类而言，10是一个非常重要的数字。它是我们大多数人拥有的手指或脚趾的数目。我们人类已经适应了以10为基数的数字系统。但是只能使用十进制来计数吗？如果人类像卡通人物那样每只手只有4根手指会怎样？

## PDF_PHYSICAL_PAGE_INDEX=13 | PRINTED_PAGE=XIII

9 二进制数/ 71

二进制是最简单的数字系统，其中只包含两个数字：0和1。二进制中的1位(bit)称为1比特，我们可以用它来表达简单的信息：是或不是；亮或灭；打开或关闭，等等。而事实上只要信息能转换成两种或多种可能性的选择，就都可以用比特来表示。这种例子在日常生活中随处可见，比如照相机胶卷的胶片速度，各种商品包装上的条形码。

10 逻辑与开关/90

对于古希腊人而言，逻辑是在追求真理的过程中所使用的一种分析方法，是一种哲学形式。而英国的数学家乔治·布尔却认为可以找到一种数学形式来描述逻辑，因此他发明了布尔代数。更重要的是，布尔代数运算可以用开关、导线和灯泡组成的电路来实现，布尔代数中的AND和OR，与线路中开关的串联和并联，有着奇妙的对应关系。

11 门/108

继电器像开关一样，可以串联或并联在电路中执行简单的逻辑任务。这种继电器的组合叫做逻辑门(logicgate)，也简称门。这里提到的逻辑门执行“简单”逻辑任务是指逻辑门只完成最基本的功能。本章就介绍那些用以完成最基本逻辑任务的门。

12 二进制加法器 / 135

加法是算术计算中最基础的运算，如果想搭建一台计算机，首先就要搭建出计算两个数加和的器件。本章我们将利用前面章节中用过的开关、灯泡、导线、电池、逻辑门等这些简单的元件，搭建一个二进制加法器。

13 如何实现减法 / 147

当你确信继电器连接在一起真的可以实现二进制数加法的时候，你可能会问：“如何实现减法呢？”问得好！这表明你是相当有觉察力的，加法和减法在某些方面互相补充，但是在机制上二者却存在本质区别。不过，没关系，我们可以想一些办法，把减法运算变成加法。

XIII

## PDF_PHYSICAL_PAGE_INDEX=14 | PRINTED_PAGE=14

想象一下，如果你没有了记忆力，该如何去数数？我们不记得刚刚数过的数，当然也就无法确定下一个数是什么！同理，一个能计数的电路必定需要触发器。本章要介绍的就是各种触发器。

15 字节与十六进制 / 186

在前面的章节中，加法器、锁存器以及数据选择器的输入和输出形式都是8位的数据流，也即数据路径的位宽为8，为什么要定义为8位呢？为什么不是6位、7位、9位或10位？本章就要解释其中的缘由。

16 存储器组织 / 197

每天清晨，我们将自己从沉睡中唤醒，这时大脑的空白会很快被记忆填满。我们立刻会意识到自己身在何方，最近做了些什么事情，有什么计划打算。有的事情我们很快就能想起来，但有时并非如此。我们可以借助许多工具来记录信息，比如笔和纸、磁带，当然现在还可以使用存储器。

17 自动操作/ 215

人类的本性中带有一些懒惰的特质。我们总是抵触繁重的工作，对枯燥的、重复性的工作深恶痛绝。所以，当你必须用前面搭建的加法器计算100个数，甚至更多个数的加法时，有一种念头就会不可遏制地从脑子里冒出来：怎样让加法器自动地完成数据输入和计算呢？办法肯定是有的，那就是编写程序。

18 从算盘到芯片/ 252

算盘、滑尺、纳皮尔骨架、差分机、解析机、继电器、电子管、晶体管、芯片、计算机；甘特、帕斯卡、莱布尼兹、杰奎德、巴贝芝、图灵、冯·诺依曼、香农；IBM、贝尔实验室…你觉得应接不暇了吗？把这些你或熟悉或生疏的名词和名字串起来，就是人类的计算工具发展史。让时光倒流，去看看那些精巧的工具，感受天才们的巧思吧！

XIV

14

反馈与触发器 / 160

## PDF_PHYSICAL_PAGE_INDEX=15 | PRINTED_PAGE=19 / XV

将中央处理器的所有构成组件封装到一块硅芯片上，就得到了微处理器。第一片微处理器芯片诞生于1971年，即Intel4004系列，其中集成了2300个晶体管，你或许觉得可笑—如今家用计算机的微处理器上所安置的晶体管数量已经以亿为计量单位了。但是，从本质上来说，微处理器实际所做的工作并没有变。在本章，我们就来看看两种有着辉煌历史的典型微处理器：Intel8080 和Motorola 6800。

20 ASCII 码和字符转换 / 307

计算机中的存储器唯一可以存储的形式是比特，因此如果想在计算机上处理信息，就必须把它们转换为比特的形式来存储。我们已经掌握了如何用比特来表示数字和机器码。如何用它来存储文本呢？毕竟，人类所积累的大部分信息，都以各种文本形式保存的。下面就轮到ASCII码出场了！

21 总线/325

一台计算机包括很多部件：中央处理器、存储器、输入/输出设备等。通常这些部件按照功能被分别安装在两个或更多的电路板上。这些电路板之间通过总线（bus）通信。如果对总线做一个简单的概括，可以认为总线就是数字信号的集合，而这些信号被提供给计算机上的每块电路板。

22 操作系统 / 346

你或许梦想过自己组装一台近乎完整的计算机，像老木偶匠盖比特雕刻木偶匹诺曹一样，全部亲自动手用小零件完成。不过在你的机器能完成你想要的操作之前，还差一个重要的东西—操作系统！

23 定点数和浮点数/ 365

整数、分数以及百分数等各种类型的数字与我们形影不离，它几乎出现在我们生活的所有角落。例如你加班2.75小时，而公司按正常工作时间的1.5倍支付你工资，你用这些钱买了半盒鸡蛋并交了8.25%的销售税。在计算机的

19

两种典型的微处理器/276

XV

## PDF_PHYSICAL_PAGE_INDEX=16 | PRINTED_PAGE=XVI

内存里，所有的数都表示为二进制形式。通过前面的学习，我们知道2用二进制可以表示为 $1 0 _ { 2 }$ ，可是2.75用二进制怎样表示呢？这就是本章的主题。

24 高级语言与低级语言 /381

第22章介绍了如何编写一段简单的程序，让我们可以利用键盘将十六进制机器码输入计算机，以及通过视频显示设备来检查这些代码。但是使用机器码编写程序就如同用牙签吃东西，伸出手臂费半天劲刺向食物，但每次都只取到小小的一块，用这种低级语言编写程序既费力又费时，有悖于我们发明计算机的初衷。不过，人们想出了一种效率更高的编程方法—使用高级语言。

25 图形化革命/398

回顾历史，从第一台继电器计算器到现在为止，六七十年过去了，计算机的处理速度飞速增长。不过要充分利用计算机日益增长的运算和处理能力，就必须不断改进计算机系统中的用户接口（User Interface），因为它是人机交互的轴心。图形化革命来了！

XVI

## PDF_PHYSICAL_PAGE_INDEX=17 | PRINTED_PAGE=NOT_DETECTED

至亲密友

你今年10岁，你最好的朋友就住在街对过。事实上，你们各自卧室的窗户正好彼此相对。每当夜幕降临，父母就如同往常一样，早早地催促你该上床睡觉了，但是你和你的朋友还想交流想法，交换见闻，分享各自的秘密，或者扯扯闲话，开开玩笑，聊聊梦想。这本无可厚非。无论怎样，渴望交流本来就是人类最主要的天性之一。

当卧室里的灯依然亮着的时候，你可以和朋友互相挥手，使用各种手势或简单的肢体语言，来表达一两个想法。但是，要表达复杂的想法可能就比较困难了。而且一旦父母宣布“关灯”，这种交流似乎也不可能继续下去。

如何交流呢？或许可以打电话？10岁小孩的房间里会有电话吗？即使有，无论电话在哪里，你们的谈话都有可能被偷听。如果你家里的电脑连接了电话线，它可能帮上忙，而且不会发出声响，但是等等，电脑也不会在你的房间里。

你和朋友所采用的方法就是使用手电筒。众所周知，手电筒是为了让孩子们能够躲在被子下看书而发明的；在天黑后用手电筒来交流信息似乎也是理想的选择。它们当然是很安静的，并且光线是高度定向的，同时光线也不会渗漏出卧室而引起家人的疑心。

手电筒能用来交谈吗？这当然值得一试。我们在一年级的时候学习怎样在纸上写字母和单词，因此，把同样的方法运用到手电筒上似乎也是有道理的。只需要站在窗户边，用光来画出字母。对于字母“0”，打开手电筒，在空气中划一个圈，然后关掉手电筒。对于字母“I”，竖着划一下。但是，你很快就会发现，这个方法也不太行得通。当你看着朋友的手电筒在空中圈圈点点时，会发现很难在头脑中组合出那么多复杂的笔画。这些旋转和倾斜的光线都太不准确了。

## PDF_PHYSICAL_PAGE_INDEX=18 | PRINTED_PAGE=2

或许大家都曾经在电影里看到这样的情节，两个水手在海上通过灯的亮灭来互相发送信号。而在另一部电影里，一个间谍转动一面镜子将太阳光反射到另一个房间里，从而向被俘的同伙传递信息。或许那正是解决问题的办法。如此一来，你就可以发明一种简单的技术。在这个方案里，字符表里的每个字符对应一连串的手电筒闪烁。“A”是闪一次，“B”是闪两次，“C”是闪三次，依此类推，“Z”就是闪26次。单词BAD可以用闪2次，闪1次，闪4次这样的一个组合来表示，而且在字符之间设置的小停顿使这个单词不至于被误认为是闪7次的字母“G”。另外，单词之间停顿可以稍长些。

这似乎很有希望，采用这种方案的好处是你不必在空中比划手电筒了，只要对准方向和按开关就行了。但是这种方案也有一个不足，那就是如果你想发送的第一个消息是“How are you？”，那么你将总计需要让手电筒闪131次！而且，这还是忽略了标点符号的，你还没有设计闪多少次来对应一个问号。

但是这已经离答案更近一些了。我们能够肯定的是，在此之前一定有人也遇到过类似的问题，而你解决这个问题的思路也是非常正确的。等到了白天，跑一趟图书馆，查查资料，你发现了一个被称为莫尔斯电码（MorseCode）的伟大发明。这正是你想找的，尽管你现在必须重新学习如何去“写”字母表里的字母。

它们的不同之处在于：在你发明的系统里，字母表里的每个字母就是用一定数目的闪光表示的，闪1下为“A”，闪26下为“Z”。而在莫尔斯电码里，则有两种闪烁短闪和长闪。当然这使得莫尔斯电码更加复杂，但是在实际应用里它被证明是更为有效的。句子“How are you?”现在只要闪32下（包含一些短闪和一些长闪)，而不再是131下，而且这其中还包括了一个代表问号的编码。

当问及莫尔斯电码是如何工作的时候，人们并不会谈论“短闪”与“长闪”。相反，他们使用“点（dot)”和“划（dash）”，因为这是在打印纸上显示编码的一个便利方法。在莫尔斯电码里，字母表里的每个字母都与一个点划序列相对应，正如下表所示。

编码隐匿在计算机软硬件背后的语言

2

## PDF_PHYSICAL_PAGE_INDEX=19 | PRINTED_PAGE=3

虽然莫尔斯电码和计算机毫无关系，但是，熟悉编码的本质对于深入理解计算机软硬件内部结构以及隐匿在其后的语言将大有裨益。

在这本书里，编码这个词的意思是指一种用来在机器和人之间传递信息的方式。换句话说，编码就是交流。有时候我们认为编码就是指秘密的东西（密码）。但是大部分编码不是这样的。毕竟，大部分编码必须易于理解，因为它们是人类交流的基础。

在《百年孤独》这本书的开篇里，加西亚·马尔克斯回忆了一个时代，那时“这个世界刚刚出现，以至于很多东西缺乏命名，这时就有必要亲自用手指明这些事物”。我们赋予这些东西名字时往往是很随意的。这就好比说为什么猫不被叫做“狗”而狗不被叫做“猫”一样，没有什么理由可言。你可以说英语词汇就是一类编码。

对任何能听见我们的声音并理解我们所说的语言的人来说，我们发出的声音所形成的词语是一种可识别的编码。我们将这个编码称为“口头话语（the spoken word)”或“言辞（speech）”。对于写在纸上（或刻在石头上、木头上，或者在空气中比划）的词，我们还有其他的编码方式。这种编码以手写字符或打印在报纸、杂志以及书本上的字符形式出现。我们叫它“书面语言（the written word)”或“文本（text)”。在许多语言里，语言和文字之间存在着很紧密的联系。例如，英语中的字母和字母组合与它们的发音（或多或少）存在一定的对应性。

对于那些丧失听说能力的的聋哑人而言，人们发明了另一种编码来帮助他们进行面对面的交流。这就是手语。手语通过手和臂膀形成的动作和姿势来传达词语中的单个字符或者整个词语，以及基本的概念。对于那些失明的人，书面语言可以用布莱叶盲文(Braille）来替代。这种文字使用一系列凸起的点来代表字母、字母串以及整个单词。当话语必须快速抄成文本时，缩写和速记都是很有用的。

1 至亲密友

3

下一段：[继续读取](https://workshop.closeclaw.top/api/ai/read/38270854-596f-4a26-8183-db8c968c6020.md?start=20&limit=10)
