可计算性理论(如Kleene第二递推定理)的许多结果确保了可以构建能够在自己的源代码上操作的程序。例如,在Michael Sipser的“计算理论导论”中,他证明了递归定理的一个特例,该定理指出,任何表示接受两个字符串并产生字符串的函数的程序都可以转换成一个等价的程序,其中第二个参数等于程序自己的源代码。此外,这一过程可以自动完成。
用来生成访问自己的源代码的程序的构造是众所周知的(大多数计算书籍都包含它),并且经常用于生成quine。我的问题是,是否有人编写了一个通用工具,该工具以某种语言(例如C语言)接受一个程序作为输入,其中包含程序源代码的占位符,然后处理该程序,生成一个新的程序,并访问它自己的源代码。例如,这样就可以自动生成quine,或者编写可以对其语法树进行内省的程序(可能允许在不支持它的语言中进行反射)。如果不是,我计划编写我自己版本的这样一个工具,但我不想重新发明车轮,如果已经这样做了。
编辑:基于@Henning Makholm的建议,我决定坐下来执行这样的程序。生成的程序(我称之为"kleene
")接受一个C++程序作为输入,并生成一个新的C++程序,该程序可以通过调用函数kleene::MySource()
来访问自己的源代码。这意味着您可以使用kleene
程序将这个非常简单的程序转换为Quine:
#include <iostream>
int main() {
std::cout << kleene::MySource() << std::endl;
}
如果您有兴趣查看它,它是可用的在我的网站上。
发布于 2011-08-11 10:09:49
在维基百科文章上有很多例子和链接。在看了一两个之后,应该清楚地知道如何构建一个quine生成器,这是一种以任意有效负载代码作为输入的给定语言。
反射思想的一个问题是,程序通常不能知道它所构建的是它自己的源代码。
发布于 2011-08-11 13:22:02
我们的DMS软件重组工具包是一个程序转换系统,它将接受任意语法的程序(以一个称为“域描述”的显式参数向DMS描述),将它们解析为AST,执行对AST的分析和转换,并可以从修改后的版本重新生成修改后的程序文本。
当然,DMS是用一种语言(实际上是一组特定于域的语言)编码的,其中已经有DMS-域描述。因此,DMS可以读取自己,我们使用该功能引导附加的DMS功能并优化其性能。因此,虽然我们不生产奎因,但我们正在用自我增强的代码构建程序。
是的,你对这样一个工具的观察为任意的语言提供了反映。大多数以语言提供的反射工具只允许访问那些语言编译器人员认为在运行时访问的最重要的东西,例如“方法名称”。当然,他们不感兴趣的东西是不可访问的;有没有见过一种反射机制,可以告诉你表达式中的内容?在评论里?
DMS提供了对源代码的所有细节的完整访问,通过从外部检查代码,使用通用的、完整的机制。如果您的语言没有反射,DMS是访问代码的方式,并任意地解释它。即使您的langauge有反射,DMS也可以用您的语言对程序进行推理,这是您的语言无法做到的,因为它无法访问它自己的详细结构。
https://stackoverflow.com/questions/7030653
复制相似问题