1
2003-3-30 23:06:35  人工生命 
记得很早的时候,有人说计算机永远不可能产生生命,因为计算机程序不能自我复制。可是后来冯诺伊曼证明了机器程序是可以自我拷贝的,从那不久,就有了世界上的第一个计算机病毒:蠕虫,我想知道,冯诺伊曼当初的证明是怎样的,病毒自我复制的原理又是什么?不知道那位大虾有研究,请不要告诉我简单的文件拷贝就是它的自我复制了,注意,一定要是一段内存里执行这的程序!
2008-8-8 19:37:08
  

 

总算有一个问题基本搞清了,可见这五年Jake大人学问的长进,哈哈哈

>jake在提一个问题,关于病毒的自我繁殖中写道:
---------------------------
记得很早的时候,有人说计算机永远不可能产生生命,因为计算机程序不能自我复制。可是后来冯诺伊曼证明了机器程序是可以自我拷贝的,从那不久,就有了世界上的第一个计算机病毒:蠕虫,我想知道,冯诺伊曼当初的证明......

2008-8-9 8:33:08
  

你在挖我五年前的东西啊?呵呵,基本有价值的一些东西都整理到我自己的博客里面了。

http://www.swarmagents.cn/bs/membership/bsblog.asp?user=jake


>东方隐在回复:提一个问题,关于病毒的自我繁殖中写道:
---------------------------

 

总算有一个问题基本搞清了,可见这五年Jake大人学问的长进,哈哈哈

>jake在提一个问题,关于病毒的自我繁殖......

2012-3-28 17:46:35
  

jake大神,这是你2003年的提问,那么这么多年过去了,你应该已经知道答案了吧。

俺是很崇拜你的啊,准备把你的文章都复制下来,自己看,不知道能不能取得你的同意。

自我复制的程序其实在冯诺依曼机里是很好实现的,而在现在的计算机里反而实现有困难了。

比如“磁芯大战”里介绍的一个程序,MOV 0,1我们很好理解,就是把“当前地址的内容” 给移动到下一个地址。

那么当前的地址内容是什么呢?就是“MOV 0,1”啊,这就相当与复制了自己。

 

为什么说现在的程序反而难以实现了呢?因为现在对程序储存区和数据储存区做出区分,比如说MOV $1,$2是指把$2寄存器指向的地址复给$1寄存器,这样的指令改动的也只能是数据储存区。而不能改动程序储存区的内容。

我们要向实现程序的自我复制乃至自我修改,就必须修改程序储存区。假如我们假设一个八位机,设置这样一条指令,0010(op码),这条指令的功能是把它携带的数据携带下一条指令的高位和地位。

比如 0010 1111执行之后,下一条指令就变成1111 1111

比如 0010 1110执行之后,下一条指令就变成1110 1110

比如 0010 1101执行之后,下一条指令就变成1101 1101

比如 0010 0001执行之后,下一条指令就变成0001 0001

你已经猜到了,只需要有一条指令是0010 0010,那么这条指令将复制自己而且一直执行下去。

这不仅仅可以是一条指令,还可以是程序段。

当然,你可以想想这条指令会带来什么灾难。 

 --

由以上可知,假如我们自己开发出来一个计算机,或者仅仅是cpu那么我们就能更好的理解这个问题了。

当然复制的实质仍然是

把“把的第一个字放到引号前面,第一个字后面的字放到引号后面,引号中的文字不变。 ”的第一个字放到引号前面,第一个字后面的字放到引号后面,引号中的文字不变。 

 

这是看了你后来的文章后想到的,我想你也应该知道了程序的自我复制,不过在翻看你以前的文章,哈哈。 

>jake在提一个问题,关于病毒的自我繁殖中写道:
---------------------------
记得很早的时候,有人说计算机永远不可能产生生命,因为计算机程序不能自我复制。可是后来冯诺伊曼证明了机器程序是可以自我拷贝的,从那不久,就有了世界上的第一个计算机病毒:蠕虫,我想知道,冯诺伊曼当初的证明......

 

2012-3-28 18:20:04
  

太令人伤心了吧,我写好了一大段,结果网站说我长久没有登录系统,要重新登录。

