Куайн (програмування) Вікіпедія

Куайн(квайн, англ. quine ) - Комп'ютерна програма, яка видає на виході точну копію свого вихідного тексту. При цьому програми, що використовують зовнішні дані (читання тексту програми з файлу, введення його з клавіатури і так далі), куайна не вважаються. Крім того, не вважається куайном «програма», яка не містить взагалі жодного коду (вироджений випадок).

У книзі «Етюди для програмістів» Чарльза Уезерелла сформульовано суворішу умову: програма не повинна користуватися прийомами, що дозволяють отримати доступ до свого вихідного коду, що зберігається в пам'яті завантажувача або інтерпретатора. Тому куайни 10 LIST на бейсику та SOURCE TYPE мовою Форт – не зовсім чесні.

Термін отримав назву від імені американського логіка та філософа Уілларда Ван Ормана Куайна (1908—2000), який займався поглибленим вивченням непрямої самореференції (англ. indirect self-reference).

Куайни можливі в будь-якій тьюрінг-повній мові програмування як наслідок теореми Кліні про рекурсію. Ідея куайнів була вперше описана Полом Братлі (англ. Bratley, Paul) і Жаном Мілло (англ. Millo, Jean) в «Computer Recreations; Self-Reproducing Automata», Software - Practice & Experience, випуск 2 (1972), с. 397-400. Братлі зацікавився саморепродукуванням програм після знайомства з першою такою програмою, написаною мовою програмування Atlas Autocode в Единбурзі в 1960-х роках викладачем та дослідником Хемішем Дюаром (англ. Hamish Dewar).

Ось вихідний текст цієї програми:

Куайн n-го порядку

Куайном n-го порядку для 1 n> 1 1>1> називається програма, яка виводить на екран такий код A 1 & gt; що ∀ k : 1 k n > виводить на екран код A k > . Прицьому код A n − 1 > виводить на екран код початкової програми.

Ланцюговий куайн

Ланцюговим куайном для списку мов програмування A 1 . . . , A n . A_> називається такий код мовою A 1 > , що за чергового запуску всіх кодів ∀ k n > виводить довільний код мовою A k + 1 > . При цьому згенерований у результаті n − 1 кроків код мовою A n > виводить на екран початковий код мовою A 1 > .

Японський програміст Юсуке Ендо в 2013 році створив ланцюговий куайн для n = 50 з початком мовою програмування Ruby (втім, згідно з визначенням, завдяки циклічності алгоритму за наявності кодів усіма мовами починати виконання циклу можна з будь-якого з них). Мови програмування в куайні розташовані за абеткою. До 2018 року він довів кількість мов у цьому куайні до 128. [1] .

Інші варіації

Юсуке Ендо також створив псевдокуайн на Ruby, який виводить свій текст за допомогою псевдоанімації (промальовування нових комбінацій символів на консолі із заданим інтервалом).

Також своєрідною математичною варіацією куайна можна вважати самореферентну формулу Таппера — нерівність, точки істинності якої у певній області площини малюють цю формулу.