На днях я читал статью под названием Размышления о доверии к доверию Кена Томпсона, хакера, которого я глубоко уважаю. В нем он в какой-то момент описывает, что такое квайн и как его написать, если вы сами никогда не проходили через это испытание:

[…] проблема состоит в том, чтобы написать исходную программу, которая при компиляции и выполнении будет давать на выходе точную копию своего исходного кода. Если вы никогда не делали этого, я призываю вас попробовать это самостоятельно. Открытие того, как это сделать, — это откровение, которое намного превосходит любую пользу, получаемую от того, что вам говорят, как это делать.

В той же статье он также рассказывает о том, как написание на Фортране повышает уровень «радости»:

[…] было написать самую короткую самовоспроизводящуюся программу. Так как это упражнение оторвано от реальности, то обычно в качестве носителя использовался ФОРТРАН. На самом деле язык FORTRAN был выбран по той же причине, по которой популярны гонки на трех ногах.

Я бы порекомендовал вам прочитать короткую статью самостоятельно, так как она интересна далеко за пределами информации, содержащейся в этом задании. Тем не менее, вызов был дан, и я сопротивлялся желанию принять его! … на день.

Вы можете найти мои решения, встроенные в эту статью, если вы просто хотите увидеть результат. Однако, если вы не знали, что такое куайн, пока не узнали, или никогда не готовили его сами, вам следует прекратить читать сейчас. Таким образом, вы можете испытать откровения (и безумие) на себе.

Фортран 90

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

Первым хорошим ресурсом, который я нашел, был Учебник по Fortran. Объяснения короткие и хорошо написаны, но их формат, безусловно, не уникален. Как оказалось, есть много подобных ресурсов для изучения Fortran. Этот учебник по me200c от Stanford был еще одним замечательным ресурсом, благодаря которому я узнал больше о таких темах, как модули.

Компиляцию кода Fortran можно выполнить с помощью GNU Fortran. Он входит в состав gcc, хотя его можно загрузить отдельно. В OSX вы можете просто загрузить gcc через Homebrew, и все готово.

моя первая попытка

Достаточное знакомство с Fortran 90 для написания простых игрушечных программ не займет много времени, если вы не новичок в программировании. Однако это не означает, что вы готовы настолько извращать свой разум, чтобы действительно написать в нем свой первый квайн.

Очевидно, что моя первая попытка ни к чему не привела, как вы сами видите выше. Python — это язык, который мне нравится использовать для быстрого решения проблем, для развлечения и получения прибыли. Поэтому я решил сменить направление и попытаться портировать свой код с Фортрана на python, чтобы он заработал. Как оказалось, это была неплохая идея, и я быстро создал следующее решение, которое успешно воспроизводит себя при запуске:

Это решение можно протестировать локально, запустив следующий код оболочки:

Было весело придумывать это длинное решение, но первоначальная задача решить его на Fortran осталась открытой. Однако я был немного ближе и только что создал Quine, столь же бесполезный, как выключатель, который сам себя выключает. Вот что я узнал из решения python:

  • Символ кавычки не может быть экранирован (легко). Вместо этого вы должны полагаться на функцию, которая генерирует этот символ на основе его кода ASCII. Если вы попытаетесь сбежать от него, то заметите, что во многих ситуациях ваш скрипт сам себя портит;
  • Открытые пробелы в массиве вашего исходного кода позволяют вам избежать бесконечного круга самовоспроизводящегося кода;

Назад к Фортрану 90

Я знал, что могу добиться большего, особенно на таком гибком языке, как python. И как оказалось, это уже сделано. Однако цель взлома моего Fortran-решения в python заключалась исключительно в том, чтобы выяснить, что пошло не так в моей первоначальной попытке.

Благодаря моему решению python я вновь обрел уверенность, чтобы попробовать его в Fortran. Применяя то, что я узнал, я нашел следующее решение:

Время для эстафеты

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

Назовите меня сумасшедшим, но это заставило меня ценить квины еще больше. На следующее утро я придумал себе новую задачу. Что, если я напишу программу Fortran, которая запишет программу python, которая запишет оригинальную программу Fortran?

Такие программы называются программами уробороса или квайн-реле, о которых я узнал позже. Я могу оценить концепцию, названную в честь мифической змеи, пожирающей себя. После некоторого завтрака мне удалось найти следующее решение, к моему собственному удивлению:

Это решение можно протестировать локально, запустив следующий код оболочки:

Назад к здравомыслию

Выполнение задачи по написанию квайн, безусловно, заполнило мои выходные больше, чем я себе представлял. Я даже открыл для себя концепцию мультихина, которая могла бы стать отличной последующей задачей. Приоритеты, однако, важны, и я решил, что пока уделяю этой теме достаточно времени.

Если подумать, написание quine — идеальная задача для собеседования по программированию. Он сатирически размышляет над абсурдным процессом некоторых собеседований при приеме на работу в дикой природе.

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