第3章 逻辑控制
Logical Control
除了进行基本运算的能力外,一台计算机必须能够按照一定的序列(或者不如说是按照逻辑模式)来进行运算,以便取得数学问题的解答,这和我们进行笔算的实际目的相同。
除了进行基本运算的能力外,一台计算机必须能够按照一定的序列(或者不如说是按照逻辑模式)来进行运算,以便取得数学问题的解答,这和我们进行笔算的实际目的相同。在传统的模拟计算机中(最典型的是“微分分析机”),计算的“序列”是这样完成的: 它必须具有足够的器官来完成计算所要求的各个基本运算,也就是说,必须具有足够的“差动齿轮”和“积分器”,以便完成这两种基本运算(参阅上文)。
这些圆盘,即计算机的“输入”与“输出”的圆盘,必须互相连接起来(或者,更确切地说,它们的轴必须连接起来),(在早期的模型中,用嵌齿齿轮连接,后来则用电从动装置——自动同步机),以便模拟所需的计算。应该指出,连接的方式是可以按照需要而组装起来的,即随需要解算的问题而定,使用者的意图可以贯彻在机器设计里面。这种“连接”,在早期的机器中用机械的方法(如前述的嵌齿齿轮),后来则用插接的方法(如电连接)。但不管如何,在解题的整个过程中,任何这些形式的连接,都是一种固定的装置。
插入式控制
在一些最新的模拟机中,采用了进一步的办法。它们使用电的“插件的”连接。这些插入式连接实际上被电磁机械继电器所控制;电磁铁使继电器通路或断路,因而产生电的激励,使连接发生变换。这些电激励可以由穿孔纸带所控制;在计算中,在适当瞬间发出的电信号,可以使纸带移动和停止(再移动,再停止……)。
逻辑带的控制
刚才我们所说的控制,就是指计算机中一定的数字器官达到某一预定条件的情况,比如,某一个数开始变为负号,或者是某一个数被另一个数所超过,等等。应当注意,如果数是用旋转圆盘来表示,它是正号或负号,就从圆盘通过零点向左还是向右转动来判定;一个数被另一数超过,则可以从它们的差成为负数而察觉出来,等等。这样,“逻辑”带的控制(或者更恰当地说,一种“与逻辑带控制相结合的计算状态”),是在基本的“固定连接”控制的基础之上的。
数字计算机就是从这些不同的控制系统开始的。但是,在讨论这个问题之前,我还要先对数字计算机作出一般的评述,并评述它和模拟计算机的关系。
每一基本运算只需要一个器官的原理
在开始,必须强调,数字计算机中的每一基本运算,只需要一个器官。这和大多数的模拟机相反。大多数模拟计算机是每一基本运算需要有足够多的器官,需要多少要看待解算的问题的情况而定(前面已经讲过)。但是,应该指出,这只是一个历史的事实而不是模拟机的内在要求。模拟计算机(上面所讲过的电连接方式的模拟机),在原则上,也是能够做到每一基本运算只需要一个器官的,而且它也能够采用下文所讲到的任何数字型的逻辑控制(读者自己不难证明,上面已经讲到的“最新”型的模拟机的控制,已经标志着向运算方式4的转变)。
应该进一步说明,某些数字计算机也会或多或少地脱离了“每一基本运算只需要一个器官”的原则,但是,再作一些比较简单的解释,这些偏离也还是可以被纳入这个正统的方案中的[在某些情况下,这只不过是用适当的相互通信的方法来处理双重机(或三重机)的问题而已]。在这里,我不准备进一步讨论这个问题了。
由此引起的特殊记忆器官的需要
“每一基本运算只需要一个器官”的原则,需要有较大数量的器官才能被动地存储许多数,这些数是计算过程的中间结果或部分结果。也就是说,每一个这种器官,都必须能“存储”一个数(在去掉这器官中前已存储的一个数之后)。它从另外一个当时与它有连接的其他器官,把这个数接受过来;而且当它被“询问”时,它还能够把这个数“复述”出来,送给另外一个此时与它连接的器官。上述的这种器官,叫作“存储寄存器”。这些器官的全体,叫作“记忆”。在一个记忆中存储寄存器的数量,就是这个记忆的“容量”。
我们现在能够进而讨论数字计算机的主要控制方式了。这个讨论,最好从描述两个基本类型入手,并且接着叙述把这些类型结合起来的若干明显的原则。
用“控制序列点”的控制
第一个已被广泛采用的基本控制方法,可以叙述如下(这里已经作了若干简化与理想化):
计算机包括一定数量的逻辑控制器官,叫作“控制序列点”,它具有下面所讲的功能(这些控制序列点的数量相当可观,在某些较新型的计算机中,可以达到几百个)。
在采用这一种系统时,最简单的方式是: 每一个控制序列点连接到一个基本运算器官上,这个运算器官受它所驱动。它还连接到若干存储寄存器上,这些寄存器供给运算的数字输入;同时,又接到另一寄存器上,这个寄存器接受它的输出。经过一定时间的延滞(延滞时间必须足以完成运算),或者在接收到一个“运算已完成”的信号之后,这个控制序列点就驱动下一个控制序列点,即它的“承接者”(如果运算时间是变量,它的最大值为不定值或者是不能允许的漫长的话,那么,这个过程当然就需要有与这个基本运算器官的另一个增添连接)。按照这样的连接,以相同的办法一直作用下去。一直到不需要再操作为止,这就构成了一个无条件的、不重复的计算方式。
如果某些控制序列点连接到两个“承接者”上面(这叫作“分支点”),那么,就可能产生两种状态——A和B,从而得到更错综复杂的方式。A状态使过程沿第一个承接者的途径继续下去,B状态则使过程沿第二个承接者的途径继续下去。这个控制序列点,在正常时,是处在A状态的,但由于它接到两个存储寄存器上面,其中的某些情况会使过程从A变为B,或者反过来,从B变为A。比如: 如果在第一个存储寄存器中出现负号,那就使过程从A转变到B;如果在第二个存储寄存器中出现负号,那就使过程从B转变到A(注意: 存储寄存器除了存储数字之外,它还存储数字的正号或负号,因为这是任一两值符号的前置符号)。现在,就出现了各种可能性: 这两个承接者可表示计算的两个析取分支。走哪个分支,取决于适当预定的数字判据(当“从B到A”是用来恢复进行一项新演算的原始状态时,则控制“从A到B”)。这两个待选择的分支也可能在后来重新统一起来,汇合到与下一个共同的承接者的连接上面。但是,还有一个可能性: 两个分支之一,比如是被A所控制的那一个,实际上又引回到起初我们所说的那个控制序列点上(就是在这点上分为两分支的),在这种情况下,我们就遇到一个重复的过程。它一直迭代到发生一定的数字判据为止(这个判据就是从A转变到B的指令)。当然,这是一种基本的迭代过程。所有这些方法,都是可以互相结合和重叠的。
在这种情况下,正如已经讲过的模拟机的插入式控制一样,电连接的整体,是按照问题的结构而定的,即按照要解算的问题的算式而定,也就是依照使用者的目的而定。因此,这也是一种插入式的控制。在这种方式中,插接的模式可随解算问题的不同而变化,但是,在解算一个问题的全部过程中,插入方式是固定的(至少在最简单的装置中是如此)。
这个方法,可以从许多途径使它更精细起来。每一个控制序列点可以和好几个器官连接,可以激励起超过一次以上的运算。正如在上面讲过的模拟机的例子一样,这种插入连接实际上可以由电磁机械继电器去控制,而继电器又可通过纸带来控制,在计算中所产生的电信号,使纸带移动。我在这里,就不进一步叙述这种方式所可能产生的各种变化了。
记忆存储控制
第二种基本的控制方法,是记忆存储控制,它的进展很快,已经将要取代第一种方法了。这个方法可以叙述如下(这也还是作了若干简化了的)。
这种控制方式,在形式上和插入控制方法有若干相似之处。但是,控制序列点现在由“指令”所代替了。就体现在这种方式中的大多数情况来说,一个“指令”,在物理意义上是和一个数相同的(指计算机所处理的数,参阅上文)。在一个十进制计算机中,它就是一序列十进制数字(在我们第二章中所举的例子里,它就是12个带有或不带有正号、负号的十进制数字。有时,在标准的数的位置中,包含着一个以上的指令,但这种情况这里不必讨论)。
一个指令,必须指出要执行的是哪一种基本运算,这个运算的输入将从哪一个记忆寄存器中取得,运算后的输出要送到哪一个记忆寄存器去。要注意,我们已预先假定,所有的记忆寄存器的编号是成系列的,每一记忆寄存器的编号数目,叫作它的“地址”。同时,给各个基本运算编上号码,也是很便当的。这样,一个指令,只要简单地包括运算的编号和记忆寄存器的地址就成了,它表现为一列十进制数字(而且它的顺序是固定的)。
这种方式,还有一些变种。但是,在目前的叙述中,它们并不特别重要。比如,一个指令,用上面讲过的方法,也可以控制一个以上的运算;也可以指示它所包含的地址,在进入运算过程之前,以某一特定方法加以修改(通常运用的、实际上也是最重要的修改地址的方法,是对各个地址增加一个特定的记忆寄存器)。或者也可以用另外一些方法。如用特别的指令来控制这种修改,或者使一个指令只受上述各个操作中的某一组成部分的影响。
指令的更重要的方面是: 如上面讲过的控制序列点的例子一样,一个指令必须决定它的承接者——是否有分支(参阅上文)。我曾指出过,一个指令通常在物理意义上是和一个数相同的。因此,存储指令的自然方法(在所控制的解题过程中),是把它存储在记忆寄存器里。换句话说,每一指令都存储在记忆中,即在一个规定的记忆寄存器中,也就是在一个确定的地址中。这样,就给我们对指令承接者的处理,提出了许多条特定的途径。因此,我们可以规定,如果一个指令的地址在X ,其承接者的指令地址则在X+1(除非指明是逆接的情况)。这里说的“逆接”,是一种“转移”,它是一种指明承接者在预定地址Y的特殊指令。或者,一个指令中也可以包括“转移”的子句,以规定它的承接者的地址。至于“分支”,可以很方便地被一个“有条件的转移”指令所掌握。这种有条件的转移指令,规定承接者的地址是X或Y。是X,还是Y? 取决于一定的数字条件是否出现——也就是说,一个给定地址Z的数字,是不是负数。这样的一种指令,必须包含着一个编号,作为这种特殊形式指令的特征(这个特别的数字符号,它在指令中所占的位置,以及它的作用,和上面讲过的标志基本运算的符号是一样的),而且地址X、Y、Z都表现为一序列的十进制数字(见上文所述)。
应该注意本节所讲的控制方式和上文讲过的插入式控制的重要区别: 插入控制序列点是真实的、物质的对象,它们的插件连接表达了要计算的问题。本节所讲的这种控制的指令,则是一种概念上的东西,它储存在记忆中;记忆中的这一特定部分,表达了要计算的问题。由于这样,这种控制方式被称为“记忆存储控制”。
记忆存储控制的运算方式
在上述情况下,由于进行全部控制的各项指令都在记忆中,因而能够取得比以往任何控制方式更高的灵活性。计算机在指令的控制下,能够从记忆中取出数(或指令),对它进行加工(好像数的运算一般),然后把它归还到记忆中去(回到它原来的或其他的位置上)。这也就是说,这种方式能够改变记忆的内容——这就是正常的运算方式。特别是它能够改变指令(因为指令存在记忆里),改变控制它自己的动作的有关指令,所以,建立所有各种复杂的指令系统都是可能的。在系统中,可以相继地改变指令,整个计算过程在这样的控制之下进行。因此,比仅仅是重复过程复杂得多的系统,都是可能办得到的。虽然这种方法十分勉强和十分复杂,它仍然被广泛采用了,而且在现代的机械计算——或者更恰当地说,在计算程序——的实践中,具有非常重要的作用。
当然,指令系统——它意味着要解出的问题和使用者的意图——是通过把指令“装放”进记忆里去的办法来同计算机互通信息。这通常是由预先准备好的纸带、磁带或其他相类似的媒介来完成的。
控制的混合方式
上面讲过的两种控制——插入式和记忆存储式,可以形成各种不同的组合。关于这方面,还可以说几句。
考虑一台插入控制的计算机,如果它具有和记忆存储控制计算机所具有的那种记忆部分,它就可能用一序列数字(以适当的长度)来描述它的插接的全部状态。这个序列存储在记忆中,大体上占有几个数码的位置,即几个顺序的记忆存储器。换句话说,它可以从若干个顺序的地址中找到这个序列,其中头一个地址,可以作为这一串地址的缩写,代表整个序列。记忆部分可以负载几个这样的序列,表示几个不同的插接方案。
此外,计算机也可能是完全的记忆存储的控制方式。但除这种系统的本来有的指令外(参见上述),还可以有下列三种形式的指示。第一,一种使插接件复位的指令,根据在规定的记忆地址中存储的数字序列,使插接件复位。第二,一种指令的系统,能够改变各插接件中的某一定的单项(请注意,上面这两种指令,都要求插入件必须受电控制装置——如继电器,或真空管,或铁磁芯等的作用)。第三,一种指令,能够使控制方式从记忆存储式转为插入式。
当然,插入式方案还必须能够指定记忆存储控制(它可预设为一规定的地址)作为一个控制序列点的承接者(如果在分支的情况下,则作为承接者之一)。