3

可计算性理论中的许多结果(例如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;
}

如果您想查看它,可以在我的网站上找到它。

4

2 回答 2

3

Wikipedia 文章中的许多示例及其链接。在看了一两个之后,应该很明显如何构建一个 quine 生成器,一种给定的语言,它将任意一段有效负载代码作为输入。

您的反射想法的一个问题是程序通常无法知道它所构造的是它自己的源代码。

于 2011-08-11T18:09:49.133 回答
0

我们的DMS Software Reengineering Toolkit是一个程序转换系统,它将接受任意语法的程序(在称为“域描述”的显式参数中向 DMS 描述),将它们解析为 AST,对 AST 进行分析和转换,并且可以从修改后的版本重新生成修改后的程序文本。

DMS 当然是用已经有 DMS 域描述的语言(实际上是一组特定于域的语言)编码的。因此,DMS 可以自行读取,我们使用该功能来引导额外的 DMS 功能并优化其性能。因此,虽然我们不生产 quines,但我们正在构建具有自我增强代码的程序。

是的,您对这种为任意语言提供反射的工具的观察令人印象深刻。语言中提供的大多数反射工具只允许访问那些语言编译器人员认为在运行时访问最重要的东西,例如“方法名称”。当然,他们不感兴趣的东西是无法访问的。见过可以告诉您表达式中的内容的反射机制吗?在评论中?

DMS通过使用通用、完整的机制从外部检查代码,提供对源代码所有细节的完整访问。如果您的语言没有反射,DMS 是访问代码并任意推理的方式。即使您的语言有反射,DMS 也可以以您的语言无法使用的方式推理您的语言中的程序,因为它无法访问自己的详细结构。

于 2011-08-11T21:22:02.270 回答