Skip to content

Latest commit

 

History

History
170 lines (115 loc) · 4.54 KB

File metadata and controls

170 lines (115 loc) · 4.54 KB

Quine 常见问题 (FAQ)

基础问题

Q: 什么是 Quine?

A: Quine 是一个不接受任何输入,输出其自身源代码的程序。得名于哲学家 Willard Van Orman Quine。

Q: Quine 有什么用?

A:

  • 理论研究:探索自引用、不动点等计算理论概念
  • 编程练习:提高对编程语言的理解
  • 艺术表达:创造有趣的代码艺术
  • 计算机病毒研究:理解自我复制机制

Q: 最简单的 Quine 是什么?

A: 在某些语言中,空程序可以被视为 Quine(输出空字符串)。但在 Python 中,最简单的实用 Quine 是:

_='_=%r;print(_%%_)';print(_%_)

Q: 读取自己的源文件算不算 Quine?

A: 不算!这是"作弊"。真正的 Quine 必须:

  1. 不接受任何输入(包括文件读取)
  2. 通过程序逻辑构造并输出源代码

以下不是真正的 Quine:

# 作弊!不是 Quine
with open(__file__) as f: print(f.read())

技术问题

Q: 为什么我的 Quine 验证失败?

A: 常见原因:

  1. 换行符不一致:Windows (\r\n) vs Unix (\n)
  2. 末尾空格:源代码末尾有空格但输出没有
  3. 编码问题:文件编码与输出编码不一致
  4. 引号转义:引号没有正确转义

Q: 如何调试 Quine?

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)}")
        break

Q: 所有编程语言都能写 Quine 吗?

A: 理论上,任何图灵完备的语言都可以写 Quine。但实际上:

  • 容易:Python, JavaScript, Ruby, Lisp
  • 中等:C, Java, Go
  • 困难:Brainfuck, Whitespace, SQL
  • 几乎不可能:纯 HTML, CSS(非图灵完备)

Q: 最短的 Quine 有多短?

A: 取决于语言:

  • Python: 29 字符(已知)
  • Ruby: 25 字符
  • Perl: 22 字符
  • C: ~80 字符

高级问题

Q: 什么是迭代 Quine?

A: 程序 A 输出 B 的代码,B 输出 C 的代码,...,Z 输出 A 的代码。形成一个循环。

Q: 什么是多语言 Quine?

A: 同一个源文件可以被多种语言正确解释,每种语言输出相同的源代码。

Q: Quine 和病毒有什么区别?

A:

  • Quine:只输出自身,无害
  • 病毒:自我复制并执行恶意操作

Quine 是理论研究,病毒是恶意软件。

Q: 生物中的 Quine 是什么?

A: DNA 的自我复制机制类似于 Quine:

  • DNA 包含自身的"代码"(基因序列)
  • 细胞机制"读取"DNA 并复制它

Q: 有没有不可能被检测到的 Quine?

A: 根据停机问题的不可判定性,理论上无法编写一个程序来准确判断任意程序是否是 Quine。

学习资源

Q: 如何学习写 Quine?

A:

  1. 从简单模板开始:s='s=%r;print(s%%s)';print(s%s)
  2. 理解 %r(repr)的作用
  3. 逐步添加功能(注释、多行等)
  4. 尝试不同语言

Q: 有哪些好的学习资源?

A:

  • 本书项目的 THEORY.md
  • Wikipedia: Quine (computing)
  • Rosetta Code: Quine
  • Stack Overflow 上的相关讨论

Q: Quine 竞赛有哪些?

A:

  • IOCCC(国际C语言混淆代码大赛)经常有 Quine 类别
  • Code Golf 上的 Quine 挑战
  • 各种编程社区的 Quine 比赛

问题排查

Q: Python Quine 输出 SyntaxError: invalid syntax

A: 检查:

  1. 是否使用了 Python 2/3 兼容语法
  2. 引号是否正确匹配
  3. % 是否转义为 %%

Q: 输出看起来一样但验证失败?

A: 使用十六进制查看器检查:

xxd quine.py | head
python quine.py | xxd | head

Q: Windows 上 diff 命令不工作?

A: 使用 Git Bash, WSL, 或安装 diff 工具。 或者使用 Python 脚本验证。

相关概念

Q: Quine 和递归有什么关系?

A: Quine 是 Kleene 递归定理的具体实例,展示了程序可以引用自身。

Q: Quine 和哥德尔不完备定理有关系吗?

A: 是的!两者都基于自引用:

  • 哥德尔:"这个命题不可证明"
  • Quine:程序输出自身

Q: 什么是 Meta-Quine?

A: 一个生成 Quine 的程序,它本身不是 Quine。