存储符号中的虚拟与现实
2018-05-02陈凯
陈凯
找不同游戏中的符号变化
先来玩一个找不同的游戏,看看图1中哪个人的坐姿与众不同?这实在是太容易了,当然是第四个人啊。然而稍微增加一点规则,游戏就变得有点意思了,考虑这样的假设:每个人的坐姿都代表着一种含义,如果坐在我西面的那个人和我的方向一致,那么我就面向西坐(左西右东),如果坐在我西面的那个人和我的方向不一致,那么我就面向东坐。至于最西面的第一个人,他就假装把最东面的那个人看成是坐在他西面的人。现在的问题是,哪个人的朝向是错误的?
按这样的规则,可以发现,从西往东数,第一个到第四个人都坐得妥妥当当的,就算是第四个人,他的坐姿也恰好没有问题,比较纠结的是第五个人,他的朝向与他西面的人的朝向不同,所以按规则,他就必须改变自己的坐姿,把脸朝向东,不过若他真的这样做了,就会发现,他的朝向就和坐在他西面那位保持一致了,于是他只有再把座位转回来,然而这样就没完没了啦。真是左右为难啊!
为避免出现这样矛盾的情况,需要引入一个指挥者,指挥者从左到右逐个询问坐着的人是否要改变坐姿,指挥者走到最东面后,他就重新回到西面第一个人开始指挥,坐着的人无论是变还是不变,只有当指挥者指挥到自己时才能做一次决定。可以看出,第一个人到第四个人的决定都是保持不动,第五个人根据规则改变了朝向,从面向西改作面向东了(如图2)。
然后,第六个人发现自己也必须要改变朝向了(如图3)。
很快一个圈子兜了下来,到第十一步的时候,已经兜回到第三个人了,他也改变了朝向,总算大家坐姿一样了(如图4)。
也许感觉一切都要结束了,所有人都妥妥地面朝东坐着了,让强迫症患者感觉要崩溃的是,当指挥到第十二步时,第四个坐着的人发现,坐在他西面的人的朝向和他自己的朝向一致,所以他只好由面向东改为面向西(如图5)。
看上去正好和初始时的状态完全颠倒了一下,莫非再继续变化一轮,大家的坐姿就能变回初始状态吗?这种想法实在是太简单、太天真了,其实复杂的变化才刚刚开始,想要知道其后变化过程的朋友,可以继续演算一下,或者编写一个小程序模拟一下。
机器里的符号变化
刚才游戏中的符号变化,其实可以做一台机器来实现,这里笔者并不打算用程序代码,而是要使用电子元件来模拟出整个变化过程。需要的元件是一个存储器、一个异或门、一个计数器、一个触发器和一个时钟发生器。其中,异或门、计数器和触发器可以用三极管来搭建,当然实际上人们往往会使用封装好的集成电路芯片,时钟发生器可以使用轻触开关来模拟,实际电路中可能需要电容和稳压二极管,至于存储器,虽然可以用场效应管、电容等元件来组装,但因为结构太复杂,一般也是直接使用封装好的芯片。为了方便解释,这里给出整个系统的逻辑电路图,电路图是用开源的Logisim软件绘制的。图6中1号元件是时钟发生器,在Logisim软件中,用鼠标点两下时钟发生器,就会产生一个完整的脉冲信号;2号元件是一个触发器,触发器里存储的是上一次异或门运算的结果,默认初始值为“0”;3号元件是异或门,作用是当两个输入的二进制信号不相等时,输出信号“1”,否则输出“0”;4号元件是计数器,将它的“Data bits”参数设置为“4”,就会随时钟发生器的脉冲,从0计数到15,然后再从头开始;5号元件是存储器,将它的“Address Bit Width”设置为“4”,里面就能存储16个二进制数,存储器左侧的D端口可以输入数据,右侧的D端口可以输出数据,对应游戏看,其实是表示了十六个人的坐姿的朝向,朝向西为“0”,朝向东为“1”。
这张电路图把先前文字层面的游戏规则给实物化了,时钟发生器和计数器起到了指挥的作用,异或门的作用是将存储器中的当前的数据和前一次异或运算的结果再进行异或运算,然后把新得到的数据存储到存储器中,这对应着游戏中坐姿朝向变化的过程。
就算弄不明白电路运行的原理,在Logisim中直接照着画一下也不需要太长时间。然后运行Logisim电路模拟器,用鼠标不断点击时钟发生器让整个系统工作起来,在运行了16步也就是点击了32次鼠标之后,存储器里的数据变成了如图7所示的样子。
有人会问,既然可以编写程序解决游戏中的坐姿朝向问题,为什么还要专门来搭建一个电路呢?当然不只是为了好玩,实际上,这个电路就是一个完整的计算机。时钟发生器模拟了计算机中时钟频率的作用;触发器就是寄存器,注意不是模拟,因为日常计算机中的寄存器就是用触发器实现的,当然,日常使用的计算机中的寄存器要多得多;异或门是运算部件,日常计算机中的运算部件包含的逻辑门当然要多很多;这张电路图中的存储器的逻辑结构也和日常计算机中的存储器的逻辑结构相同,为简化问题,这里只用一个单纯做加法的计数器来寻址。有兴趣的读者可以照此电路图亲手制造出一台迷你计算机。
符号变化与现实问题的对应
虽然可以将这台机器称为坐姿朝向游戏模拟机,但这台小计算机的作用不限于此,它也可以对应其他实际用途。例如,可以用做奇偶校验。假设存储器前8位作为输入,后8位作为输出,那么在前8位中,“1”的个数是奇数还是偶数,会使得后8位数据发生有趣的变化。
假设初始状态时,前8位中有两个“1”,即偶数个“1”,后8位数据预先清0(如图8),运行一轮结束后,可观察到后8位数存储数据不变,表示检查结果为偶数个“1”(如图9)。
假设初始状态时,前8位中有三个“1”,即奇数个“1”(如图10),运行一轮结束后,可观察到后8位数都变成了“1”,表示检查结果为奇数个“1”(如图11)。
除了用作奇偶校验,这台小计算机还会画复杂的图画,假设初始状态全是“1”,不停运行后,存储器中的数据会按过程发生如下变化:
把数据中的0替换成空格,把1替换成字符“V”,就能看得非常清楚了,这就是叫作谢尔宾斯基三角形的分形图案(如图12)。
所以说,这台小计算机既是坐姿变化游戏的模拟器,又是奇偶校验器,还可以是谢尔宾斯基三角形绘图仪,或者也可以单纯用于烘托气氛的LED闪烁控制。这个系统究竟起什么样的作用,取决于使用者如何诠释符号以及符号变化的意义。
不过,这里有一个颇为麻烦的情况,这台小计算机虽然能做一些小事情,但它的能力十分有限,要扩充它的能力,就需要改变电路图,增加逻辑门元件和存储器容量。例如,可以通过增加存储器和逻辑门实现一个简单却又较难破译的加密装置(如图13)。
这个小装置能够把用户输入的ASCII码进行加密,如输入的是“GO”的ASCII码(如图14),加密后,输出的密码就是如图15所示的样子。并且因为加密的秘钥自身也在变化,所以下一轮如果仍然要加密“GO”这两个字母,生成的密码和第一次是不同的。基本的加密思路和历史上著名的Enigma是类似的。
最后要给出一个奇妙的问题:如文中案例所示,当人们增加计算步骤或改变计算过程的时候,就需要改变计算装置的电路结构,如增加逻辑门元件或存储器的数量,并改变它们的连接方式。那么是不是存在某种结构的电路,当人们的计算需求发生变化后,并不需要增减电子元件及改变电路结构,也能照样进行计算呢?乍一想似乎不可思议,但问题的答案是肯定的。早在上世纪三四十年代,数学家阿隆佐·邱奇和艾伦·图灵就指出,存在这样一种机器,不需要改变逻辑运算部件的结构,只要提供容量足够大的存储器,就能满足人们不同的计算需求了。艾伦·图灵还给出了具体的方法,说明应该如何把这样的机器建造出来。后来人们将图灵设想的这种机器称为通用计算机。图灵被称为计算机之父,实在是当之无愧。艾伦·图灵提出的建造方法究竟是怎样的呢?这可不是本文这点篇幅能够说清楚的,然而实现的关键思路却简单扼要:第一,人们需要进行的运算过程都可以对应一系列的符号变化过程;第二,用来实现符号变化的机器自己的变化,也可以对应一系列的符号变化过程。如果讀者能真正领会这两句话的深刻内涵,那么只要对文章中的电路稍微做些改造,就能造出一台真正的通用计算机来了。