Многие результаты теории вычислимости (такие как вторая теорема Клини о рекурсии ) гарантируют, что можно создавать программы, которые могут работать с собственным исходным кодом. Например, в книге Майкла Сипсера «Введение в теорию вычислений» он доказывает особый случай теоремы рекурсии, в котором говорится, что любая программа, представляющая функцию, которая принимает две строки и создает строку, может быть преобразована в эквивалентную программу, где Второй аргумент равен собственному исходному коду программы. Более того, этот процесс может быть выполнен автоматически.
Конструкция, используемая для создания программ с доступом к собственному исходному коду, хорошо известна (большинство книг по теории вычислений содержат ее) и часто используется для создания квин. Мой вопрос заключается в том, написал ли кто-то инструмент общего назначения, который принимает в качестве входных данных программу на каком-либо языке (например, C, например), который содержит некоторую метку-заполнитель для источника программы, а затем обрабатывает программу для создания новой программы с доступом к своему исходному коду. Это позволило бы, например, автоматически генерировать квины или писать программы, которые могут анализировать свои синтаксические деревья (возможно, включить отражение в языках, которые его еще не поддерживают). Если нет, то я планировал написать собственную версию такого инструмента, но я не хочу изобретать велосипед, если это уже было сделано.
РЕДАКТИРОВАТЬ : Основываясь на предложении @Henning Makholm, я решил просто сесть и реализовать такую программу. Результирующая программа (которую я назвал "kleene
") принимает в качестве входных данных программу C ++ и создает новую программу C ++, которая может получить доступ к своему собственному исходному коду, вызвав функцию kleene::MySource()
. Это означает, что вы можете преобразовать эту очень простую программу в Quine, используя программу kleene
:
#include <iostream>
int main() {
std::cout << kleene::MySource() << std::endl;
}
Если вам интересно проверить его, он доступен здесь, на моем сайте .