通灵芯片:计算机运作的简单原理 [2 ed.] 9787547815953

本书深入浅出地阐述了计算机科学中许多基本而重要的概念,包括布尔逻辑、有限自动机、编程语言、图灵机的普遍性、信息论、算法、并行计算、量子计算、神经网络、机器学习乃至自组织系统.作者高屋建瓴式的概括,既不失深度,又妙趣横生,相信读者读后会有很多

102 32 53MB

Chinese Pages 142 [154] Year 2012

Report DMCA / Copyright

DOWNLOAD FILE

通灵芯片:计算机运作的简单原理 [2 ed.]
 9787547815953

Table of contents :
封面
封底
译者的话
序言 石的奇迹
目录
第一章 通用件
布尔逻辑
二进制位和逻辑块
液压计算机
积木
省心的生异之异
第二章 万能积木
逻辑功能
有限状态机
第三章 程序设计
与计算机对话
连接
翻译语言
分层体系
第四章 图灵机的普适性
图灵机
能力的级
随机数
可计算性
量子计算
第五章 算法和探索法
算法的保证性
探索法几乎总是行之有效
拟合风景图
第六章 存储:信息与密码
压缩
加密
查错
第七章 速度:并行计算机
并行性
并行计算机的认识误区
第八章 自学习与自适应的计算机
对计算机培训
神经网络
自组织系统
第九章 跨越工程设计
人脑
模块性的问题
模拟进化
使思维机器进化
致谢

Citation preview

科学大师佳作系列

计算机运作的简单原理 [美]丹尼尔·希利斯著 崔良沂译

第 2 版

,rJ

丿L、J 4 ` .

名 上海科学技术出版社

国家 一 级出版社 全国百佳图书 出 版单位

` 四纪出圈

科学大师佳作系列

JS 皂 N

978-7-541._, '.,-S

责任编辑张毅颖周文峰沈晓莺.封面设计戚永昌

WWW . 沁 tp.cn

易文网: www . ewcn . cc

定价: 17.00 元

?竺 科学大师佳作系列

通灵芯片

——计算机运作的简单原理 (第 2 版) 著

11111111111111111

!~l~ll』.,1~ ~1 1 1 1 1 1 1 1

上海科学技术出版社

图书在版编目 (CIP) 数据 通灵芯片:计算机运作的简单原理/(美)希利斯

(Hillis, W.

D. )著;崔良沂译 .— 2 版 —上 海:上海科学

技术出版社, 2012. 12

(科学大师佳作系列)

ISBN 978 - 7 - 5478 -1595 -3

I.

O 通…

II. CD 希…@崔…

III. CD 电子计算机一

