Pull to refresh

Comments 4

была статья на хабре: Мультиквайногенератор
нужно вывести код различными способами
может вам будет интересна аналогия с жизнью: первому способу соответствует синтез белка по последовательности нуклеотидов, а второму репликация последовательности нуклеотидов
Для того, чтобы написать квайн, не обязательно писать квайн.
примерно также рассуждал Дж. фон Нейман, в книге "Теория самовоспроизводящихся автоматов."
Я изначально не собирался изобретать велосипед и решил просто ознакомится с Википедией Quine (программирование) и статьями на Хабре о создании квайнов, такие как Мультиквайногенератор (она самая), Как писать квайны, Эстафета из 50-ти квайнов и другие.
В Мультиквайногенераторе хотя и косвенно, но в уравнениях все-таки затронута тема квайнов. Я сократил количество переменных и из Q(F,f,g,h,i,j) получил Q(F,G), где F и G — функции вывода массива A[1,N] в разных представлениях. Для включение режима квайнов достаточно разделить массив A на A1 и A2, где в массиве A1 элементы от 1 до K, в A2 остальные [K+1,N] элементов, получим формулу Q(F(A1),G,F(A2)). Первоначально намеревался написать и развить из одной формулы в другую (описав процесс своего поиска), но в итоге решил что если K = N, тогда A2 = 0, F(0) = 0 и формула «режима Quine» приобретет вид Q(F,G) (на самом деле Q(F,G,0)). Добавить флаги на циклах вывода и у меня получается самая заурядная функция вывода массива байтов в виде текста или в виде HEX-констант.
Для того, чтобы написать квайн, не обязательно писать квайн.

примерно также рассуждал Дж. фон Нейман, в книге «Теория самовоспроизводящихся автоматов.»

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

Для реальных систем это как-то слишком сложно в реализации, а вот для программных единиц вполне реально. Оттуда и перешел к квайнам. А вот тут как раз
аналогия с жизнью: первому способу соответствует синтез белка по последовательности нуклеотидов, а второму репликация последовательности нуклеотидов

Как в реальной жизни — есть программа (организм), есть ДНК/РНК (исходный/исполняемый код). Есть функция Quine, которая выводит свой исходный код (ДНК), остальные функции можно менять по своему усмотрению. Если генные изменения сломает Quine-код — то клетка становится одноразовой (не может давать потомство). В реальной жизни аналогично, хотя и сложнее, как ассемблерный код для непосвященных.
Моя задача — в своей программе Quine-функции и иные системные вещи отладить и вынести в «закрытые» разделы (или даже в отдельную подсистему), остальные функции отдать на откуп генетическим/нейронным алгоритмам или же использовать библиотеки.
Но перед этим придется решить множество других задач по организации рабочего пространства, а конкретно: архитектура, эргономика, мультиязычность и др.
Решения этих задач планирую освещать в том числе на хабре. Надо же с чего-то начинать.
В своем генераторе я тоже попытался максимально упростить и автоматизировать создание квайна. Просмотрите мою статью, может вам интересно будет: Звездные войны в исходном коде. Кстати, игра Жизнь тоже там реализована в квайне.
Спасибо, посмотрел. Немного напоминает шаблонизаторы для web. По сути ваши маркеры => теги. Задумался над расширением своего квайна. Хотя в моем случае теги явно лишние, т.к. достаточно найти одно из ключевых слов и перед (после) этим ключом вставить нужный мне текст. Ключевых слов для поиска в синтаксисе паскаля не очень много:
+ uses (для вставки библиотеки при необходимости)
+ function, procedure, begin, end (для отслеживания начала подпрограмм или тела основной программы)
+ const, var (для добавления переменных)
При отсутствии ключевого слова (var|const необязательны для программы) достаточно найти место перед первой функцией/процедурой/телом программы. Еще необходимо в парсере записать отличия глобальных переменных от локальных.

В идеале моя программа должена будет найти свой исходник, обработать его до состояния квайна с возможностью вставки/удаления отдельных функций вплоть до расширения функциональности при вызове из командной строки с новыми ключами. При дальнейшем развитии программа станет сама себе SVN, IDE и прочий функционал для повышения ЧСВ программиста.
Sign up to leave a comment.

Articles