1701066350
自我复制:计算机不能复制自身;要复制自身就必须包含对自身的描述;而这个描述又包含其本身的描述,这样反复无穷。
1701066351
1701066352
生存本能:计算机不关心自己能不能生存,它们也不关心自己是不是成功。(有一次听一位杰出的心理学家的讲座,他在谈论计算机象棋程序时说:“就算深蓝赢了卡斯帕罗夫,它也不会有快乐的感觉。”)
1701066353
1701066354
进化和适应:计算机本身无法进化或适应;它只能严格依照程序员预先设定的方式变化。
1701066355
1701066356
虽然还有很多人相信这些观点,但它们都在人工生命领域中 [114] 以各种方式被否定了。人工生命关注的是在计算机中仿真或“创造”生命。在这一章和下一章我会讨论这些,它们与达尔文主义的自我复制和进化密切相关。
1701066357
1701066359
计算机中的自我复制
1701066360
1701066361
自我复制的观点非常数学化:它认为计算机中的自我复制会导致无穷反复。
1701066362
1701066363
我们先来看看计算机自我复制问题最简单的形式:写一段程序打印其自身。
1701066364
1701066365
在后面我们用一种简单的计算机语言,这样不用是程序员也能看懂。(实际上是一种伪代码,有一些真正的计算机语言所没有的命令,但是是合理的,只是让事情更简单一些。)
1701066366
1701066367
下面来试一下,首先从程序的名字开始:
1701066368
1701066369
program copy
1701066370
1701066371
然后加一条指令将程序的名字打印出来:
1701066372
1701066373
program copy
1701066374
1701066375
print(“program copy”)
1701066376
1701066377
指令print只是简单地将引号之间的字符显示到屏幕上然后换行。现在增加一条指令将第二行打印出来:
1701066378
1701066379
program copy
1701066380
1701066381
print(“program copy”)
1701066382
1701066383
print(“print(“program copy”)”)
1701066384
1701066385
因为要输出程序自身的完整复制,第二个print指令的引号中带了第一个print指令前的四个缩进符和后面的一对引号(print指令输出最外侧的引号之间的所有字符,包括引号)。现在又要加一条指令来输出第三行:
1701066386
1701066387
program copy
1701066388
1701066389
print(“program copy”)
1701066390
1701066391
print(“print(“program copy”)”)
1701066392
1701066393
print(“print(“print(“program copy”)”)”)
1701066394
1701066395
现在你可能已经看出来,这种策略——每条指令输出上一条指令的拷贝——是如何导致无穷反复的。怎样才能避免这种情况呢?在继续往下读之前,你可以花点时间自己试一试能不能解决这个问题。
1701066396
1701066397
这个看似简单的问题其实关系到第4章介绍过的哥德尔和图灵的工作。解决方法同时也包含了生物系统本身绕开无穷反复的基本途径。20世纪匈牙利数学家冯·诺依曼在研究一个更复杂的问题时,首先发现了这个问题的答案。
1701066398
1701066399
冯·诺依曼是量子力学、经济学等多个领域的先驱,也是最早设计电子计算机的人之一。他的设计中包含中央处理单元和可以存储程序和数据的随机存取存储器。这些至今仍然是现代计算机的基础。冯·诺依曼也是最早深刻认识到计算和生物之间联系的科学家之一。他在生命最后的岁月里一直致力于解决机器如何才能复制自身的问题。他给出了第一个能自我复制的机器的完整设计。我在后面展示的自复制计算机程序就是受他的“自复制自动机”启发,并以简化的方式阐释其基本原则。
[
上一页 ]
[ :1.70106635e+09 ]
[
下一页 ]