普及读物 N. (DTP3-49 中国版本图书馆 CIP 数据核字 (2012) 第 300132 号

The Pattern on the Stone: The Simple Ideas That Make Computers Work Copyright © 1998 by W. D. Hillis Chinese(Simplified Character:;) Trade Paperback Copyright © 2008 By Shanghai Scientific ,&. Technical Publishers. Published by arrangement with Brockman, Inc. ALL j{IGHTS RESERVED.



上海世纪出版股份有限公司

上海科学技术出版社 (上海钦州南路 71 号

出版、发行

邮政编码 2002 35)

新华书店上海发行所经销

苏州望电印刷有限公司印刷 开本 700Xl000

1/ 16

印张 9. 5

字数: 190 千字 2012 年 12 月第 2 版

2012 年 12 月第 2 次印刷

ISBN 978 - 7 - 5478 - 1595 - 3/N • 43 定价: 17.00 元 本书如有缺页、错装或坏损等严重质量问题, 请向工厂联系调换

译者的话

《通灵芯片》是一本科学启蒙书,作者是美国计算机科学家丹 尼尔·希利斯 (Daniel Hillis) 。他以大规模并行超级计算机等先驱

性成就闻名千世,现任美国应用头脑公司总裁和首席技术官,兼任 《人工生命》、《复杂性》、《复杂系统》、《未来一代计算机》等期刊编 辑,曾创立美国思维机器公司,从事过世界上超高速计算机一—大 规模并行“联接机”的设计,在平行计算领域有重大贡献,曾获霍珀 奖、雷梅纽詹奖、美国创造精神奖、美国计算机协会会员奖,目前的 研究兴趣是智能与进化。图灵奖得主马文.明斯基 (Marvin Minsky) 曾这样赞誉他:“丹尼尔·希利斯是我所见到的最富千发

明天赋、最深邃的思想家之一。” 希利斯自小便是一个既富于灵感、也富于匠心的神童,曾花掉 100 多盒名为“大工程师”的积木造过一个计算机(现为麻萨诸塞州 波士顿市博物馆展品)。他的可贵之处在于其求知天性和探索精 神。知其然,不可不知其所以然;唯知其所以然,方真正知其然。 在本书中,希利斯开门见山地指出:计算机科学是”概念驾驭 技术"。他以自己顽童时期的追忆,计算机天才设计家博大精深的

积淀,智能和进化领域先驱者的思考,笔走龙蛇,游刃有余地对计 算机运作的根本原理作了生动而富有意趣的诠释,可谓思维续密、 说理透彻如高屋建领,行文流畅、深入浅出似庖丁解牛,将计算机

这一人类神奇发明之奥秘追根究底和盘托出,进而引出机器智能



1

'

,

温,,归占千





芯片

忙匹ll,占,,品,lll勹俨心阳丘皿皿

的联想,探索心中萦绕的未来人工智能的进化和发展,行文涵盖广 远,积思深沉,包孕着真和美的智慧闪光。 译者在德国蒂滨根大学任客座教授时,与该书德文版译者塞 巴斯蒂安·沃格尔 (Sebastian Vogel) 博士作过交流,深感该书在计

算机科学普及方面,是一本不同寻常的开先声之作 。 阅读该书,喜 欢动脑又动手的读者,特别是青少年,在与科学大师的心智对话中 一定会感到 一 种强烈的精神追求:寻求本真,不断实践,超越常规, 极目未来。计算机世界日日在变化,该书之于计算机知识的求知、 探索和创新,其意义悠悠之长远矣。

崔良沂

cui_ly@sjtu. edu. en

-— 2 —一一

序言:石的奇迹

石头上我蚀刻了一幅图案,内有几何图形种种,在不明者眼 中,显得神秘而又复杂,但我明白,只要布局正确,这块石头将被赋 予 一 种特殊的能力,即对一种至今无人说过的咒语作出反应 。 我 用这种语言提问,石头会显灵应答:那是 一 个我用符咒创造的世 界,一个在石头图案内想像的世界。 几百年前,在我的新英格兰故乡,我所干的这种事,说出来也

许会送我上火刑架上处死 。 然而我的工作丝毫不涉及巫术 。 我从 事计算机设计和计算机编程。那石头是硅片,那咒语便是软件 。

刻在石头上的图案,以及指令计算机工作的程序,似乎复杂而又神 秘,但根据一些基本的生成原则,便不难将其解释清楚 。 计算机是迄今最复杂的人造物,但从本质卜说,它又相当简

单 。 我与成员仅数十人的几个小组一起,研制了包含工作元件达 几十亿之多的种种计算机 。 倘若把其中任意 一 台计算机的线路图

画出来,可能相当千 一 个颇具规模的公共图书馆的藏书量,没有人 会有耐心将其浏览一遍 。 幸好,这样的线路图并无必要,因为计算 机的设计存在着规律性 。 计算机是以组成 一 个分层体系的部件构 造的,每一部件都重复多次。要懂得计算机,你只需理解此分层体 系就行了 。

还有 一 个使计算机易于理解的原理,就是其各部件之间交互

作用的本质 。 这些交互作用很简单,并且是明确定义的,通常为一

-

1 -



通灵芯片

维,可清晰地排列成一系列因果关系 。 因此,计算机的内部运作与

别的相比,例如汽车引擎或收音机,更容易理解 。 比起汽车或收音 机,计算机的部件要多得多,但计算机部件协同运行的方式却也简

单得多。计算机依据的是概念,对技术的依赖性没有那么大 。 况且,概念几乎与制造计算机的电子技术无关,当今的计算机 由晶体管和导线组成 勹 但根据同样的原理,亦可采用阀门和水

管,或棍杆和绳索来实现 。 这些原理是计算机能够计算的真谛 。 关千计算机最值得 一 提的是:它的本质凌驾千技术之上 。 本书即 旨在阐述计算机的这 一 本质。

但愿我初涉计算这门学科时便能读到这样 一 本书 。 大多数计 算机书籍不是关千计算机操作,便是关于计算机制造技术(只读存 储器、随机存储器、磁盘驱动器等等)——本书则讲的是概念 。 本 书旨在阐述,至少是介绍,计算机科学领域中的大多数重要概念, 包括布尔逻辑、有限自动机、编程语言、编译程序和解释程序、图灵

机的普遍性、信息论、算法和算法复杂度 、 探索法、不可计算的函 数、并行计算、量子计算、神经网络、机器学习乃 至 自组织系统 。 在

读这本书时,对计算机感兴趣的读者可能巳接触过其中的许多概 念,但若未接受过正规的计算机教育,一般人很难明白这些概念是 如何结合在一起的 。 本书意在融会贯通——从简单的物理过程, 例如开关的闭合,一直深入到自组织系统的 学 习和适应功能 。 揭示计算机的本质,有几个基本的主题:首先是功能抽象原 则,它奠定了如上所述的因果关系分层体系 。 计算机结构是应用 这一原则的范例-~计算机是容易理解 的,因为当你关注分层体系中某一层发生的情况时,无需顾及较低



系指超大规模集成电路,说到底,它是将无数晶体 管等元 件和线路封装在单片

晶体硅上而成 。一—译者注



2



序言:石的奇迹

层次所发生的细节。功能抽象使概念独立于技术 。 第二个一致性主题是通用计算机的原则——即,实际上只存 在一种计算机,更确切地说,所有类型的计算机在所能和所不能方 面是一致的 。 我们几乎可以这样说,任何类型的计算装置,无论是

由晶体管、杆和绳、还是由神经元构成,都可用 一 种通用计算机来 模拟 。 如我以后阐述的那样,一个重要的假设是:使计算机像人脑 一 样思维只是一个如何为其正确编程的间题 。

本书的第三个主题,将在最后一章充分展开 。在某 种意义上 与第一个主题对立。关千计算机设计和计算机编程,或许会有一 种全新的方法——即 一 种不基于标准的工程设计的方法。这是非

常引人入胜的,因为当系统过千复杂时,常规的系统设计方法便变 得无能为力。我们目前设计计算机的那些原则最终会导致某种程

度的脆弱和低效。但此种弱点与信息处理机器的根本局限性无 关-这是分层体系设计方法的局限。但试想我们若采用一种模

拟生物进化的设计进程一—意即在这种进程中,系统行为的突现, 源千许多简单交互作用的累积,而非“自顶向下”的控制,试想那将 会怎么样?以这样一种进化进程设计的计算装置,可能会显示生

物体的某些健全性和灵活性—一至少,这是 一 种希望 。 这一途径 尚不清楚,到头来也有可能行不通 。 这是目前我研究的 一 个课题 。 在解释计算机的本质时,必须先弄清某些基本原理,然后再转 到翔实的内容 。 本书前两章介绍的基本原理有:布尔逻辑、二进制

位和有限自动机,你在读完第三章后必有所获,将能自顶向下地理 解计算机是如何工作的 。这 时便可进入第四 章 , 学习有关 通用计

算机的有趣的概念。 哲学家格雷戈里·贝特森 (Gregory Bateson) 将信息定义为 “生异之异 (the difference that makes a difference)" 。 换句话说,信



3 -

通灵芯片

息寓千我们选择用来表示意义的差异之中。例如,在原始的电气 计算器中,信息是以电流流通与否造成的灯亮灯灭来表示的。信 号的电压、电流方向是无关的。相关的只是导线载送两种可能的

信号之一,其中一种信号是使灯亮起来。我们选来表示意义的差 异一按贝特森的定义,生异之异——就是电流的流通与否。贝 特森的定义很精辟,但对我来说,一直含有更多的意义。在我四十

年的生涯中,世界发生了极大的变化。我们所看到的大部分变化, 无论是商业、政治、科学或哲学,无不由信息技术的发展所引起或 促成。当今的世界,许多事物都巳发生变异,但生异之异者始终是 计算机。 近来,人们普遍把计算机看成是一种多媒体装置,能将各种形 式的媒体一文本、图象、动画、声音综合或结合在一起。我感到 这种肤浅看法大大低估了计算机的潜力。确实,计算机能综合处

理各种媒体,但计算机的真正伟力在千它不仅能处理概念的表示 形式,而且能处理概念本身。令我惊异的不在于计算机能存储图 书馆的浩淌藏书量,而是计算机能察知本书所述的各种理念之间

的关系一不在于计算机能显示飞鸟或星系自旋的照片,而是计 算机能想像和预言创造了这些奇迹的物理定律将导致的结果。计 算机不只是一台先进的计算器、或一架高级照相机、或一支神奇的 画笔,计算机是一种能促进、拓展我们思维进程的工具,计算机是

一种具有想像力的机器,可从我们为它输入的概念出发,演绎到我 们人脑至今未到过的远方。

-— 4

日录

第一章通用件...............................................................

1

布尔逻辑.....................................................................

2

二进制位和逻辑块.........................................................

9

液压计算机...............................................................

12

积木........................................................................

15

省心的生异之异.........................................................

17

第二章万能积木............................................................

19

逻辑功能..................................................................

20

有限状态机...............................................................

28

第三章程序设计............................................................

37

与计算机对话

连接........................................................................

47

翻译语言..................................................................

53

分层体系

第四章

............................................................ 39

.................................................................. 54

图灵机的普适性...................................................

55

图灵机.....................................................................

56

能力的级..................................................................

58

随机数.....................................................................

60

可计算性..................................................................

61

量子计算

64

..................................................................

-

1

通灵芯片

第五章算法和探索法...................................................... 算法的保证性................... ............... ..........................

69 70

探索法儿乎总是行之有效……...……………………………… 75

第六章

拟合风景图....... . .......................................................

79

存储:信息与密码................. ... ............................

83

压缩........................................................................

86

加密...................................... ... . ...... ........................

91

查错...................................................... ............. .....

93

第七章速度:井行计算机................................................ 并行性.....................................................................

97 99

并行计算机的认识误区…...…...……......…………………… 100

第八章

自学习与自适应的计算机..................…………......

111

对计算机培训............................................................

114

神经网络..................................................................

116

自组织系统........ ...... .................................................

121

第九章跨越工程设计.............. . ....................................

致谢

125

人脑........................................................................

127

模块性的问题........................... . ................................

131

模拟进化..................................................................

132

使思维机器进化.........................................................

135

........................................................................ 141



2

第一章 '.........

通川件

小时候,读过一个故事,说的是 一 个小男孩,在废料场四下寻 觅,用捡来的种种零件组装了一个机械人 。奇在 这个机械人如活

人一般,能动、能言、还能思,成了他的同伴 。 出于某种缘故,我开 始心动起来,决定自己也动手做一个 。当年 收集零件的情景还记 忆犹新

用管子作四肢,小马达作肌肉,灯泡作眼睛,头则用了

一 个大油漆罐——满怀希望 一 旦组装完毕,给这玩意儿通上电,就 大功告成:一个活动的机械人 。

有好几次差点给电死,终千我让这些部件动起来了,还会发光 发声 。 我觉得有所长进 。 我懂得了如何为四肢做活动关节。 一 个 更重要的问题出现了:如何控制马达和灯泡,我是 一筹 莫展 。 我发 现:对于机械人是如何工作的,我还缺点什么知识 。 现在,我知道 我缺的是什么知识:那叫计算 。 当时我称之为“思维" 。 如何让机

械人有思维的能力,我心中茫然无知 。 现在我 当 然清楚:造 一 个机 械人,最难之处就是计算 。 但当时我还是 一 个孩子,难免为此

一愕 。

布尔逻辑 我很幸运,关于计算这门学科,首次读到的书是 一 本经典之 作 。 家父是流行病医生 。 我们那时住在加尔各答,很少见到英文

著作。在英国领事馆图书室里,我却发现一本蒙尘的书,作者是 19



2

第一章通用件

世纪的逻辑学家乔治·布尔*

( George Boole) 。吸引我的是那书

名:《思维法则研究》。这激起了我的想像:真有思维法则?在这本

书中,布尔试图把人类思维逻辑简化为一些数学运算。虽然他并

未真正对人类思维作出解释,但他却向世人展示了简单类型逻辑 运算的惊人力量及普遍意义。他还发明了一种语言,用千描写和 处理各种逻辑命题和确定其真假与否 。 这种语言现称为布尔 代数。

布尔代数与你在中学学过的代数相似,差别仅在于布尔代数 在表示逻辑运算的方程中以变量取代了数字。布尔变量代表非真 即假的命题。逻辑运算”与 “(And) 、”或 “(Or) 、“非 ”(Not) 分别用

符号^、 V 、 -, 表示。例如下列的布尔代数方程:

-,(AVB)=(-,A) I\ (-, B) 此方程称为德·摩根定律,以布尔的同事奥古斯都·德·摩 根 (Augustus De Morgan) 命名意即:若 A 和 B 皆不为真,则 A 和

B 必皆为假。变量 A 和 B 代表任意二值逻辑(非真即假)的命题。

显然,此方程是成立的,但也可用布尔代数写出更加复杂的逻辑命 题并加以证明或反证。

麻省理工学院有一位学工程的年轻学子,他的 一 篇硕士论文 将布尔的学说引入了计算机科学领域。这位学生便是后来以创立 信息论这门数学分支而闻名的克劳德.香农**( Claude Shannon) 。

这门分支定义了我们称之为“二进制位”的信息量度。“二进制位” 的概念是一个重要的发明。但对计算科学来说,香农利用布尔逻

*乔治·布尔 (1815 — 1864) ,英国数学家, 1847 年正式提出逻辑规则系 统 。一译 者注 峰睾克劳德·香农 (1916 —

),美国应用科学家,信息论创立者, 1948 年发表署名

论文《通信的数学理论》。一—译者注

—3

通灵芯片

辑所做的工作也同样重要。由千这两点,香农奠定了后五十年计 算科学领域内所发生的一切的基础 。

香衣潜心于造一台下象棋的机器一泛而言之,是制造一台 能模拟思维的装置。在 1940 年,他发表了题为"继电器开关电路之 符号分析"的硕士论文。在文中,他表明了可以用电气线路来实现

布尔代数表达式的思想 。 在香农的线路中,按布尔代数逻辑变量

值的真或假对应开关的闭合或断开 。 香农提出了一种方法,可将 任意布尔代数表达式转化成一系列开关的布局。若命题为真,线 路建立连接;若命题为假,则断开连接 。 此种结构意味着:任意可 用布尔逻辑命题精确描述的功能都可用模拟的开关系统来实现 。

与其详述布尔和香农的学说,不如举 一 个应用的实例,我设计 了一个简单的计算装置:会玩井字游戏的机器 。虽然 比起通用的 计算机,此井字游戏机极其简单,但它体现了任何类型计算机的两

大重要原则,显示了如何把一个任务简化成 一 些逻辑功能,又如何 将这些功能用连接开关电路来实现 。 在加尔各答我读了布尔的那

本书,不久还真的用灯泡和开关造了个玩井 字 游戏的机器 。 这是 我对计箕机逻辑的初次涉猎 。 尔后,我在麻省理工学院就学时,克

劳德 · 香农成了我的朋友和老师。我发现,他也曾用灯泡和开关 造过 一 个玩井字游戏的机器 。

大多数读者都知道,此游戏在 3X3 方格棋盘上进行 。 游戏双 方依次在方格上画符号,一方画 X ,另 一 方画 O 。首先使三个符号 成一行(成一横线、竖线或对角线)者获胜 。 小孩子热衷千玩井 字 游戏,因为似乎有无限多的取胜策略 。但最终 他们会悟到总共只 会出现为数不多的几种棋面。一旦双方掌握了那些棋面,每次游 戏的结局总是不分胜负,游戏也就变得索然无味 。 井字游戏是计

算的 一 个范例,恰是因为其徘徊千复杂与简单的分界线上 。 越过



4

第一章通用件

此界线便是计算的领域。计算是关千将看上去复杂的任务(如赢 井字游戏)分解成简单的操作(如合上开关)加以执行 。 在井字游戏中,各种可能发生的情况为数不多,完全可以将其 全部列出来,从而把每种棋面下的正确走法输入机器。我们可用

简单的两步法来设计这个机器 。 首先,将游戏简化为所有可能的 棋面,定义每种情况下的正确走法,其次,将这些情况转化成开关 连接的电路,使其能识别每种棋面,作出恰当的反应 。 接下去是设想并写下由 X 和 0 组成的各种棋面模式,再确定 计算机在每种情况下的走法 。 由千在 9 个方格中,任何一 格皆可为 三种状态之一 (X 、 0 或空格),故共有 39 (即 19 683) 种不同的棋

面。但在游戏中,其中的大多数棋面是不会出现的 。 因此,比起列 出所有可能发生的情况,更可取的方法是画 一 棵博弈树一~一张 描绘出各种可能发生的棋局的路线图。博弈树从根即 一 空格出

发,展开人机对弈中人的各种可能走法的分支(此树不必展开机器 走法的分支,因为机器走法为预先设定) 。 图 1 所示为博弈树的一 小部分。对千人在各个位置所画的 X ,机器按预先设定的走法画 O (说来也怪,计算机科学家画树的方式总是“根”在顶部,自顶

向下)。 图 1 中的这棵博弈树,反映了我在井字游戏中一贯采用的策

略,即一有可能,便占据中心格。机器的走法看入走什么而定,这 样,所需考虑的各种可能的走法数可大大减少 。 一棵显示机器在 每种情况下走法的完整博弈树,分支在 500 至 600 ,确切的数目取

决千所采用的策略。机器循此博弈树便可稳操胜券,至少下成和 棋。把游戏规则纳入走法,机器沿这棵树行走自然永远是遵守游 戏规则的。依据这棵树,我们可写出机器在所有情况下走法的详 细说明 。 这些说明便构成了机器的布尔逻辑状态描述 。



5

通灵芯片

荨』瓣 严!鬓嘉勹荨

i

x 走一步

`尸酰

0 走一步

\

X 走一步

0 走一步

0赢

.

0赢

X 走一步

打平

图 1

井字游戏博弈树的 一 部分

我们定义了欲实现的行为,便可将此行为转化为由电池、电 线、开关、灯泡组成的电气线路。机器的基本电路与闪光灯电路原

理相同:按下开关——即闭合时一—灯亮,因为此时灯泡与电池巳 形成一条通路(与电池的连接用十和—这两个符号表示) 。 重要的 是:在电路中,这些开关可采用串联。也可采用并联。比如我们可 将两个开关串联起来,那么,只有当两个开关都合上时,灯才会亮 起来。采用这种电路,可实现计算机的一种基本开关功能——称 为”与“功能的"逻辑块”,因为只有当第一个开关与第二个开关都

合上时,灯才会亮起来。如开关采用并联方式,则可实现”或"的功 能,当其中 一 个开关或两个开关都合上时,电路才成通路(灯亮), 见图 2 。

-

6



第一章通用件

0@ 串联

:

0

并联 图 2

串联开关和并联开关

将简单模式的串联电路和并联电路进行组合,可形成体现各 种逻辑规则的连接。在井字游戏机中,一个串联的开关链可用于 检测一种棋面,若千个开关链与灯泡并联,所有相应的棋面都能使 灯亮起来一—意即,从机器方面来说,产生同一种反应 。

我做的井字游戏机以 9 个开关为一组,共有 4 组,每个开关相 应千九方格棋盘上的一格 。 按游戏棋盘那样排列 9 个灯泡。游戏 总是由机器先走,走法用灯亮表示。人走棋采用合上开关的方 式

第 一 步是使用第一个开关组,第二步是使用第二个开关组,

依此类推 。 在我那机器中,总是由机器先走左上角,这一开局定式 可使情况的数目大为减少。人接着合上第一组中的某一开关(比 如合上对应于棋盘中心格的那个开关),游戏便如此这般进行下 去。机器的策略体现在开关和灯泡相互之间的布线中 。 使机器产生第一步反应的线路十分简单(见图 3) 。 作为机器 的反应,第 一 组的每个开关各与一个灯泡连接 。 例如,人走中间一 格会引起机器走右下格,故中心格开关是与右下角灯泡相连的 。

由于我的机器 一 有可能便以走中心格作为反应,因此,第一组中大 多数开关都与中心格的灯泡并联 。

下 一 回合的棋面取决于人走的第一步和第 二 步 。 为识别人的 棋步序列,相应的开关采取串联方式。例如,若人第 一 步走中心 格,第二步走右上格,机器的应着便是走左下格 。 为实现这一棋



7 -



通灵芯片

第一步

第二步

左下格灯泡

I

+

三三尸# _ ___/ ___/

##

_ ___/ ___/

言卢 至其他棋面

图 3

产生同样反应的若干不同的棋面

面,要把第一组的中心开关与第二组的右上角开关串联(意即,若 中心格与右上格都巳由人画上了符号,则将… … ),再把这两个开 关的链与左下角的灯泡相连。每个到灯泡的并行连接,表示一种

使灯亮起来的棋步序列。(“这一着或那一着都将引起对方这种应 着")。如果两个不同电路需要同一开关,我便使用“双闸“开关

采用机械联动至同一按钮的两个开关,它能够实现同步动作一— 这样便可将同一棋步纳入两种不同的棋面。第三组和第四组的开

关线路同样采用这一原理,不过,不同的棋步序列会更多一些。你 或许还会想到,尽管原理很简单,但线路会变得纷繁复杂,随着棋 面上空格越来越少,开关链也会逐渐见长。 我做井字游戏机,约用了 150 个开关。当时,这劳作对我来说

确实不轻松(我是用木头加铁钉来制作开关的)。今天,我设计的

—8

第一章通用件

计算机芯片,包含的开关可达上千百万,但其中大多数开关的连 接方式与此井字游戏机的雷同。虽然,大部分现代计算机采用的

是另一种电气开关——晶体管,容后再述-—-但用开关串联来实 现”与“功能,用开关并联来实现”或“功能,这一概念至今依然

未变。 我做的井字游戏机,与计算机在逻辑上相似,但也有一些重大 的区别。其中之一便是井字游戏机并无事件随时间顺序发生的概 念。因此,游戏的整个序列一—即整棵博弈树

必须事先设定。

对千井字游戏机,设计博弈树的工作巳十分繁重,更逞论一些更加

复杂的游戏。比如下国际象棋,或者即使是下跳棋,这种做法实际 上都是行不通的。现代计算机下跳棋水平很高,国际象棋下得也 可以(见第五章),这是因为它并非依靠预先设定的博弈树一而 是采用了另一种方法一—即审视时间上顺序发生的棋面模式。

与通用计算机相比,井字游戏机的另一区别是它只能执行一 种任务。井字游戏机的“程序"固化在线路中,它并无软件可言。

二进制位和逻辑块 如我在序言中所述,井字游戏机(或任何其他的计算机),并非 一 定要由电气开关来构造。计算机可用电流、液压或化学反应来 表示信息。然而,无论你采用晶体管、液压阀、还是化学装置,其工 作原理是雷同的。井字游戏机的关键思想是:”与“功能和”或“功

能分别用两个串联开关和两个并联开关来实现 。 诚然,实现”与“ 功能和`或“功能,还有其他许多方法。 这里我需暂停一下,先提出二进制位的概念,最小的“生异之 异"(再次引用贝特森的说法)是一种差异 ,即 将一切信号分成截然 不同的两类。在井字游戏机中,是“电流流通”和“电流不通”这两



9

通灵芯片

类。按照惯例,我们把这两种类别称为 1 和 0 。 注意,这仅是虚名 而巳。我们亦可称其为真和假,或者称作艾丽斯和鲍勃亦无不可, 甚至命名哪类为 0 哪类为 1 都是无所谓的 。一 个携带两种不同信 息之一(如 1 或 0) 的信号称为一个二进制信号,或一个二进制位 。

计算机采用若干个二进制位的不同组合来表示各种不同情况的集 合——比如井字游戏中不同的棋步,或显示屏幕上不同的色彩 。 由于依惯例二进制位用 1 和 0 表示,人们便常将二进制位组看作为 数字,因此留下这样的打趣:”计算机干什么都用数字 。 ”但此惯例 只是反映事物的一种方式而巳。如果我们把二进制位所传达两种

可能的信息命名为 X 和 Y ,人们也许会说:”计算机干什么都用字 母。“精确的说法应该是“计算机用二进制位组表示数字、字母以及 所有的一切。” 表示一个二进制位,我们也可不用电流,而采取机械运动的方 式。在图 4 中,我们可以看到,滑杆右移代表输入为 1 ,此种方法可 实现”或"的功能。当输入杆 A 和 B 都位于左端不动时,表示两个

输入都为 0 ,输出杆由于受到弹簧向左的张力而保持原位不动 。而 当任意一个输入杆向右滑移时,则输出杆因受力随之向右滑移 。 图 5 所示为另一种有用的功能:"非",即将每种信号倒置,比如输入

杆右移导致输出杆左移,反之亦然。



输入 A



输人 B

图 4

用机械方式实现”或“功能

— 10

第一章通用件

输入 图 5

“非“功能的机械元件

这些”与"、”或"、“非”功能,称为逻辑块,可以将它们组合起 来,以产生其他的功能。例如,”或“块的输出和“非"块连接可产生 ”或非 ”(Nor) 的功能,即当输入皆不为 1 时,输出为 1 。 再举一个例

子(应用德 ·摩根 定律),我们也可这样来实现”与"块 :先分别将两 个“非"块连至一个”或“块的输入,再将其输出连接至第三个“非“ 块(见图 6) 。这四个块共同作用实现”与“功能,即当输入皆为 1 时,输出为 1 。



输出 / .'

图 6

弹簧

若干“非"块与一个”或“块连接,构成 一 个“与“块

— 11

通灵芯片

早期的计算器采用机械部件。早于 17 世纪——布莱兹·帕斯 卡素( Blaise Pascal) 就造出了 一个机械式加法机。格特弗里德 ·威 廉·莱布尼兹.. (Gottfried Wilhelm Leibniz) 和博学多才的英国人

罗伯特·胡克 (Robert Hooke) 受其 启发,经过改良后造出的机器

还可做乘法和除法,甚至可以求平方根 。但 这些机器是不接受编 程的。但到了 1833 年,又有一个英国的数学家和发明家查尔斯· 巴比奇**米 (Charles Babbage) ,他设计并 参与制造了一个可编程机

械式计算机。即令在 60 年代我的童年,大多数算术计算机也是机 械式的。我一向喜爱这些机械式计算机,因为其中的诸般运作尽 落眼底,而电子计算机则不能如此。当我在设计电子计算机芯片 时,想像中那电路的工作就像一个个机械部件在眼前晃动 。

液压计算机 我设计逻辑电路时,脑海中便会闪现出液压阀的影子,它类似 一 个既能控制水流又为水流所控制的开关 。液压 阀共有三个连接

点:输入、输出和控制。控制连接处的液压推动活塞向前,从而将 输入至输出的水流阻断 。图 7 表示用液压阀构成的一个”或“功能 的管路。

在此管路中,液压用千表示两种可能的信号的差别 。注意 :在

一 个液压阀中,控制管能影响输出管,而输出管则无法影响控制 管。这一制约确立了信息可通过开关向前流动,在某种意义上,确 立了即时的方向。而且,由千液压阀非开即关,它还具有放大的功

*布莱兹 · 帕斯卡 (1623— 1662) ,法国数学家、物理学家、哲学家,概率论创立者



译者注 **格特弗里德·威廉·莱布尼兹 (1646— 1716) ,德国自然科学家和哲学家,微积

分、数理逻辑的先驱,提出二进制,创立单子论和神正论学说。一译者注 ***查尔斯 · 巴比奇 (1792— 1817) ,英国数学家和发明家,现代计算机的先 驱 。——译者注

-

12

第一章通用件

心归归

输人 A

液压阀

是使阀关闭,|

弹簧的作用

高压水源

输出

直至被输人 水压开启

输入 B

图 7

用液压阀构成的”或“块

能,使信号的力度在每一阶段恢复至最大值 。 即使输入液压很 小——由于要经过又长又细的管道,或者由千泄混——有了液压

阀的开/关功能,输出的水压总是能达到满值 。 这就是数宇和模拟 的主要区别 。 数字阀要么是开要么是关,而模拟阀则像你家里的 水龙头那样有各种调节值 。 在液压计算机中,对千输入信号,只是

要求它具有足以推动阀门的压力 。 在这例子中,生异之异是指液 压足以或不足以将阀门开启这一点上的差异 。 由于作为输入的弱 小信号,依然能产生足够力度的输出,因此我们可连接成千上万层 逻辑,一层的输出控制下 一 层,不必担心水压会逐渐减弱,每个门 的输出仍将保待满压 。

-

13

通灵芯片

这种类型的设计称为复原逻辑 。这一液压 技术的例子特别有 意思,因为它与实现现代计算机所用的逻辑几乎一模一样 。 管道 中的水压类似电线中的电压,液压阀类似金属 氧 化物晶体管,其控 制、输入和输出恰似晶体管的三个接点(称为门、源、漏极) 。液压

阀和晶体管这两者何其相似乃尔,你完全可将一台现代微处理机 的设计,直接化为 一台液压计算 机的设计 。 真的做起来,你还得用

显微镜仔细观察那硅片上的线路布局,然后按硅片上的线路弯好 一根根管道,再按线路原样将其连接起来 。 在晶体管的位置取液 压阀而代之。相当千硅片上电压电源的管道,应与有水压的水源 相连;相当千接地的管道应能把积水排空 。 为使用这个液压计算机,你得把相当千输入和输出的液压式 部件都连接起来

你还得造一个液压式键盘、 一 个液压式显示

器以及液压式存储器芯片等等一当你完成了这一切,它就会将 电子芯片中发生的全部开关动作进程丝毫不走样地演示出来 。 诚 然,比起你今天的微处理机(更不用说大型的计算机了),液压计算 机的速度极其缓慢,因为水压在管路中传递速度比起电在导线中

传导显然要慢得多。至千体积,现代微芯片上有数百万个晶体管, 与之等同的液压计算机也需有数百万个阀门,芯片上一个晶体管 约百万分之一米宽,而一个液压阀边长就要有 10 厘米左右。如果 管道也按此比例,那么,液压机其管道加阀门,占地将达 1 平方公里 之广,从飞机上鸟瞰,犹如显微镜下的电子芯片一般。 我设计计算机芯片时,在计算机屏幕上勾描线条,图案经过缩 微(其过程与照相缩微类似)后,依样在硅片上蚀刻。屏幕上的线

条踪迹即是我的管道和阀门。实际上,大多数计算机设计工程师 不必费神勾描线条,而只需设定各个”与“门和”或“门之间的连接,

让计算机去完成有关开关位置和几何布线的细节工作 。 在大部分

-

14

第一章通用件

时间里,工程师置画线工艺于脑后,而沉思千各种功能之中 。 我有 时也是如此,但我仍喜欢把我构思的图形画出来 。当 我设计微芯

片时

我想做的第一件事便是在显微镜下观察它一—不是为了

通过观察发现什么新东西——而是因为我始终对图案模式如何创 造现实怀有 一 种依恋之情。

积木 除却缩微的奇迹以外,用硅片技术建造计算机并无什么特殊 的理由 。 无论用何种技术来造,只需要两种大批量的元件 : 开关和

连通件 。 开关是一种控向元件(如液压阀或晶体管),它将多重信 号结合成 一 个单独的信号 。 理论上,开关 应 是非对称的,即输入 信 号可影响输出信号,但反之则不成 立。 它还 应具 有复 原 的性质,使

微弱或弱化的输入信号不致引起弱化的输出 。 第 二 种是连通件, 如导线或管道,用千在各开关之间传递信号 。 这种连通件必须具 有分支转向的能力,即一个单独的输出能馈 至 多个输入 。 造 一 台

计算机有此两种元件足矣 。 下面我们还将介绍一种元件

寄存

器,用千存储信息——它亦可用控向元件和连通件来构成 。

我未造过液压计算机,但曾与朋友们一起用杆和绳造过一个 计算机,零件取自 一 种名为 Tinker Toys 的儿 童 积木玩具 。 读者也

许还记得那些圆木杆子,可以插入小木圆片的孔眼,相互咬合在 一 起 。 我的积木计算机的工作逻辑类似于图 8 所 示。与 那用开关和

灯泡做成的计算机一样,积木计算机也会玩井 字 游戏,还从未输 过 。 造这个计算机挺费劲,用了数万个零件,花掉了 100 多盒名为 “大工程师”的积木 。 最终的成品(现为马萨诸塞州波士顿市博物 馆展品),看上去似乎复杂之至,令人如坠雾中,其实工作原理只不

过是上面说过的各个”与“功能和”或“功能的简 单 组 合。

-

15

通灵芯片

图 8

积木计算机

我在设计积木计算机时有 一 大失算,即没有采用复原逻 辑一—就是说,在某 一 逻辑级至下一级之间没有放大功能 。 逻辑

的实现建立在杆子压动杆子的基础上,其设计有点像图 4 所示 。 由 千采用了这种设计,计算机中成百上千个部件动起来的全部动力 都依赖来自输入开关的推力,积聚起来的力 量往 往将传递动能的

绳索拉得很紧 。 由千在每个阶段都得不到恢 复 ,绷紧的绳索引起

的偏差会从一个逻辑元件 至 另 一 个逻辑 元 件不断地累积起来,所 以必须经常调节绳索,方能使该机器正常 工 作 。

此后我又造了一个积木计算机,解决了这 一 间题 。 但我始终 未忘第 一 台机器的教训 : 实现技术应能由不 完善 的输入产生完 善 的输出,微小的误差必须消灭在初始萌芽状态 。 数 字 技术的真谛 在千在每 一 级都能复原信号,使其趋千完 善。要 将 一 个复杂系统 置千控制之下,这是我们所知的唯一方法一 至 少迄今为止是

如此 。

— 16

第一章通用件

省心的生异之异 将计算机逻辑的两个信号命名为 0 和 1 ,这是功能抽象的一个

范例。这样,我们便能在处理信息时不必虑及底层具体的表示形 式。一旦设计好如何实现某一给定的功能,我们可将该实现机制 放入“黑箱”或“构造块”而不必再虑 。 由构造块体现的功能可一用

再用,无需顾及其内部细节 。 这种功能抽象的过程是计算机设计 的一项基本原则—— 虽不是设计复杂系统的唯一方法,但却是一 种最常用的方法(以后我会再介绍另外一种方法) 。 计算机的功能

抽象体系是这样构造的 : 每种功能抽象都由 一 种构造块来体现 。

将实现某些功能的构造块连接起来,又可实现更复杂的功能,这些 复合构造块对千上一层来说又可作为新的构造块 。 这种抽象体系结构是我们理解复杂系统最有力的工具,因为

这样我们便可一时集中考虑问题的单一方面,例如,我们可以讨论 抽象的”与"、”或”等布尔功能,不必涉及其是由电气开关、杆绳,还 是由液压阀来实现的。在大多数应用中,我们无需深究技术 。 这 意味着即使有一天晶体管和硅片被淘汰,关于计算机,我们所说的

一切基本上仍是成立的 ,你说这岂不妙哉 ?

-

17 -



第二章

........... ........... ...

万能积木

关于线路、开关等告 一 段落,现在我们开始从工程领域转到数 学领域,学习以 1 和 0 运作的逻辑块的抽象原理 。 在本书中,这一 章内容最抽象,它阐述如何利用造井字游戏机的方法,构造出几乎

任意 一 种功能 。 这里,我们定义 一 组功能强大的构造块:逻辑功能

和有限状态机 。 利用这些部件,不难构造出 一 个计算机 。

逻辑功能 还记得造井 字 游戏机否?首先是画出博弈树以表示 一 组输 入输出的规则 。 事实证明,这是 一 种 普 遍适用的攻克难关的方

法 。 只要设定按 一 组输入数据产生什么输出的规则,便可利用 ”与"、”或“、“非”等功能,构造出实现上述规则的机器装置 。 ”与“、

”或"、“非"逻辑块构成了 一 组万能的积木,可用来实现任何 一 个规

则集 。 (这些基始的逻辑块有时亦称为逻辑门) 。

一 组通用的逻辑块,这 一 概念非常重要 。 这意味 着 变幻无穷 。 忆童年时代,最喜爱的玩具是 一 套叫 LOGO 积木的塑料块 。 这些 塑料块可以相互呥合,搭出各种各样的东西,如汽车、房屋、太空飞

船、恐龙等 。 我很爱玩这套积木,不过它并不是万能的,搭出的东 西都呈一种方面直角、阶梯状的外观 。 如果要搭出其他形状,比如 说圆柱形或螺旋形,那就 需 要增加新的积木种类 。 后来我改玩别 的玩具才搭出了我想搭的东西 。 不过,布尔逻辑中的”与"、”或“、



20

第 二 章万能积木

“非"逻辑块却是一组将输入变为输出的万能构造块 。 要懂得它们 如何成为一组万能积木的原理,最好是学会如何利用构造块去实 现规则的通用方法。首先,让我们考虑 二 进制规则-~即输入、输

出为 1 或 0 的那些规则 。 井字游戏是由 二 进制规则来设定功能的

一 个范例,因为开关输入和灯泡输出分别是或合或断、或亮或灭 即或 1 或 0 (以后我们再讨论输入输出为 字母、 数 字、甚至 图象、声 音 的处理规则) 。 任意 二 进制规则集都可表示成下面 一 个表 : 作为 输入的 1 和 0 的组合及其对应的输出 。 例如关千”或“功能的规则 如下所示 :

”或“功能

输入 A

输入 B

输出









1

1

1



1

1

1

1

“非“功能规则的表示则更为简单 :

“非“功能

输入

输出



1

1



对于 n 个输入的 二 进制功能,输入信 号共有 沪种可能的组合 。 有时,我们不必费神将所有的可能全都表示出来,因为有些组合我 们不必去考虑。例如,在设定井字游戏机所执行的功能时,我们不 必考虑棋手同时走所有方格时会发生什么 。因 为这种走法是不允 许的,所以无需为这样的输入组合设定其输出是什么。 通过”与"、”或“、“非"块的连接可构造出各种复杂的逻辑块 。 在画连接图时,这三种块通常画成不同的图形(见图 9) 。左边的线

表示块的输入,右边的线表示块的输出。在图 10 中, 一 对具有 2 个



21

通灵芯片

输入的”或"块相连后,等同于一个具有 3 个输入的”或"块的功能。 即若 3 个输入中有一个为 1 ,则其输出为 1 。同样,也可将若干个 ”与"块串连起来,构成 一 个具有任 意多个输入的”与"块。

输出 :::—》尸输出

输入 A

输入 B

输入

输出



图 9

”与"块、”或“块和“非"块

=三》— 图 10

一对具有 2 个输入的”或“块等同于一个具有 3 个输入的”或“块

==D图 11

通过”或“块来构造”与“块

在图 11 中,若干“非"块分别与一个”或“块的输入、输出相连,

构成一个”与"块(还是德 · 摩根定律)。要理解其中的奥妙,最好 是将输入至输出的过程演算一遍。注意 :图 11 实际上与上一章中 的图 6 是一样的。这揭示了一个有趣的事实:在我们的通用构造块 中,并不 一 定非有”与"块不可,因为我们总是能用”或"块和“非"块

将其构造出来。 一 22 -—

第二章万能积木

在井字游戏中,”与"块是用来检测产生输出为 1 时的各种可能

的输入组合,而”或"块则提供了这些输入组合的登记表。这里,我

们先从一种具有 2 个输入的简单功能说起,设想我们要构造这样一 个块:由 3 个输入来表决结果 。在 这个新块中,少数服从多数一 意即仅当 2 个和 2 个以上的输入为 1 时结果才为 1 。 图 12A 表示如何才能实现这一功能。作为输入端,我们可用

若干”与“块,加上一定数量的“非"块,来识别有哪些输入组合会引 起输出为 1 。 这些块最终连向一个产生输出的”或"块 。 利用这种

策略,不难产生任何的输入至输出的转换。

@

A B C

@

A

B

多数

c 图 12

利用”与"块、”或“块和`非"块实现表决功能

— 23

通灵芯片

输入

少数服从多数输出 ABC

000



001



010



011

1

100



101

1

110

1

111

1

当然,用一个”与“门来识别一种组合的输入,这并非是实现该 功能的唯一方法,通常也不是最简便的方法。图 12B 中实现“少数 服从多数”功能的方法更为简单。就方法而言,重要的并不在千它 是否最好,而在于其实现是否总是行之有效。因此,我们可得出一 个重要的结论:通过”与"块、”或"块、“非"块的组合,可以实现任意

二进制功能——即任何由 0 和 1 表示的输入甩肚廿表所设定的 功能。 将输入、输出限定为二进制数,实际上并未带来太大的限制,

因为 1 和 0 的组合可表示许多其他的事物一—字母、较大的数以及 任何可编码的项。举一个非二进制功能的例子,假定我们想造一 个机器,作为小孩子玩的剪子/纸张凡辽K 猜拳游戏的裁判。在这 两人游戏中,每人从剪子、纸张、石头这三种“武器”中私下选定一

种。规则很简单:剪子能剪开纸张,纸张能包住石头,石头能砸坏 剪子。如果俩孩子所选的“武器”相同,则为平手。我们不是造一

个玩此游戏的机器(那样要涉及猜测对方会选哪种武器),而是造 一个裁定何方取胜的机器。下面是该功能的输入、输出表,其输入

为双方所选的武器,输出为何方取胜。游戏规则如下表所示。



24

第二章万能积木

A 输入

B 输入

输出

剪子

剪子



剪子

纸张

A 胜

剪子

石头

B 胜

纸张

剪子

B 胜

纸张

纸张



纸张

石头

A 胜

石头

剪子

A 胜

石头

纸张

B 胜

石头

石头



此剪子/纸张凡B 头游戏的裁判功能,是一个组合功能,但不是

一 个二进制功能,因为其输入、输出值不止两种。为了用一个组合 逻辑块来实现这种功能,我们必须将其转变成 一 个由 1 和 0 表示的

二进制功能。这需要为其输入、输出建立有关约定。一种简单的 方法是:用不同的二进制位表示各种可能性。对千各种“武器”来

说,共有三个输入信号:第一个输入为 1 表示剪子,第二个输入为 1 表示石头。第三个输入为 1 表示纸张。同样,我们也用不同的输出 位来表示 A 胜、 B 胜或打平。因此共有六种输入和三种输出。

为各种武器设定 3 个输入信号是构造此功能的非常好的方法。

但我们如要在计算机内表示的话,还可采取输入端、输出端更少的 编码方法。例如,我们可采用两个二进制位来表示各种输入:用 01 表示剪子。 10 表示纸张, 11 表示石头;同样,我们也可用两个二进 制位对各种可能的输出编码,如下所示。这种编码方法还可简化 成一个具有 3 个输入端/2 个输出端的表。





25-

通灵芯片

A 输入

B 输入

输出

01

01

00

01

10

10

剪子= 01

01

11

01

纸张= 10

10

01

01

石头= 11

10

10

00

A 胜= 10

10

11

10

B 胜= 01

11

01

10

平= 00

11

10

01

11

11

00

计算机可用二进制位的组合表示任何信号。二进制位的数目

取决于需要加以区分的信号有多少个。例如,假定有一台用英文 字母工作的计算机。 5 个二进制位的输入信号可以表示 32 种不同 的可能 (25 =32) 。计算机中用字母操作的功能有时采用这种代码,

不过更多的是采用 7 个或 8 个二进制位,用来表示大小写字母、标

点符号、数字等。大多数现代计算机采用标准的字母表示方式,即 ASCII (全称为美国国家信息交换标准码)。在 ASCII 中, 1000001

表示大写字母 A, 10000010 表示大写字母 B ,以此类推。这一约定

当然是任定的。

大多数计算机,都有一种或多种表示数字的约定。最普遍的 一种是以 2 为基的数字表示,其中序列 0000000 表示十进制数 0,

序列 0000001 表示十进制数 1 ,序列 0000010 表示十进制数 2 ,以此

类推。我们说计算机是 “64 位”或 “32 位”,是指计算机电路的数据 表示中同时处理的二进制位的数目: 一 个 32 位的计算机使用 32 位 表示一个以 2 为基的数字。以 2 为基的数字系统是一种普遍的约

定,但并不一定必须采用。有些计算机根本没有采用。大多数采

-— 26 - —

第二章万能积木

用此种数字系统的计算机,出于各种需要也接受数的其他表示方 式 。 例如,许多计算机中表示负数的约定略微不同。在十进制小 数方面,有的采用浮点数约定(小数点位置可相对于数位“浮动”,

因而, 一 定数目的位数可用于表示很大范围的数值)。选择何种表 示模式,通常是考虑能否简化执行算术运算的电路逻辑,或是否易 千从一种表示向另一种表示转化。

由千任何逻辑功能都可用一种布尔逻辑块来实现,所以,采用

任何表示形式的二进制数都可构造出执行加法或乘法等算术运算 的块。例如,假设在 8 位计算机中,我们要构造一个做加法运算的

功能块 。 这个 8 位加法器的块必须具有 16 个输入信号(每个相加 数有 8 个输入信号),以及 8 个输出信号作为加法的和 。 由千每个 数表示成 8 个二进制位,所以共有 256 种组合,每种组合代表一个 不同的数 。 举例来说,我们可以用这些组合表示 0 至 255 的数,或 — 100 至+ 154 的数 。 如何定义这个块的功能,那只是根据所选的 表示形式写出加法表,并将其转换成 1 和 0 而已 。 通过以前所述的 方法,便可将此由 1 和 0 组成的表用”与"块和”或"块来实现。 上述功能块,再另加 2 个输入,便不仅能做加法运算,而且还能

做减法、乘法、除法运算 。 这两个附加的控制输入用于设定做何种 运算 。 举例来说,在表的每一行,如控制输入为 01 ,可表示输出为 输入各数的和;对千每种组合,如控制输入为 10 ,则可表示输出为输 入各数的积 。 大多数计算机都具有这种类型的逻辑块,称为运算器。 采用上述策略来组合”与"块和”或“块,可构造出任意一种逻 辑功能,但其效率并非总是尽如人意。采用巧妙的设计,实现电路

所用的构造块常可大为减少 。 在设计中采用其他类型的构造块, 或者将输入至输出的线路延迟时间减至最低程度,这些也是我们 常希冀的 。 下面是逻辑设计中 一 些典型的问题:如何用”与"块和



27

通灵芯片

“非"块构造”或“块(不难)?如何用”与"块和“非"块的集合,只加

上 2 个“非"块,实现 3 个“非"块的功能(很难,但可以实现)?在计 算机设计过程中会不断冒出诸如此类的问题,使这工作富有创造 的乐趣。

有限状态机 上面介绍的各种方法,可用来实现任何随时可执行的功能。 但涉及按时序执行的功能更为有趣。为执行那些功能,我们需介 绍一种称为有限状态机的装置,用来实现随时间变化的功能——

这些功能不仅取决千当前的输入,而且取决于先前的输入。一旦

你掌握了有限状态机的概念,便会发现它处处可见——号码锁、圆 珠笔,甚至法律契约。有限状态机的基本概念是一个按布尔逻辑 建立的查询表与一个存储器的组合。存储器用来存储过去的历史 记录,即有限状态机的状态。

号码锁就是一个简单的有限状态机。号码锁状态即是对该锁 所拨数字系列的总体。号码锁不记得早先曾对其拨过的所有数 字,但它会记住刚刚拨过的那些数字,并知道在哪种数字系列下开

启。更加简单的有限状态机是伸缩式圆珠笔。此种有限状态机共 有两种状态一伸出和缩进——圆珠笔会记住其尾部按钮被按了

奇数次还是偶数次。所有的有限状态机都具有固定的可能状态的

集合、导致状态变化的可允许输入的集合(例如,按动圆珠笔按钮、 对号码锁拨号等),以及可能的输出集合(例如,圆珠笔尖伸出或缩 进,号码锁开启等)。输出仅取决千状态。反过来,状态又仅由输 入系列的历史记录来确定。 有限状态机还有一个简单的例子,那就是计数器,例如栅栏上

所装的计数器,每当走进 一 人,计数器的状态便进一,实时显示所

-— 28

第二章万能积木

进入的人数 。 计数器是一种有限状态机,因为它只能计数到某一 数位,当达到其最大值

比如 999 ——再进 一 人便会使其复归为

零 。 汽车的行驶里程表便是如此 。 我曾开过一辆老式切克车,上 面的里程表读数为 70 000 ,但我始终弄不清这 车 到底行驶过 70 000

英里 (1 英里约合 1. 609 3 公里)、 170 000 英里,还是 270 000 英里?

因为那里程表只有 100 000 种状态,上述历史记录对于该里程表来 说都是一样的 。 这就是为什么数学家常把一种状态定义为" 一 些 等值历史的集合” 。 关于有限状态机,还有一些尽人皆知的例子,如交通信号灯、 电梯按钮板等 。 在这些装置中,状态系列分别取决于内部时钟和 输入按钮(比如十字街头的“行走”按钮)或电梯的呼唤按钮和楼层 选择按钮的某种组合 。 机器的下 一 状态不仅取决于当前状态而且

取决千输入按钮的信号 。一 种状态转向另 一 种状态取决于一组固定 的规则 。 可采用 一 个简单的状态图,来综合表示状态间的转换 。 在 图 13 中我们看到的是交叉路口的交通信号灯的状态图 。 当按“行

走”按钮时,两个方向都亮起红灯 。 图中,每个灯块代表 一 种状态,每 个箭头代表一 种状态间的转换 。 转换取决千是否按动“行走”按钮 。 为了存储有限状态机的状态,最后还需要介绍 一 种用千存储 二进制位的构造块 。 这种装置称为寄存器 。一 个 n 位的寄存器具

有 n 个输入和 n 个输出,另加 一 个时序输入,用千通知寄存器何时 改变状态 。 存入新的信息,称为“写"寄存器状态 。 当 一 个时序信 号到来,通知寄存器写入一种新状态时,寄存器便根据输入改变其

状态 。 寄存器有多种实现方式,其中之一便是利用 一 个布尔逻辑 块来控制状态信息沿一个闭合圈环变化 。 这种类型的寄存器常用

于电子计算机 。 这就是为什么 当 电源中断时,计算机中正在进行 的作业便消失得踪迹全无 。



29

通灵芯片

A



c

D 图 13

交通信号灯控制器状态图

如图 14 所示, 一 个有限状态机是由 一 个布尔逻辑块和 一 个寄

存器连接而成 。 有限状态机将布尔逻辑块输出写入寄存器,从而 进入新的状态,逻辑块再根据输入和当前状态计算下 一 状态,在下

一周期再将下一状态写入寄存器。这一进程随每 一 周期而不断重 复进行下去。

有限状态机的功能,可表示成这样一张表 : 每种状态和每种输 入与下一状态的对应 。 例如,下表所示为交通信 号 灯控制器的全 部操作 。



30

第二章万能积木

-

·

.

输入

匾输出

逻辑块 寄存器

下一个状态

图 14

有限状态机,其逻辑块将信号反馈至寄存器

实现一个有限状态机,第一步便是列出这样一张表,第二步便

是为每种状态设定不同的二进制位组。交通信号灯控制器共有 5 种状态,需用 3 个 二 进制位表示 (n 个二进制位最多可存储沪种状

态,因为每个二进制位可使不同序列的个数增加一倍)。将上述表 中的全部状态改用二进制位组表示,便可将此表转化成用布尔逻 辑实现的功能。 输入

输出

“行走”按钮

当前状态

直道

横道

下一状态

未按

A

红灯

绿灯

B

未按

B

红灯

黄灯

D

未按

C

黄灯

红灯

A

未按

D

绿灯

红灯

C

未按

行走

行走

行走

D



A

红灯

绿灯

B



B

红灯

黄灯

行走



C

黄灯

红灯

行走



D

绿灯

红灯

C



行走

行走

行走

行走



31

通灵芯片

在交通信号灯系统中,时序发生器用来控制对寄存器”写“操

作,使状态按一定的时间间隔变化。有限状态机按时间间隔改变 状态的另一个例子便是时钟。带秒针的时钟共有 24 X 60 X 60 =

86 400 种显示状态-每种状态代表一天中的某一秒。时钟中的 时序机制,使其每隔一秒进入下一状态。许多其他类型的数字计 算装置,包括大多数常用的计算机,也按一定时间间隔进入下一状 态,其状态转换频率称为机器的时钟频率。在计算机中,时间并非 是连续的流,而是一种固定的状态转换序列。计算机的时钟频率 决定这些状态转换的频率,这是物理时间与计算时间的关系。例 如,我写这本书所用的膝上型电脑,时钟频率为 33 兆赫,即以每秒 3 千 3 百万次的频率转换状态。假如时钟频率再高一些,这台电脑

的运算速度还会更高,不过电脑的速度还受制于信息通过逻辑块 以计算下一状态所需的时间。随着技术的发展,逻辑运算将越来

越快,时钟频率也会越来越高。我写下这些话时,我这台电脑算是 上档次的。但当你读到这本书时, 33 兆赫时钟频率的电脑或许是

太慢了。计算机越做越小,逻辑运算却越来越快,这便是硅技术的 奇迹之一。

有限状态机为何如此有用,其原因之一是它们能识别序列。 例如一个号码锁,仅当输入 0—5 — 2 序列时方能打开。这样一把号 码锁,无论是机械的还是电子的,都是一个有限状态机,其状态图 如图 15 所示。

我们也可造出类似的机器来识别任意有限的序列。有限状态 机也可用千识别那些与某些模式匹配的序列。在图 16 中,有限状

态机能识别具有如下特征的序列:自 1 始,后接任意个 0 ,最后以 3

结束,符合这种条件的组合便能使门开启,如 1 —0— 3 或 1—o — 0-0-3 ;但 1 —o— 2 — 3 不能,因为它不符合上述模式。更复杂的

— 32

第二章万能积木

除一个肛之外的任何数

图 15

以 0— 5 — 2 序列开锁的号码锁的状态图

有限状态机还能识别更复杂的模式,例如识别文本流中某个拼错 的词。

有限状态机尽管功能强大,但并不能识别所有类型的序列模

式。例如,无法造出一个利用回文开锁的有限状态机。回文是指 顺读和倒读都一样的序列,如 3 — 2— 1-1 — 2— 3 。 需知回文的长 度可以是任意的,要识别回文的后一半需记住前一半中的每个字 符,由于存在无数个可能的前一半,所以,有限状态机势必需要有 无数种不同的状态。 同理,也无法造出 一 个有限状态机,可识别某英语句子语法上

是否正确 。 例如下列简单句:" Dogs bite." (狗咬人) 。 如在这名词



33

通灵芯片



之外的任 何数

三) 图 16

识别 1, 0, 3 或 1,0,0,0,3 序列的状态图

和动词之间加上 一 个修饰语,就会使句意发 生变化,例如, “Dogs

that people annoy bite. "(被人惹怒的狗咬人) 。还可在其中再加入 一个短语,使句意再次发生变化: “Dogs that people with dogs

annoy bite." (被带狗的人惹怒的狗咬人) 。虽然 ,这些句子的意义 或许越来越清晰,或许越来越难理解,但在语法上,上述句子却都 是成立的。原则上,这种词组嵌套过程可以一直进行下去,乃至可 能造出如此荒谬的句子:" Dogs that dogs that dogs that dogs annoy

ate bit bite.“ 对千有限状态机来说,无法识别此句在语法上是正确 的,同样的道理,人也很难看出,因为你得理清所有这些 dogs (狗)

的关系。难倒有限状态机的句子,人亦会感到为难。这一事实不 免令人猜测:在我们大脑的语言学习区,是否也存在一种类似千有 限状态机的机制呢?你在下一章将会读到,还有一些其他类型的 计算装置,它们与人类语法递归结构的匹配,看上去还要贴近

自然。



34

第 二 章万能积木

是我的指导老师马文.明斯基 (Marvin Minsky) ,首先向我介

绍了有限状态机的概念 。 他用了一个有名的难题,称为射击队问 题,题意如下:假设你是 一 名将 军 ,指挥排成长长一行队伍的士兵 。 由千队伍太长,你无法大声下达“开火!"的命令,于是你只好向队 伍中的第一名士兵下达命令,要他传给第 二 个,再依次传递下去 。

难的是全队士兵必须同时开火 。 虽然有节奏的战鼓声响个不停, 但你不能指望规定在多少点鼓声后全体一齐开火,因为你并不清 楚到底有多少名士兵 。 为了解决这一难题,你可以发 一 组复杂的

命令,指示每个士兵应对两旁战友说什么话 。 在此间题中,这排士 兵相当于 一 系列有限状态机,每 一 机器都按相同的时钟(即鼓点) 转换状态 。 作为输入,每个机器都接收来自两个直接邻机的输出 。 因此,这个问题的实质就是设计一排相同的有限状态机,当某一端 的机器收到有关命令后,在同一时间全体产生“开火"的输出(两端 的机器可不同千其他机器) 。 用若干个只具少数状态的有限状态

机便能解决这 一 难题 。 这里我不便写出答案,以免拂了大家跃跃 欲试的兴致 。 在介绍如何将布尔逻辑和有限状态机结合起来构造计算机以 前,这里只是作自底向上的描述,指明一下途径和方向而巳 。 下 一

章 一 开始我便介绍最高一级的计算机功能抽象,大多数程序员都 在这 一 级与机器打交道 。



35

第三章 .........................

程序设计

计算机的神奇,在千它几乎能变幻成你想像中的任何 一 样东 西,只要你能把它精确地描述出来 。 关键就是对你心中构思的描 述 。 只要程序编写得正确,计算机可虚拟成 一 个剧院、一样乐器、 一本参考书,或一个与你对弈的棋手。秉具如此适应万物、无所不 能的品性,世上除万物之灵的人以外一直别无他物。然而,这 一 切

终千可由上一章介绍的布尔逻辑块和有限状态机来实现了 。 不 过,计算机程序员很少考虑这些器件,他们 工 作时依靠的是 一 种更 通用的工具,称为编程语言 。 如果说,布尔逻辑块和有限状态机是计算机硬件的积木 。 那

么,一种编程语 言 便是生成计算机软件的 一 组积木 。 编程语 言 与 人类语 言 相似,也有词汇和语法 。 但编程语 言 的词汇和语句有着

确一不二的意义,这 一点与 人类语 言 不同 。正 如布尔逻辑是通用 的那样,大多数编程语 言 也是通用的,可用于描述让计算机执行的

一 切任务。无论谁写过 一 个程序,或调试过 一 个程序——都能体 会到其中甘苦,告诉计算机让它做什么远非原来想像得那么容易。 计算机操作的每 一 细节都须描述得详尽精确 。 例如,你让 一 个会 计程序为每个客户开账单 。 计算机可能会给未欠账的客户开出欠 账为 0.00 美元的 一 周账单 。 如果你让计算机给未付款的客户发一 份催款通知,那么未欠账的客户老是会收到催款通知,直到他们寄 去 0 .00 美元的汇款单。如何避免这类误会,是计算机编程必须考

— 38

第三章程序设计

虑的一个问题。程序员的艺术是把心中的构思精确地描述出来的

艺术。在本例中,意即要分清不欠钱的客户与真正欠钱的客户的 区别 。 正确的程序与不正确的程序,二者之差,恰如闪电与闪电 虫,区别仅在于一个虫字。

一个优秀的程序员,犹如一名诗人,能将他人难以言喻的心思 用词语表达出来 。 而如你是一名诗人,你会假定你的读者与你拥 有一些共同的知识和体验 。 程序员与计算机共有的知识和体验就 是用编程语 言 所表达的意义 。 计算机如何"懂得“编程语 言 表达的

意义且容后再议 。 我们先讨论这些编程语言的语法、词汇和 成语 。

与计算机对话 编程语言很多,各不相同 。 造成这种现象,主要有历史、习惯 和偏爱的原因 。 此外,不同的编程语言分别适用于描述不同类型 的概念,这也是原因之一 。 每种编程语 言 都有语法 。 你得学会语 法,才能用这种语言编程 。 但是,(像人类语 言 中的拼写和标点符 号那样)对千编程语 言 的语义和表达来说,语法并非是根本的 。 重 要的是词汇一一即编程语言中的所谓基始单元,以及通过组合这 些基始单元来定义新概念的方式 。 这才是编程语言 表 达力的关键

所在 。 各种编程语言都对数据处理加以描述,其主要的一个区别是, 它们所能处理的数据类型是不同的 。 最早设计的计算机编程语 言 主要是为了处理数和 字 符串 。 尔后的编程语 言 则能处理文 字 、图

象、声音,甚至别的计算机程序 。 但无论哪种编程语 言 ,处理哪些 类型的数据,都提供 一 种典型的方式,用 千 把数据单元读入计算 机、把数据分解、结合、修改、比较或命名 。



39



通灵芯片

要形象地说明这些抽象概念,最好是介绍 一 种具体的编程语 言——我选择 Logo 。 这是教育家和数学家西摩·帕佩特

(Seymour Pa pert) 专为儿童设计的一种计算机语言。小孩子用 Logo 语言编程,可以产生并处理图象、文本、数字和声音。虽然此 种语言极其简单,十岁小儿也能使用,但它同样体现了最复杂的计 算机语言中的许多特性,包括编写处理其他程序的程序的能力 。 Logo 也是 一 种可扩充性语 言 ——意即你能用 Logo 定义新的 Logo 词语 。

最简单的 Logo 程序之一是一个画图的过程 。 如何作画,就是 对屏幕上的一个小海龟下达各种命令 。 此小海龟犹如一支画笔, 会在屏幕上留下移动的痕迹 。 启动计算机后,小海龟位于屏幕中 心,头向上 。 如果小孩输入 FORWARD

10

这条命令,小海龟便向上移动 10 步,画出 一 条长 10 个单位的直线 。 FORWARD 命令后

接的 10 这个数称为参数 。 在此例中,参数告 诉小海龟要移动多少步。为了画出不同方向 的线段,小孩必须使小海龟转向,例如小孩可 发 RIGHT 45 命令,这时小海龟将从原方向

往右旋转 45 度(这也是一个参数) 。 再发 一 个带参数的 FORWARD 命令,小海龟将按新

图 17

FORWARD 10, RIGHT 45, FORWARD 10

的方向画出一条直线 。 小孩下达 FORWARD,

BACKWARD, RIGHT,

LEFT 等命

令,就会使小海龟作上、下、右、左移动,从而画出 一 幅图来 。 但靠

输入大量命令来作画,很快便使人觉得枯燥不已 。 然而, Logo 语言 中还有一种有趣的特性:它可以定义新词 。 例如,我们可以这样来 教小海龟(即是对计算机编程)画一个正方形:



40

第三章程序设计

TO SQUARE FORWARD 10 RIGHT 90 FORWARD 10 RIGHT 90 FORWARD 10 RIGHT 90 图 18

FORWARD 10

画 一个 正方形

END 定义了上面 SQUARE 一 词后,小孩只需输入 SQUARE 命令

便能画出一个边长为 10 个单位的正方形。不用说, SQUARE 这个 名字是任意取的,小孩也可把此过程命名为 BOX 或 XYZ ,这并不

影响小海龟画出同样的正方形。小孩发现这一点后,常会"愚弄" 计算机取乐一例如,把画正方形的过程称为 TIANGLE (三角 形),或把画三角形的过程称为 SQUARE (正方形)。 SQUARE­

词一经定义,即属于计算机可理解的词汇,它又可用来定义新词。 例如:

TO WINDOW SQUARE SQUARE SQUARE SQUARE END 所画的各正方形位千不同的

位置,因为每个过程结束时小海龟 都转向了 90 度。用计算机术语来

图 19

-— 41 - —

一 个窗口,由 4 个正方形组成

通灵芯片

说, SQUARE 是 WINOOW 程序中的子程序 。 WINDOW 程序调用 SQUA邸子程序 。 相应地, SQUARE 子程序又是用 FORWARD

和 RIGHT 这些基始单元定义的 。 用户自定义的 Logo 词也可带有

参数,例如,小孩只需设定一个表示边长的参数,便可画出各种大 小不同的正方形。

TO SQUARE : SIZE FORWARD:SIZE RIGHT 90 FORWARD:SIZE RIGHT 90 FORWARD:SIZE RIGHT 90 FORWARD:SIZE END SIZE 前面的冒号是语法上的需要。在 Logo 中,冒号表示其后

紧接的词有特殊意义,它是一个参数名——在这里,是指每次调用 SQUARE 子程序时所提供的 一 个参数值 。 定义了 SQUARE 后,

SQUARE 15 这一命令就是命令计算机画 一 个边长为 15 个单位的 正方形 。 同样,参数名 SIZE 也是任取的,它仅在 SQUARE 内部才 有意义 。 如果那 5 个 SIZE 全部改为 X ,此子程序的功能仍与原先

一样 。 编写画正方形的子程序,还有其他许多方法 。 例如,你也可命 令小海龟向左转 4 次,或向后转 4 次来画 。 有趣的是,如何定义 SQUARE 是无所谓的。要紧的是此子程序画的是什么,以及它何 时放开小海龟。无论 SQUARE 如何定义,无论它是用户自定义的

一个词,还是编程语言中的一个基始单元,别的程序都能调用它 。



42

第三章程序设计

在扩充编程语言方面,程序员可通过功能抽象的方法来构造新的 积木。

学习 Logo 的孩子还会发现一种诀窍,在一词的定义中可插入

该词本身,这称为递归。例如,小孩可设计一个由许多正方形旋转 而成的圆,其程序如下所示 :

TO DESIG N SQUA RE RIGHT 10 DESIG N END 图 20

DESIGN 的执行过程

计算机执行 DESIGN 命令,首先是

画一个正方形,再右转 10 度,以同样的方式执行另一个 DESIGN 。 这里, DESIGN 的递归定义有一缺陷:它会一直递归下去。计算机 每次执行 DESIGN 命令,先画出一个正方形,然后调用另一个 DE

SIGN 过程,如此无休止进行下去一—正如 一 个智者的故事中所传 说的那样,一个智者宣称地球是驮在一个巨龟的背上 。 “那么,巨 龟在什么上面呢?”一弟子心生疑窦,间道。”在另一个巨龟背上,"

智者答道。“那么,这个巨龟又在什么上面呢?"弟子又问道。“不 必问,巨龟驮巨龟,一直驮下去,“智者答道 。 计算机执行 DESIGN 命令的过程,正如人脑想像中无数层巨 龟驮巨龟的情况 一 样。但计算机并不知道它将无休止执行下去。 在被强行终止之前,计算机会永不停息地运行下去一—这个例子 反映计算机程序的 一 种常见的特性,称为无限循环。程序员 一不

小心常会引起无限循环 。 (我们将来会明白)难以预料程序什么时

— 43









候会发生无限循环。但要避免上例中的无限循环并不很难,只要 在所编的程序中加上一个参数,即设定画多少个正方形 。

TO DESIGN:NUMBER SQUARE RIGHT 10 IF:NUMBER=l STOP ELSE DESIGN:NUMBER —1 END

根据上面的定义, DESIGN 子程序将按参数等千 l 还是大于 1 加以执行。 DESIGN 1 的执行只是画一个正方形 。 如果 DESIGN

的参数大千 1 ,比如 DESIGN 5 ,执行的过程是先画 一 个正方形,旋 转,再执行 DESIGN 4 。 DESIGN 4 的执行过程是先画 一 个正方形, 旋转,再执行 DESIGN 3 ,如此不断执行下去,直至执行 DESIGN

1,

即画一个正方形后终止。 .. ,

这类带有可变参数的递归定义可用千产生具有自相似结构的

.



事物。一幅含有自身图象的图象,就是 一 种递归的、具有自相似结 构的例子。这类结构一般称为分形 (fractals) 。 在现实世界中,自

相似的结构不会永远递归下去 。 例如,一棵树的分枝看上去就像 小一点的树,更小的分枝看上去就像更小的树 。 这样经过几层递

归,最终的分枝变得很小,不再具有更小的分枝。下面是一个画树 的 Logo 程序。

TO TREE: SIZE FORWARD:SIZE IF:SIZE