计算机中的自我复制

71 阅读5分钟

书名:复杂(第一推动丛书·综合系列) 作者:梅拉妮·米歇尔 译者:唐璐 出版社:湖南科学技术出版社 出版时间:2018-01-01 ISBN:9787535794369


第8章 自我复制的计算机程序

  • 生命是什么
  • 计算机中的自我复制
  • 自我复制程序的深层意义
  • DNA的自我复制
  • 冯·诺依曼的自复制自动机
  • 冯·诺依曼

二、计算机中的自我复制

  • 自我复制的观点非常数学化: 它认为计算机中的自我复制会导致无穷反复。

1、计算机自我复制问题最简单的形式

  • 首先从程序的名字开始:
 program copy
  • 然后加一条指令将程序的名字打印出来:
        program copy
        print(“program copy”)
  • 现在增加二条指令将第二行、第三行打印出来:
        program copy
        print(“program copy”)
        print(“print(“program copy”)”)
        print(“print(“print(“program copy”)”)”)

现在你可能已经看出来,这种策略——每条指令输出上一条指令的拷贝——是如何导致无穷反复的。

2、怎样才能避免无穷反复

  • 怎样才能避免这种情况呢? 这个看似简单的问题其实关系到第4章介绍过的哥德尔和图灵的工作。 解决方法同时也包含了生物系统本身绕开无穷反复的基本途径。 20世纪匈牙利数学家冯·诺依曼在研究一个更复杂的问题时,首先发现了这个问题的答案。

3、冯·诺依曼的成就

  • 冯·诺依曼是量子力学、经济学等多个领域的先驱,也是最早设计电子计算机的人之一。
  • 他的设计中包含中央处理单元和可以存储程序和数据的随机存取存储器。 这些至今仍然是现代计算机的基础。
  • 冯·诺依曼也是最早深刻认识到计算和生物之间联系的科学家之一。
  • 他在生命最后的岁月里一直致力于解决机器如何才能复制自身的问题。
  • 他给出了第一个能自我复制的机器的完整设计。

4、冯·诺依曼“自复制自动机”基本原则

img

图8.1 计算机存储器简化示意图

  • 参考图8.1给出的计算机存储器示意图。 在我们高度简化的例子中,计算机存储器由有编号的位置或“地址”组成,图中编号为1—5,依次往后。 各位置中有一些字符。 这些字符可以作为程序的指令或程序使用的数据。 如果执行当前存储的程序,会显示输出:
        Hello, world!
        Goodbye.
  • 要执行程序,计算机要有一个“指令指针”——同样存储在存储器中的一个数字,记录当前执行的指令在存储器中的位置。 指令指针——简记为ip——最初设为程序第一行的存储地址。 我们称之为“指向”那条指令。 在计算的每一步ip指向的指令会被执行,ip加1。
  • 我们称ip为变量,因它的值随着计算的进行而不断变化。
  • 循环程序
        x=0
        loop until x=4
        {
        print(“Hello, world! ”)
        x=x+1
        }

会输出:

        Hello, world!
        Hello, world!
        Hello, world!
        Hello, world!

大括号之间的代码会反复执行直到循环结束条件(这里是x=4)满足。变量用作计数器——从0开始,每循环一次加1。增加到4时循环停止。

5、自我复制程序

img

图8.2 自我复制的程序

  • 假设图8.2中的程序被加载到内存中,然后假设有人在计算机命令提示符后键入selfcopy,计算机就会开始执行程序selfcopy。译码器——操作系统的一部分——会将指令指针设为1,指向程序名。然后ip会下移,逐行执行各条指令。
  • 在地址2处变量L被设为ip-1。而ip是当前执行指令的位置。因此当执行第2行时,ip设为2, L设为2-1 = 1。(注意虽然随着指令执行会不断变化,但L在重置之前会一直等于1直到其被重置。)接着会进入循环,直到line[L]等于字符串end。前面说了line[L]等于内存中地址L处的字符串。目前L等于1, line[L]等于字符串program selfcopy,不等于字符串end,因此循环不会停止。在循环中,会显示输出line[L],并将L加1。最初,L=1,显示输出program selfcopy;然后L被置为2。
  • 现在,line[L]指的是程序第二行,即L = ip-1,仍然不等于end,因此循环会继续。 这样程序就会被逐行输出。尤其有意思的是第5行:当L=5时,执行第5行,指令print(line[L])会显示输出其自身。当L=9时,line[L]等于end,循环终止。 这时已经显示输出了1—8行。指令指针指向第8行(紧跟在循环后面的指令),执行时显示输出字符串“end”结束自我复制。

6、程序中自我复制的本质

在这个程序中自我复制的本质,是用两种方式来使用内存中的信息: 既作为执行的指令,又作为这些指令使用的数据。 正是对信息的双重使用让我们得以避开前面尝试自我复制程序时遇到的那种无穷反复。