Куайны (бесполезная программа в программе)

Куайн (от анг. quine) — программа, результатом работы которой является собственный исходный код. Сразу оговоримся: программы, которые обращаются к файлам или производят считывание с клавиатуры куайнами не являются. Более серьезное ограничение: программы, которые могут напрямую получить доступ к своему исходному коду (средствами языка), также не являются куайнами.

Пример на Бейсике:

Пример на Форте:

А существуют ли они?

Несмотря на простую формулировку задания, потратив немного времени на ее решение, возникает вопрос: существуют ли вообще такие программы? Ответ: Да!

Более того, куайн существует в любом языке, способном выводить произвольную вычисляемую строку! Впервые эта идея была описана Полом Братли и Жаном Милло. А первым куайном считается программа, написанная на языке Atlas Autocode Хэмишем Дюаром.

А на современных языках?

Да пожалуйста:

JavaScript:

Pascal:

Итак. Мы убедились, что такие программы существуют, а теперь немного теории о том, как их сделать.

Грабли

Интуитивно понятно, что нужно вывести значение переменной, в которой хранится частичный код программы. Почему частичный? Потому что само присваивание переменной тоже должно оказаться в значении переменной. Иными словами, значение переменной должно копировать само себя, из-за чего возникает бесконечная рекурсия. Неприятный момент.

Чтобы исправить положение, вообще не будем вносить в переменную сам факт присваивания. То есть:

После, во время вывода подставим значение с в её же определение.
Хорошо, но возникает проблема с кавычками. Языки, в которых определены одинарные и двойные кавычки, справляются с проблемой хорошо (мы говорим о том, что можно создать переменную q=» ‘ «, а потом вывести ее значение в ее определение), но что делать, например, с языком С? Экранирование, очевидно, не поможет, так как его тоже надо экранировать… В этом случае, можно задать кавычки кодом символа и вывести его.

Теперь остается проблема вставки строки в выходную строку с. Здесь вспомним про printf и всю его мощь.

Чаще всего методы взятия подстроки умеют брать её до конца:

Практика

Мы не будем лишать вас удовольствия написать собственный куайн, но покажем парочку экзотических примеров.

PHP

SQL

Python

Perl

Высший пилотаж

Куайн, выводящий собственный код, это, конечно, хорошо. Но как вам идея куайна, который пишет другой код, являющийся куайном. Причем результатом работы последнего является первоначальный куайн! Заманчиво, не так ли?

Такого рода программы называются цепные куайны, и на сегодняшний день, самый большой цепной куайн (длина цепи уже достигла 100 языков) написан японцем Юсукэ Эндо.

Для того, чтобы работало:

Ну и, соответственно, результат каждой программы нужно запускать самим:

Несложно убедиться в том, что результатом всей этой цепи является первоначальная программа.

Ах да, языки программирования в куайне расположены в алфавитном порядке.

Куайны

По мотивам данных из интернета: один, два, три, WiKi, Habr.