jake,最近俺在看你的文章,准备打印下来,自己看, 希望能取得你同意。

这是你2003年提出的问题了,这么多年过去了,你应该已经知道答案,但是可能还没彻底明白(从你后来的文章的猜测)

程序的自我复制和修改在早期反而是容易实现的,而在现在却难实现了,当然是因为计算机体系结构的改变,早期的计算机的程序区和数据区都是混在一起的,只是我们人类说哦,这是程序区,哦这是数据区,其实程序区和数据区是可以互相用的,早期的程序员就是靠这种招数实现程序的自我修改。

在磁芯大战的介绍里有这么一个程序只有一句叫MOV 0,1就是把当前地址的内容给移动到下一个地址去。(0代表当前,1代表下一地址都是硬件实现的。)那么当前地址的内容是什么呢?

是MOV 0,1我们不管mov的机器码是什么,反正下一地址的内容也变成了MOV 0,1了,由于程序没有跳转,程序计数器自动加1,而此时运行到了“下一地址” ,它的指令仍然是MOV 0,1,它执行后就会把它的下一地址给写成MOV 0,1,这只是在程序区和数据混杂的时候才会出现的。

我们假设MOV 的机器码是1111,那么我的意思就是

地址0:111101

地址1:100111

地址2:100011

程序首先由地址0执行,执行后地址1中的内容被覆盖,变成了111101,而同理这条指令有会把地址2的内容给写成111101.

你可以想象这种可怕了。所有的指令都会变成MOV 0,1

为什么说现在的计算机反而难以实现了呢?因为我们大多使用寄存器资源,我们不大可能修改位执行的指令了,而只能是修改数据。

比如MOV $1,$2,就是把寄存器$1指向的东西写给$2的指向 ,我们只能修改数据,而不能修改指令了,除非寄存器指向指令的地址。

 假如我们在八位机里设计一条新的指令 0010,它的功能是把它携带的数据写到下一地址的高位和地位。

比如 0010 0000, 那么下一地址就变成 0000 0000

而  0010 1101,那么下一地址就变成1101 1101

那么假如有一条指令时0010 0010,那么好了,这条指令将会一直复制自己执行下去。

被复制的复制品,仍然要拥有复制的能力,这大概就是复制的精髓了。

所以,你可以看到,假如是我们自己设计的计算机cpu的话,程序倒是好写了,而对于别人设计好的cpu,我们可能要变化写手段才能实现。

这一切的来源仍然是

把“把的第一个字放到引号前面,第一个字后面的字放到引号后面,引号中的字保持不变。 ”的第一个字放到引号前面,第一个字后面的字放到引号后面,引号中的字保持不变。 

假如我们执行一次之后,得到一个新句子,然后这个新句子得不到执行,那么它就是数据了,又怎么能自我复制呢,而只有动态的,或者说活动的,活着的,这个句子才能永动起来。

 同样在上面的例子,0010 0010,假如这个指令的功能是把它携带的数据写到储存器里,那么我们顶多得到一个储存为0010 0010的数据而已。所以这个指令的功能要是把它写到程序储存器里,当然只有我们自己设计的cpu才能掌握这一点。指令和数据这时又好像DNA和蛋白质的关系了。

>jake在提一个问题,关于病毒的自我繁殖中写道:
---------------------------
记得很早的时候,有人说计算机永远不可能产生生命,因为计算机程序不能自我复制。可是后来冯诺伊曼证明了机器程序是可以自我拷贝的,从那不久,就有了世界上的第一个计算机病毒:蠕虫,我想知道,冯诺伊曼当初的证明......

 

2012-3-28 18:20:44
   原来没有被吞啊,我错了。


>jake在提一个问题,关于病毒的自我繁殖中写道:
---------------------------
记得很早的时候,有人说计算机永远不可能产生生命,因为计算机程序不能自我复制。可是后来冯诺伊曼证明了机器程序是可以自我拷贝的,从那不久,就有了世界上的第一个计算机病毒:蠕虫,我想知道,冯诺伊曼当初的证明......

 

2014-01-20 18:41:42
   十年过去了。膜拜大神
登录后才可以评论,马上登录
2012-2022 www.swarma.org, all rights reserved