第二类基本的控制方法,是“指令”的控制。这也是现代计算机最熟悉的控制方法了。这种方法似乎和前一种也非常的类似,前一种是有很多控制点,这些控制点来完成逻辑控制。而这里控制逻辑走向的是指令。
从严格意义上来讲,指令也是数。就是说,指令实际也被编码成了数。它必须包含如下几个方面:
1)运算编号:每一种基本运算,要赋予一个编号,这样就能识别出这条指令到底要干什么;
2)记忆寄存器的地址:所有的记忆寄存器,为了方便调用,一定是要做编号的,这个编号也叫作地址。指令需要从记忆寄存器里读取数据,运算后还要将结果写入记忆寄存器,这就需要在指令里包含记忆寄存器的地址;
在这里,也能有一些变通的实现方式,实现一条指令执行多次运算,或者在指令执行前对记忆寄存器里的值进行更新(怎么看起来像是循环经常干的事)。要实现这样的方式,则可以通过另一条特殊指令来进行控制。
指令的另一个重要的方面,是同前面所说过的序列控制点一样,能够控制分支。我们可以看一下,指令如何在执行完跳转到下一条指令的。在这块的描述,冯诺依曼其实挺绕的,不过我大概get到了他的意思。
1)顺序执行,即如果没有任何干涉的情况下,可以以类似地址+1的方式读出下一条指令的地址,然后执行;
2)逆接执行,即明确好一条指令执行完跳转到哪个承接者,然后执行;
3)转移子句:在指令里带有转移子句,说明可以跳转到哪个承接者;这条描述其实跟上一条有点像,我的理解是上一条是不用子句定义的而是已经规范好了跳转到哪里(有点像自动回调?),而这一条更像是goto;
4)类if分支(这是我喊的,冯老可没这么说):特殊指令判断寄存器里的值,通过一定的判断决定是去执行X还是执行Y,从而形成了类似于现在的“if语句”的效果;
指令控制方式,和插入式控制方式,还是有一定的区别的。区别是:
1)插入控制点是真实的、物质的,也就是说插入控制点是一种物理上、能真实感知的实现,如继电器这样的控制;
2)指令控制,是概念上的,实际就是存储在记忆存储器中的一组数字,表达了要计算的问题;这种控制方式,叫做“记忆存储控制”;
是不是跟模拟与数字实现有点像?不过不代表插入控制点就一定要是模拟的。
记忆存储控制的方式,灵活度以及系统能够达到的复杂度,会比前面的方式更好。这是因为记忆存储控制中,无论是指令、还是数据,都存储在记忆中,并且无论是数据还是指令,都可以被变更,因此就可以搭建起远比重复运算来的更复杂更灵活的系统。现代计算机也是走这条路的,甚至于在机器层面操作指令的基础上又做了多层封装,如汇编语言调用(不再需要用数字指令来调用),再到高级语言,方便了人们的使用。现在的“指令”,已经上升到了“语言”的层面,我们不需要更最底层的寄存器等直接打交道,而是只要从业务层面考虑逻辑搭建即可。
在这里,冯诺依曼也提到了如何把指令装进“记忆”。由于时代局限性,他提到了纸带、磁带,也提到了“其他相类似的媒介”;比尔盖茨还是玩纸带的年代走过来的呢,我已经算是幸运了,不过也玩过现在大家没有玩过的三英寸五英寸磁盘(很容易坏,得经常做修复),那个时候一张磁盘容量才1.44M,我们现在一个U盘随便都是几十个G,一个移动硬盘都上T了。
控制也可以存在混合方式。也就是说,插入式可以影响到记忆存储器的指令,如有一一对应关系,可触发;反之亦然,这个时候就需要记忆存储控制可以分支跳转到控制序列点的承接者。类似于电脑复位的操作,是不是就是这样的一种实现呢?我想差不多是这样的吧。