可计算性理论中的许多结果(例如Kleene's second recursion theorem)确保可以构造可以在其自己的源代码上运行的程序。例如,在Michael Sipser的“计算理论导论”中,他证明了递归定理的一个特例,它说明任何表示接受两个字符串并产生一个字符串的函数的程序都可以转换成一个等价的程序,其中第二个参数等于程序自己的源代码。此外,这个过程可以自动完成。
用于生成可访问自己的源代码的程序的构造是众所周知的(大多数计算书理论都包含它),并且通常用于生成quines。我的问题是,是否有人编写了一个通用工具,接受某种语言的程序(例如,可能是C)作为输入,该程序包含程序源的一些占位符,然后处理程序以生成具有访问权限的新程序到它自己的源代码。例如,这可以使自动生成quines,或者编写可以对其语法树进行内省的程序(可能在不支持它的语言中启用反射)。如果没有,我打算编写自己的这种工具版本,但如果已经完成,我不想重新发明轮子。
编辑:根据@Henning Makholm的建议,我决定坐下来实施这样的计划。生成的程序(我称之为“kleene
”)接受C ++程序作为输入,并生成一个新的C ++程序,可以通过调用函数kleene::MySource()
来访问自己的源代码。这意味着您可以使用kleene
程序将这个非常简单的程序转换为Quine:
#include <iostream>
int main() {
std::cout << kleene::MySource() << std::endl;
}
如果您想要查看它,可以使用here on my website。
答案 0 :(得分:3)
Wikipedia article上的大量示例及其链接。在看了一两个之后,应该很明显如何构建一个给定语言的quine生成器,该语言将任意一块有效载荷代码作为输入。
您的反思意见的一个问题是,程序通常不能知道它构造的是它自己的源代码。
答案 1 :(得分:0)
我们的DMS Software Reengineering Toolkit是program transformation system,它将接受任意语法的程序(在称为“域描述”的显式参数中描述为DMS),将它们解析为AST,执行分析和转换ASTs,可以从修改后的版本中重新生成修改后的程序文本。
DMS当然用一种语言编码(实际上是一组特定于域的语言),已经有DMS域描述。因此,DMS可以读取本身,我们使用该功能来引导其他DMS功能并优化其性能。 因此,虽然我们不生产葡萄藤,但我们正在构建具有自我增强代码的程序。
是的,你对这种提供反射任意语言的工具的观察是有目共睹的。语言中提供的大多数反射工具只允许访问语言编译器人员认为在运行时访问时最重要的那些东西,例如“方法名称”。当然,他们不感兴趣的东西是无法访问的;曾经见过一种反映机制会告诉你表达中的内容是什么?在评论?
DMS使用通用的完整机制,通过检查外部代码,提供对所有源代码详细信息的完全访问权限。如果您的语言没有反射,DMS就是访问代码并随意对其进行推理的方法。即使你的语言有反思,DMS也可以用你的语言无法解释你语言的程序,因为它无法访问自己的详细结构。