可计算性理论中的许多结果(例如Kleene 的第二递归定理)确保可以构建可以对自己的源代码进行操作的程序。例如,在迈克尔·西普瑟(Michael Sipser)的“计算理论导论”中,他证明了递归定理的一个特例,该定理指出,任何表示接受两个字符串并产生一个字符串的函数的程序都可以转换为等价的程序,其中第二个参数等于程序自己的源代码。此外,这个过程可以自动完成。
用于生成可访问自己的源代码的程序的结构是众所周知的(大多数计算理论书籍都包含它),并且经常用于生成 quines。我的问题是,是否有人编写了一个通用工具,该工具接受某种语言(例如,可能是 C)的程序作为输入,该程序包含程序源的一些占位符,然后处理该程序以生成具有访问权限的新程序到自己的源代码。例如,这将使自动生成 quines 或编写可以对其语法树进行自省的程序成为可能(可能在尚不支持它的语言中启用反射)。如果没有,我打算编写自己的这种工具版本,但如果已经完成,我不想重新发明轮子。
编辑:根据@Henning Makholm 的建议,我决定坐下来实施这样的程序。生成的程序(我称之为“ kleene
”)接受一个 C++ 程序作为输入,并生成一个新的 C++ 程序,该程序可以通过调用函数来访问它自己的源代码kleene::MySource()
。这意味着您可以使用以下程序将这个非常简单的程序转换为 Quine kleene
:
#include <iostream>
int main() {
std::cout << kleene::MySource() << std::endl;
}
如果您想查看它,可以在我的网站上找到它。