A: Quine 是一个不接受任何输入,输出其自身源代码的程序。得名于哲学家 Willard Van Orman Quine。
A:
- 理论研究:探索自引用、不动点等计算理论概念
- 编程练习:提高对编程语言的理解
- 艺术表达:创造有趣的代码艺术
- 计算机病毒研究:理解自我复制机制
A: 在某些语言中,空程序可以被视为 Quine(输出空字符串)。但在 Python 中,最简单的实用 Quine 是:
_='_=%r;print(_%%_)';print(_%_)A: 不算!这是"作弊"。真正的 Quine 必须:
- 不接受任何输入(包括文件读取)
- 通过程序逻辑构造并输出源代码
以下不是真正的 Quine:
# 作弊!不是 Quine
with open(__file__) as f: print(f.read())A: 常见原因:
- 换行符不一致:Windows (
\r\n) vs Unix (\n) - 末尾空格:源代码末尾有空格但输出没有
- 编码问题:文件编码与输出编码不一致
- 引号转义:引号没有正确转义
A:
# 添加调试输出
original = open('quine.py').read()
output = result.stdout
# 比较长度
print(f"原始: {len(original)}, 输出: {len(output)}")
# 找第一个不同字符
for i, (a, b) in enumerate(zip(original, output)):
if a != b:
print(f"位置 {i}: 原始={repr(a)}, 输出={repr(b)}")
breakA: 理论上,任何图灵完备的语言都可以写 Quine。但实际上:
- 容易:Python, JavaScript, Ruby, Lisp
- 中等:C, Java, Go
- 困难:Brainfuck, Whitespace, SQL
- 几乎不可能:纯 HTML, CSS(非图灵完备)
A: 取决于语言:
- Python: 29 字符(已知)
- Ruby: 25 字符
- Perl: 22 字符
- C: ~80 字符
A: 程序 A 输出 B 的代码,B 输出 C 的代码,...,Z 输出 A 的代码。形成一个循环。
A: 同一个源文件可以被多种语言正确解释,每种语言输出相同的源代码。
A:
- Quine:只输出自身,无害
- 病毒:自我复制并执行恶意操作
Quine 是理论研究,病毒是恶意软件。
A: DNA 的自我复制机制类似于 Quine:
- DNA 包含自身的"代码"(基因序列)
- 细胞机制"读取"DNA 并复制它
A: 根据停机问题的不可判定性,理论上无法编写一个程序来准确判断任意程序是否是 Quine。
A:
- 从简单模板开始:
s='s=%r;print(s%%s)';print(s%s) - 理解
%r(repr)的作用 - 逐步添加功能(注释、多行等)
- 尝试不同语言
A:
- 本书项目的 THEORY.md
- Wikipedia: Quine (computing)
- Rosetta Code: Quine
- Stack Overflow 上的相关讨论
A:
- IOCCC(国际C语言混淆代码大赛)经常有 Quine 类别
- Code Golf 上的 Quine 挑战
- 各种编程社区的 Quine 比赛
A: 检查:
- 是否使用了 Python 2/3 兼容语法
- 引号是否正确匹配
%是否转义为%%
A: 使用十六进制查看器检查:
xxd quine.py | head
python quine.py | xxd | headA: 使用 Git Bash, WSL, 或安装 diff 工具。 或者使用 Python 脚本验证。
A: Quine 是 Kleene 递归定理的具体实例,展示了程序可以引用自身。
A: 是的!两者都基于自引用:
- 哥德尔:"这个命题不可证明"
- Quine:程序输出自身
A: 一个生成 Quine 的程序,它本身不是 Quine。