所以我只是在维基百科上看到了奎因这个词,无法弄清楚它到底是什么意思。我对此感到困惑。它有什么实际用途吗?
3 回答
Quine 本质上是一个输出自己的源代码的命令。不,它真的没有任何实际用途。
quine 在以下情况下很有用:
- 程序化编译
目标代码可以直接序列化到磁盘,尽管它前面有一个 cookie 和版本。但是在运行时编译 Scheme 时,您需要一个 Scheme 值:例如,一个已编译的过程。为此,为了不破坏抽象,Guile 在塔底定义了一种伪语言:
Value
编译为值将目标代码加载到一个过程中,并唤醒沉睡的巨人。
也许这种奇怪可以用例子来解释:compile-file 默认编译为目标代码,因为它生成的目标代码必须存在于 Guile 运行时之外的贫瘠世界中;但 compile 默认为编译为 value,因为它的产品重新进入了 Guile 世界。
确实,编译过程可以无限期地在这些不同的世界中循环,如下面的 quine 所示:
((lambda (x) ((compile x) x)) '(lambda (x) ((compile x) x)))
- 安全检查:
在 Omniture 案例中,攻击者需要在 cookie 中添加 quine,然后强制 eval 使用 cid 的新值
使用精心制作的 gzip 文件(附件是一个解压到自身的 quine),可以让 tar(1) 调用无限链的 gzip 压缩器,直到运行 tar(1) 的机器上的所有内存都被耗尽或另一个资源限制开始了。
- 自我转变
本质上,其直观(和有效)的内容是程序可以使用自己的源代码作为变量,即向编程语言添加程序操作自身(其源代码)的能力并不会增加其表达能力。所以存在一个压缩自己的listing的程序;存在一个打印自己的 MD5 校验和的程序(这比查找包含其 MD5 校验和的程序(实际上是任何文件)要容易得多
- 独立的两层架构
如果您的数据和数据库代码没有存储在同一个地方,您可能会丢失其中一个,从而使另一个无用。
- 自我保护
TiddlyWiki 是一个不寻常的实用 quine 示例:正是这种生成自己的源代码副本的能力是 TiddlyWiki 独立保存对自身所做更改的能力的核心。
- 证明
如果“quine”的意思是“一个使用自己的源代码作为输入的自动机”,那么哥德尔或多或少地使用了一个quine来证明他的不完备性定理,图灵用一个来证明停止问题是不可计算的,汤普森用一个来证明访问所有软件和编译器的源代码不足以在其中找到后门,Steve Russell 通过将 McCarthy 的 Lisp quine 编码为(709?)汇编,大约发明了函数式编程语言,John von Neumann 预测自繁殖生命形式一般会变成quines,并且随着DNA的发现被证明是正确的。
因此,如果 quines 对生命的存在、哥德尔的不完备性定理、停止问题的不可计算性的证明以及函数式编程语言的存在负责,我将它们提名为所有程序中最具历史意义的类别。
- 非结构化循环
Muriel 没有传统的控制结构。相反,Muriel 有一个命令来用给定的字符串替换当前正在运行的 Muriel 程序,然后运行它。这导致了一种编程方法,在这种方法中,程序必须对自身进行 quine 才能执行任何类型的循环。
参考
不,这不是一个有用的东西,它只是一种风格的练习,一些程序员喜欢......