打字猴:1.701066446e+09
1701066446 Hello, world!
1701066447
1701066448 大括号之间的代码会反复执行直到循环结束条件(这里是x=4)满足。变量用作计数器——从0开始,每循环一次加1。增加到4时循环停止。
1701066449
1701066450 现在可以来看看自我复制程序了,程序完整展现在图8.2中。理解一段程序最好的办法就是手工推演,也就是一行一行跟踪程序的运行。
1701066451
1701066452 假设图8.2中的程序被加载到内存中,然后假设有人在计算机命令提示符后键入selfcopy,计算机就会开始执行程序selfcopy。译码器——操作系统的一部分——会将指令指针设为1,指向程序名。然后ip会下移,逐行执行各条指令。
1701066453
1701066454 在地址2处变量L被设为ip-1。而ip是当前执行指令的位置。因此当执行第2行时,ip设为2,L设为2-1=1。(注意虽然随着指令执行会不断变化,但L在重置之前会一直等于1直到其被重置。)接着会进入循环,直到line[L]等于字符串end。前面说了line[L]等于内存中地址L处的字符串。目前L等于1,line[L]等于字符串programselfcopy,不等于字符串end,因此循环不会停止。在循环中,会显示输出line[L],并将L加1。最初,L=1,显示输出program selfcopy;然后L被置为2。
1701066455
1701066456
1701066457
1701066458
1701066459 ▲图8.2 自我复制的程序
1701066460
1701066461 现在,line[L]指的是程序第二行,即L=ip-1,仍然不等于end,因此循环会继续。这样程序就会被逐行输出。尤其有意思的是第5行:当L=5时,执行第5行,指令print(line[L])会显示输出其自身。当L=9时,line[L]等于end,循环终止。这时已经显示输出了1—8行。指令指针指向第8行(紧跟在循环后面的指令),执行时显示输出字符串“end”结束自我复制。在这个程序中自我复制的本质,是用两种方式来使用内存中的信息:既作为执行的指令,又作为这些指令使用的数据。正是对信息的双重使用让我们得以避开前面尝试自我复制程序时遇到的那种无穷反复。
1701066462
1701066463 复杂 [:1701064766]
1701066464 自我复制程序的深层意义
1701066465
1701066466 信息的双重使用是哥德尔悖论的核心,他的自指句子“这个命题是不可证的”体现的正是这一点。
1701066467
1701066468 理解这个需要耍点把戏。首先,请注意这个句子同其他句子一样,可以从两个角度来看:①视为句子中包括的文字、空格符和标点组成的字符串;②视为字符串所代表的意义,同语言使用者的解读一样。
1701066469
1701066470 为了明确起见,我们将句子的字符串本身记为S。也就是说,S=“这个命题是不可证的”。现在可以陈述的一些命题:例如它包含9个字,1个句号。
1701066471
1701066472 句子的意义则记为M。我们可以将M重写为“命题S是不可证的”。某种程度上,你可以将M视为“指令”,而将S视为指令操作的数据。怪异(而又神奇)的是,数据S与指令M是同一个东西。哥德尔之所以能将句子转化为数学中的悖论,一个主要原因就是他能将M表示成数学命题,将S表示成编码那个数学命题字符串的数字。
1701066473
1701066474 这就是背后的把戏。侯世达在《哥德尔、艾舍尔、巴赫——集异璧之大成》一书中,对字符串与字符串的意义之间的区别,以及自指所导致的悖论,进行了详细而有趣的讨论。
1701066475
1701066476 与之类似,对信息的双重使用也是图灵对停机问题不可判定性证明的关键。还记得第4章的H和H′吗?记得H′是如何作用于自身的编码吗?同这里的自复制程序一样,H′也是以两种方式被使用:解释为程序,同时也作为程序的输入。
1701066477
1701066478 复杂 [:1701064767]
1701066479 DNA的自我复制
1701066480
1701066481 现在你可能在想,我们又回到了让人头痛的抽象逻辑王国。别急,我们马上就会回到现实世界。真正让人惊奇的是对信息的双重使用竟然也是DNA复制自身的关键。在第6章我们了解到,DNA是由核苷酸序列组成。特定的子序列(基因)编码构成蛋白质的氨基酸,其中包括解开双螺旋和用信使RNA、转运RNA、核糖体等复制各股DNA的酶(特定种类的蛋白质)。作一个宽泛的类比,对执行复制的酶进行编码的DNA序列大致上对应于自复制程序的代码。这些DNA中的“代码”在产生酶和作用于DNA自身时就相当于被执行,DNA本身则相当于被解开和复制的数据。
1701066482
1701066483 不过你可能已经注意到了我埋下的伏笔。在自复制程序和DNA的自复制之间有一个重要的差别。自复制程序需要有一个解释器来执行它:指令指针依次指向各行代码,然后由操作系统来执行它们(存取ip和L等中间变量,显示输出字符串,等等)。执行器完全外在于程序本身。
1701066484
1701066485 而在DNA的情形中,构建“解释器”——信使RNA、转运RNA,核糖体和所有用于蛋白质合成的成分——的指令也一起编码在DNA中。也就是说,DNA不仅包含自我复制的“程序”(例如用来解开和复制DNA的酶),同时也编码了它自己的解释器(将DNA转译成酶的细胞器)。
1701066486
1701066487 复杂 [:1701064768]
1701066488 冯·诺依曼的自复制自动机
1701066489
1701066490 冯·诺依曼最初的自复制自动机(冯·诺依曼只给出了数学描述,并没有真的建造)也是既包含有自我复制的程序也包含解释自身程序的机制。因此是完整的自我复制机器。这也解释了为何冯·诺依曼的构想要比我的自我复制程序复杂得多。冯·诺依曼提出构想是在20世纪50年代,当时生物自我复制的机制还没有被完全理解,这更加表明了冯·诺依曼天才的洞察力。冯·诺依曼对自动机的设计以及其正确性的数学证明在他去世前已基本完成。1957年,他因癌症去世,年仅53岁,可能是因为在参与研制原子弹时受到了核辐射。冯·诺依曼的同事巴克斯(Arthur Burks)完成了最后的证明。1966年,巴克斯将全部成果编辑成为《自复制自动机理论》(Theory of Self-Reproducing Automata)一书出版。  [115]  
1701066491
1701066492 冯·诺依曼设计的自复制自动机是人工生命科学真正的先驱之一,从原则上证明了自我复制的机器的确是可能的,并且提供了自我复制的“逻辑”,后来证明其与生物的自我复制机制惊人的相似。
1701066493
1701066494 冯·诺依曼认识到这个结论具有深远的影响。他担心公众对这种自复制机器的反应,不愿看到大众媒介报道“未来这种自复制机器的可能性”  [116]  。可惜好景不长。1999年,计算机科学家库兹韦尔(Ray Kurzweil)和莫拉韦茨(Hans Moravec)在《灵魂机器的时代》(The Age of Spiritual Machines)和《机器人》(Robot)这两本书中鼓吹了这种具有超级智能并且能自我复制的机器人的可能性,他们认为这种机器人在不远的将来就会被制造出来,他们的书并非虚构,  [117]  但是相当牵强。2000年,Sun公司的创始人之一乔伊(Bill Joy)在《连线》(Wired)杂志上发表了一篇后来很有名的文章  [118]  ——《为何未来不需要我们》,文中描述了自复制纳米机器的可能性。目前这些预言都还没有应验。不过复杂的自复制机器也许很快就会成为现实:康奈尔大学的机器人专家利普森(Hod Lipson)和他的同事已经制造出了一些简单的自复制机器人  [119]  。
1701066495
[ 上一页 ]  [ :1.701066446e+09 ]  [ 下一页 ]