• 精选
  • 会员

计算机施展魔法的7个秘密

2021年10月25日  来源:直觉泵和其他思考工具 作者:[美] 丹尼尔·丹尼特 提供人:zhaotou97......

秘密1

发挥能力,无需理解力:有些东西——如一台寄存器机——它能完成精密的运算,但无需理解自己在做什么。

寄存器机没有头脑,因而它不能理解。但因为一碰上增量、减量、停这三条“指令”,它就会老老实实地执行,所以我们也有理由说,寄存器机是近似于明白这三件事情的。不过这三条指令不是真正的指令——它们只对于我们来说像是指令,但对于寄存器机,它们只是近似于指令而已。

也许你已经看到,减量跳转分支对寄存器机起着至关重要的作用。正是这个指令让计算机(近似)“注意”到了这个世界,继而它开始用这些注意到的事情指导自己之后的“行为”。其实这种条件跳转分支对所有存储程序计算机都是至关重要的。埃达·洛夫莱斯(Ada Lovelace)早在19世纪就认识到了这一点,这从她关于查尔斯·巴贝奇(Charles Babbage)的分析机的精彩论证中就可以看出。而分析机正是所有现代计算机的原型。(41)

其实,只要掌握一定的诀窍,组合这些程序就会变得轻车熟路。更何况,运算程序一经写成便可以多次重复地使用。现在,我们对各个运算程序进行编号,运算0是相加,1为相减,2是相乘,以此类推。复制可以是运算5,移位是6,等等。随后,当我们再次使用寄存器机时,就完全可以用数字来发号施令了。

练习4(可选)

写出一个流程图及它的RAP程序,用来将寄存器机转变成一台便携式计算器。

a.寄存器2用来执行运算:

0=相加

1=相减

2=相乘

3=相除

b.在寄存器1和3中放入参与运算的数据。

那么“306”就表示“3 + 6”,“513”表示“5 - 3”,“425”表示“4×5”,“933”表示“9÷3”。然后,我们用寄存器4、5、6、7来显示操作结果:寄存器4用于表示符号,其中0代表+,1代表-;寄存器5显示答案的数值;寄存器6用于存放除法结果的余数;寄存器7表示警示,即对输入的内容进行报错,例如除数为0,或者寄存器2中出现了没有定义的操作的情况。

在这个例子中,寄存器中的内容(其中的数字)起到了四种不同的作用:表示一个数字,表示一种算数运算,表示数字的正负号,还有充当报错旗帜。

秘密2

寄存器中的数字会代表什么取决于我们所编写的是什么样的程序。

利用已经创造出的构造模块,我们可以建造出更厉害的操作程序。所以,只要有信心,我们就能写出一个程序并画出它们的流程图,例如:计算出寄存器7中数值的平方;或者是,算出从寄存器1到寄存器20这20个数字的平均数;或者,分解寄存器6中的整数,如果5是其中的一个因数,就在寄存器5中放入一个1;或者是比较寄存器3和4中数值的大小,将较大的内容放入到寄存器5中,但假如它正好大出一倍,就用寄存器7示警。

我们可以写出一个程序,它能检索100个寄存器,找出具有特定内容的那个,并把所在寄存器的地址写入寄存器101中。这是怎么做到的呢?先将那个特定的数字存入寄存器102,然后将它复制一份存入寄存器103。清零101,然后从寄存器1开始与寄存器103中的数字进行减法运算,被减数是寄存器103中的数字,但每次减量前都首先要在寄存器101中增量记录一次。需要找到的是减去特定数字后结果是0的那个寄存器。不是寄存器1就继而再检测寄存器2,以此类推,直到检验出相减结果为0的那个寄存器,这时减法运算停止,该寄存器地址也正好写入了寄存器101。在减量运算时,寄存器能及时“注意到”0的出现,正是这种基本的“感知力”使我们得以将寄存器机的“目光”转向它自身,让它也尝试检测自己的寄存器单元:来回移动其中的内容,在需要的地方切换操作,等等。

秘密3

