Bugün öğrendim ki: Quine, hiçbir girdi almayan ve tek çıktı olarak kendi kaynak kodunun bir kopyasını üreten bir bilgisayar programıdır.

Kendi kendini çoğaltan program

Bir quine, girdi almayan ve tek çıktısı olarak kendi kaynak kodunun bir kopyasını üreten bir bilgisayar programıdır. Hesaplanabilirlik kuramı ve bilgisayar bilimi literatüründe bu programlar için standart terimler "kendi kendini çoğaltan programlar", "kendi kendini üreten programlar" ve "kendi kendini kopyalayan programlar"dır.

Bir quine, bir yürütme ortamının bir sabit noktasıdır; bu ortam, programları çıktılarını dönüştüren bir fonksiyon olarak görüldüğünde. Quine'ler, herhangi bir Turing-tam programlama dilinde, Kleene'nin özyineleme teoreminin doğrudan bir sonucu olarak mümkündür. Eğlence için, programcılar bazen belirli bir programlama dilinde mümkün olan en kısa quine'i geliştirmeye çalışırlar.

Ad

[düzenle]

"quine" adı, popüler bilim kitabı Gödel, Escher, Bach'ta filozof Willard Van Orman Quine (1908–2000) onuruna Douglas Hofstadter tarafından icat edildi. Quine, dolaylı öz-referans üzerine kapsamlı bir çalışma yaptı ve özellikle Quine'in paradoksu olarak bilinen, paradoks üreten aşağıdaki ifade için:

"Tırnak içinde verildiğinde yanlışlık verir" tırnak içinde verildiğinde yanlışlık verir.

Tarihçe

[düzenle]

Kendi kendini çoğaltan otomatların fikri, hesaplamanın başlangıcından, hatta öncesinden geldi. John von Neumann, 1940'larda bunlar hakkında teoriler geliştirdi. Daha sonra, Paul Bratley ve Jean Millo'nun "Bilgisayar Eğlenceleri: Kendi Kendini Çoğaltan Otomatlar" adlı makaleleri, 1972'de bunları ele aldı.[1] Bratley, ilk olarak 1960'larda Edinburgh'daki Atlas Autocode'da Edinburgh Üniversitesi öğretim görevlisi ve araştırmacısı Hamish Dewar tarafından yazılmış bilinen ilk bu tür programı gördükten sonra kendi kendini çoğaltan programlarla ilgilenmeye başladı.

GNU Affero Genel Kamu Lisansı'nın "kaynak indir" gereksinimi, bir quine fikrine dayanmaktadır.[2]

Örnekler

[düzenle]

Yapıcı quine'ler

[düzenle]

Genel olarak, herhangi bir programlama dilinde bir quine oluşturmak için kullanılan yöntem, programın içinde iki parça olmasıdır: (a) gerçek yazdırmayı yapmak için kullanılan kod ve (b) kodun metinsel biçimini temsil eden veri. Kod, veriyi kullanarak kodu yazdırır (bu mantıklıdır çünkü veri kodun metinsel biçimini temsil eder), ancak aynı zamanda verinin metinsel temsilini yazdırmak için basit bir şekilde işlenen veriyi kullanır.

İşte Python3'te üç küçük örnek:

# Örnek A. chr(39) == "'". a = 'a = {}{}{}; print(a.format(chr(39), a, chr(39)))'; print(a.format(chr(39), a, chr(39)))

# Örnek B. chr(39) == "'". b = 'b = %s%s%s; print(b %% (chr(39), b, chr(39)))'; print(b % (chr(39), b, chr(39)))

# Örnek C. %r otomatik olarak alıntı yapar. c = 'c = %r; print(c %% c)'; print(c % c)

Aşağıdaki Java kodu, bir quine'in temel yapısını göstermektedir.

publicclass Quine { publicstaticvoidmain(String[]args) { charq=34;// Alıntı işareti karakteri String[]l={// Kaynak kod dizisi "public class Quine", "{", " public static void main(String[] args)", " {", " char q = 34; // Alıntı işareti karakteri", " String[] l = { // Kaynak kod dizisi", " ", " };", " for (int i = 0; i < 6; i++) // Açılış kodunu yazdır", " System.out.println(l[i]);", " for (int i = 0; i < l.length; i++) // Dize dizisini yazdır", " System.out.println(l[6] + q + l[i] + q + ',');", " for (int i = 7; i < l.length; i++) // Bu kodu yazdır", " System.out.println(l[i]);", " }", "}", }; for(inti=0;i<6;i++)// Açılış kodunu yazdır System.out.println(l[i]); for(inti=0;i #include usingnamespacestd; intmain(intargc,char*argv[]) { charq=34; stringl[]={ " ", "=============<<<<<<<< C++ Kodu >>>>>>>>=============", "#include ", "#include ", "using namespace std;", "", "int main(int argc, char* argv[])", "{", " char q = 34;", " string l[] = {", " };", " for(int i = 20; i <= 25; i++)", " cout << l[i] << endl;", " for(int i = 0; i <= 34; i++)", " cout << l[0] + q + l[i] + q + ',' << endl;", " for(int i = 26; i <= 34; i++)", " cout << l[i] << endl;", " return 0;", "}", "=============<<<<<<<< Java Kodu >>>>>>>>=============", "public class Quine", "{", " public static void main(String[] args)", " {", " char q = 34;", " String[] l = {", " };", " for(int i = 2; i <= 9; i++)", " System.out.println(l[i]);", " for(int i = 0; i < l.length; i++)", " System.out.println(l[0] + q + l[i] + q + ',');", " for(int i = 10; i <= 18; i++)", " System.out.println(l[i]);", " }", "}", }; for(inti=20;i<=25;i++) cout<>>>>>>>=============", "#include ", "#include ", "using namespace std;", "", "int main(int argc, char* argv[])", "{", " char q = 34;", " string l[] = {", " };", " for(int i = 20; i <= 25; i++)", " cout << l[i] << endl;", " for(int i = 0; i <= 34; i++)", " cout << l[0] + q + l[i] + q + ',' << endl;", " for(int i = 26; i <= 34; i++)", " cout << l[i] << endl;", " return 0;", "}", "=============<<<<<<<< Java Kodu >>>>>>>>=============", "public class Quine", "{", " public static void main(String[] args)", " {", " char q = 34;", " String[] l = {", " };", " for(int i = 2; i <= 9; i++)", " System.out.println(l[i]);", " for(int i = 0; i < l.length; i++)", " System.out.println(l[0] + q + l[i] + q + ',');", " for(int i = 10; i <= 18; i++)", " System.out.println(l[i]);", " }", "}", }; for(inti=2;i<=9;i++) System.out.println(l[i]); for(inti=0;i