【问题标题】:Tool to produce self-referential programs?生成自引用程序的工具?
【发布时间】:2011-08-11 18:02:14
【问题描述】:

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

【问题讨论】:

  • Downvoter - 你能解释一下这个问题有什么问题吗?
  • 要“访问自己的源代码”并做任何真正有趣的事情,您的程序实际上需要大量的解析、分析和转换机制。将它自己的代码作为文本字符串读取将给你带来极少的能力,不管它有多可爱。
  • 酷!我很高兴你做到了。我认为其他人也这样做了。 :)

标签: theory self-reference


【解决方案1】:

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

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

【讨论】:

  • 确实如此,而且我知道您用来执行此操作的一般结构。但是,我的问题主要是是否有人已经这样做了,或者我是否应该尝试自己构建它。
  • 我不清楚是否值得麻烦发布(键入 HTML、博客文章等)来明确共享这样的生成器。一旦你有一个示例 quine 用作模板,你通常需要大约 8 行 perl 和一个 here-document 才能拥有生成器。
【解决方案2】:

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

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

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

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

【讨论】:

  • Downvoter:最好解释一下你为什么投反对票,而不是标记这个并运行。它直接回答 OP 问题。
猜你喜欢
  • 2011-04-11
  • 2012-11-03
  • 2011-05-05
  • 2011-03-24
  • 2015-04-09
  • 1970-01-01
  • 2019-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多