寄存器中的数字可以表示任何事物,这说明,寄存器原则上也可以处理任何事物,它们可以“识别”所有用数字(包括用一个数字或是用一系列数字)表示的图案或特征。

举个例子,一个大型寄存器库就可以是一张黑白图片(任何黑白图片,例如这一页书的照片),每个寄存器都占一个像素,内容为0时显示为白点,为1时显示为黑点。现在,请书写这样一个程序:可以从成千上万的图片中搜索出一张白底上画有一条黑色水平直线的图片。先不要着急去做。生命很短暂,请先详细地考虑一下,要完成这项任务会遭遇到哪些困难和费事繁琐的步骤。通过想象,如果你真的设计出了水平线识别器、垂直线识别器或者半圆形识别器,那么,再请思考一下该如何将它们与另外几个有用的识别器融合起来去鉴别出一个大写的A,包括它成百上千种的字体。光学字符识别(OCR)软件可以通过扫描,把页面上的图形非常准确地转换成一个计算机文本文件,这无疑是近代计算机程序的一次胜利。其中,每个字母或者数字符号都由一个美国信息交换标准码(ASCII)中的数字表示,所以我们可以搜索文本,还可以完成那些神奇的文字处理工作。利用的不是别的,就只是算术。那么OCR真的可以读懂些什么吗?不然。它并不理解摆在它面前的东西,它只是近似在读录。但对于我们那收纳丰富、装满了可动部件的工具箱来说,这无疑也是件不错的工具。

秘密4

既然一个数字可以表示任何事物,那么它就一定能表示一条指令或是一个地址。

寄存器中的数字可以表示指令,例如增量、减量、移动或者搜索;也可以表示地址,即寄存器在计算机里的地址。所以,我们可以用一连串的寄存器来存储一整套指令。现在,我们有一个主程序:程序A,它让机器通过一个一个地执行寄存器中的指令来完成要求的任务,然后我们可以在这些寄存器中存入另一个程序B。在我让机器运行程序A的时候,它首先要做的事情是去访问这些寄存器,而这些寄存器发出的是程序B的指令,机器随即执行。我想要指出的是,其实我们可以在寄存器机中央处理机中的一组寄存器中一劳永逸地保存下程序A,使其成为烙印在只读存储器上的“固件”,然后再利用它去运行程序B、C、D,等等。正是因为在寄存器机中设置了这个程序A,我们便把寄存器变成了一台存储程序计算机。

有了程序A,寄存器机才能忠实地执行我们通过数字输入寄存器的各项指令。寄存器机所运行的每一个程序都是由一连串数字组成的,它们顺次排列,程序A会依次访问它们,完成每个数字指定的任务。如果我们设置一套系统使这些指令互不混淆,比如,给每一条指令都以两位数字来命名(或任何相同位数的数字),那么我们就可以将构成程序B的一系列指令,例如,

86,92,84,29,08,50,28,54,90,28,54,90

改写成下面这一大串长数:

869284290850285490285490

这一长串数字既是程序B特有的“名称”,也是程序B本身,它需要通过程序A一步一步完成执行。这里是另外一个程序:

28457029759028752907548927490275424850928428540423

另外还有:

8908296472490284952498856743390438503882459802854544254789653985

比较有趣的程序常常会有更长的名称,由成千上万个数字构成。你笔记本电脑里的那些程序,比如文字处理软件或者浏览器,就是由如此长串的数字写成的,通常由几百万个二进制数字构成。10兆大的一个程序写出来基本就是800万个0和1构成的一长串数字。

秘密5

所有可行的程序都能由一个单独的数字指代,都可以被看作是一串指令,等待通用万能机去执行。

