quine [名字源于逻辑学家 Willard van Orman Quine, via Douglas Hofstadter] ,指的是一种运行后生成自身源代码拷贝的程序,也叫self-reproducing programs(自我复制程序)。今天无意中搜到 Ken Thompson 的一篇经典演讲 Reflections on Trusting Trust,好奇心下就小探索了一番。
answers.com 上有一个c语言的例子:
char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";main(){printf(f,34,f,34,10);}
运行之后直觉得好奇,为什么它能把自身源代码输出啊?想着可能是某种特技,结果在Linux下,在Win下编译反编译调试比较汇编代码,折腾了半天。到最后看发现实在太繁,还是静心读一下源代码吧,才发现,原来如此的简单:
printf中的第一个参数f,就是格式化字符串,34就是双引号的"ASCII码,10就是换行符的ASCII码,很显然f就是一个用它自身去格式化自身的字符串而已。技术看起来简单,但是要实现完全相同的代码输出,在编排上还真得下一番工夫。
Gtalk上碰见yutian,给他发了过去,还打赌他肯定看不出来运行结果,现在才发现自己幸亏没真赌上。:D,不过人那,还是感情的动物啊,都有一种习惯性思维,看到貌似复杂的东西自己就先限制住思路了,结果他也没看出来,哈哈。
看来,把复杂的事情搞简单,还真不是件容易的事儿。做人,还是简单点好,遇事想那么多干吗,给自己找烦恼。
PS:
谁要对 quine 还感兴趣,这里 有几乎所有语言的一种 quine 实现,这东东好象对写恶意代码很有用啊。
Copyright © 2005-2006 Solrex Yang. All rights reserved.