杰出的理论家、哲学家阿兰·图灵想出的是另一种简单的假想机。它在被分成一个一个小方格的纸带上来来回回、嘎嘎作响,根据磁头在当前小方格中读到的数字,即0或者1来决定自己的动作(啊哈,这就是条件分支)。图灵机的工作就是轻轻地敲出比特(清除0把它改写为1,或者相反)或者保持比特不变,然后将纸带向左或者向右移动一个方格,进入下一指令。你可能会认为,仅靠一次移动一小方格,用二进制数字0和1而不是自然数0、1、2、3、4、5等来编写图灵机相加、相减程序或者运行其他功能,这听起来,比我们之前寄存器机的练习还要让人头疼,但事实上,两者的运行原理完全一致。带有程序A的图灵机就是通用图灵机,它可以从纸带上“读取”程序B,并利用纸带上任意位置的数据或输入来执行程序B。我们可以把王浩的寄存器机执行程序的过程分解为数字演算和按条件跳转,图灵的图灵机也是如此。两种机器都有着很强的提取程序数字名称并执行它的能力。我们要建造的是一个自带程序A的多用途通用机,而不是建造成千上万个固定不同功能的计算机器,让它们分别去执行各自复杂的任务。对于这台通用机,我们只要喂食各种程序(软件)它就能按要求办事,这就是虚拟计算机。

换句话说,通用图灵机就是一部通用拟态机。尽管名气稍逊,我们的通用寄存器机也是如此。你的笔记本电脑也如此。笔记本电脑能做的事情通用寄存器机也一样能做,反之亦然。但是先别大惊小怪,我并没有说两者有相同的运行速度。我们已经看出,寄存器机在处理某些问题时极其缓慢,例如在进行除法运算时,它需要很费劲地一遍一遍地做减法,我的天哪!就没有什么方法来提速吗?当然有。事实上,自图灵机出现以来计算机的整个发展进程,专家们所做的一切就是要让寄存器机能做的一切工作变得高效起来,其他别无所求。

秘密6

自图灵的假想纸带机之后,计算机所有方面的改善,提高的都只是运算速度。

例如,冯·诺依曼为第一台严格意义上的可操作计算机所设计的那种架构就是为了提高机器的运算速度。他拓宽了交流窗口,让图灵机的磁头从一次只读取1比特变成了一次读取多比特。早先的一些计算机可以读取8比特或者16比特的“字”,有时甚至还可以读取12比特的字。而今天,一次读取32比特已经司空见惯,虽然这也成为了一个瓶颈(即所谓的冯·诺依曼瓶颈),但与当年的图灵机瓶颈相比,它还是宽多了。简单说来,字会从存储器复制到特定的寄存器(指令寄存器)中,一次复制一个,在那里再接受读录和执行。每个字通常由两部分构成:操作码和地址。前者如相加、相乘、移动、比较、遇零则跳转,后者则告诉计算机所要操作的内容在哪一个寄存器。所以,10101110 11101010101就表示,对地址为11101010101寄存器中的内容执行10101110操作,运算结果会显示在一个叫作累加器的特殊寄存器里。

寄存器机与冯·诺依曼机之间存在着一个巨大的差异:在寄存器机上,你可以在它的任何一个寄存器中进行操作,当然,只能进行增量和减量运算;而在冯·诺依曼机上,所有的算术操作都是在累加器中实现的,寄存器只负责存放复制、移动或者储存过来的内容以构成内存。硬连线可以单独完成各自的基本操作,这能省掉很多额外的移动和复制步骤。也就是说,有专门的电子路线负责加法,也有专门的电子路线负责减法,还有的负责遇零则跳转等等。操作码很像是区号或者邮编:指令要送到正确的地方才能执行。软件和硬件就这样相遇了。

今天的实体计算机中会有多少种原始操作呢?几百或者上千个?或者回归了旧时的美好,成了一台精简指令集计算机(Reduced Instruction Set Computer,即RISC),运作的几乎全是原始操作,但条件是,它们必须得以闪电般的速度运行。要想单纯用增量和减量指令去替代相加硬连线,并在速度上领先,条件是:对于运行步骤小于一百万步的加法运算,增量和减量指令的运行速度要比相加硬连线的运行速度快一百万倍。

那今天的实体计算机中有多少个寄存器呢?数百万甚至数十亿个,但它们每一个容量是有限的,因此那些巨大的数字需要分散储存到许多寄存器中。一个字节是8比特,如果你电脑上有64兆字节的随机存取存储器(RAM),那么你就会有1 600万个32比特的寄存器或者是其他规格的等量物。我们已经知道,寄存器中的数字能代表的并不止是正整数。像π、还有1/3这样的实数是由“浮点”系统来保存的,它将数字拆分为底数和指数两部分,就像科学记数法那样(“1.495×1041”),使计算机除了运算自然数以外还可以近似运算其他数值。浮点运算是以浮点数作为数值的算术运算,突出运用在乘法和除法中。20年前(这一章首版时),我们能买到的最快的超级计算机每秒钟可以完成超过400万次的浮点运算。

如果你还想要更快的速度,可以尝试将多台机器并行的方法,让它们在同一时间一起工作,而不是一个做完再交代给下一个做的串行式。并行机能做的事情与串行机大致相同,只是在速度上,它会略胜一筹。事实上,在过去的20年中,专家们一直都在致力于研究的并行机,大多是在标准的非并行冯·诺依曼机上实现的虚拟机。专用并行硬件开发出来以后,计算机专家们一面要忙着测算拓宽冯·诺依曼瓶颈所需的成本与最终获益,一面又要想方设法地提高数据传输速度,不惜调用协同处理器、高速缓冲存储器以及各种各样其他的途径。今天,日本富士通公司的超级计算机K-computer已经可以运行实现每秒超过一亿亿次的浮点运算。

这个速度基本上要与你大脑的即时运算速度旗鼓相当了。你的大脑是一台最卓越的并行处理机,包含着大约一千亿个神经元,每个神经元都相当于一个复杂的微型行动者,有着各自的行动规划。视觉“神经”有数百万神经元宽度的通道,单凭自己就可以把眼睛看到的视觉信息传入到你的大脑里。但神经元运行起来比计算机电路慢得多了,一个神经元在几毫秒(一毫秒是千分之一秒,不是百万分之一,更不是十亿分之一)之内可以转换状态并发送一次脉冲(可能是它们的增量或减量指令),而计算机使二进制数字移动的速度几乎接近光速。所以说,让机器更快速运转的一个至关重要的方法是要将它们做得更小。光走一尺大致需要十亿分之一秒的时间,如果你想让两个程序之间的通讯比之前更快,那就让它们离得更近些吧。

秘密7

没有再多的秘密了!

也许计算机最美妙的地方就是,它由各部分(操作)简单地组合而成,而各部分本身也很简单地组合,简单到没有什么地方是无法给出解释的。这里没有仙气,没有“形态共振”(morphic resonance),没有无形的力场,没有未知的物理定律,也没有那些神奇的组织。要知道,即使你用计算机成功地模拟出一些情景,完成这一切的也只是一些算术运算而已。

目前流行的量子计算机是什么呢?量子计算机能做普通计算机不能做的事情吗?算是,但也不完全。得益于微妙而奇特的“量子叠加”态,那些不被观测的物质能够同时处于“所有可能的”量子态上,直到观测导致“波包塌缩”。这个性质使量子计算机可以同时计算大量数值,解决诸多问题。(要想了解更多,请查阅你最喜爱的那些物理科普书籍或网站。)基本上,在计算机的提速进程中,量子计算机的发明是最新一次的重大变革,可以说,在提高计算机的处理速度上,它实现了一次巨大的突破。图灵机沿着它的纸带喳喳作响,寄存器机奔波于各个寄存器之间不停地增量减量,但时间紧迫,在几分钟、几个小时或者几天内,它们能做的工作也总是显得那么有限。日本富士通公司的超级计算机K-computer数万亿倍地加快了运行速度,但还是不能解决所有的问题,这在密码学中体现得尤为突出。量子计算机本该弥补这部分的缺陷,只可惜,我们还没有克服工程上的诸多难题,没有让它变得更加稳定、更加实用。就目前来看,每秒钟运行一千万亿次的浮点计算就已经是天方夜谭了。

如涉及版权,请著作权人与本网站联系,删除或支付费用事宜。

0000