För filosofen Quine, se Willard Van Orman Quine

En Quine är ett begrepp inom datorprogrammering och syftar på ett datorprogram som skriver ut sin egen källkod på skärmen. Vanliga benämningar för sådana program är "självreplikerande program", "självreproducerande program" och "självkopierande program".

En Quine skriven i programspråket Java
En Quines utdata är exakt densamma som dess källkod. (Syntaxmarkeringen som visas av textredigeraren i den övre halvan av bilden påverkar inte utdata från quinen).

Idén om självutskrivande program teoretiserades av John von Neumann redan på 1940-talet, men konkretiserades av Paul Bratley och Jean Millo 1972 i deras text "Computer Recreations: Self-Reproducing Automata".[1] Av Stephen Kleenes teorem om rekursion följer att det går att skriva en Quine i alla programspråk som är Turingkompletta.

Regler redigera

  1. Ska skriva ut sin källkod på skärmen.
  2. Får inte ta emot någon form av information över huvud taget (till exempel tangentbordstryckningar).
  3. Måste bestå av någon kod. Ett tomt program som inte skriver ut någonting (alltså uppfyller krav 1 & 2) räknas inte.

Exempel redigera

Följande kod i programspråket Java visar en relativt vanlig form av en Quine.

class Quine { 
  public static void main(String[] a) { 
    String t = "class Q { \public static void main(String[] a) { String t = %c%s%c; \System.out.printf(t, 34, t, 34); } }"; 
    System.out.printf(t, 34, t, 34); 
  } 
}

Här är ett något kortare exempel i Python.

a = 'a = {}{}{}; print(a.format(chr(39), a, chr(39)))'; print(a.format(chr(39), a, chr(39)))

Vissa programspråk, exempelvis Ruby, har förmågan att evaluera en sträng som ett program. Detta går att utnyttja vid konstruktionen av en Quine, likt exemplen nedan i Ruby och Lua.

eval s="print 'eval s=';p s"
s="print(string.format('s=%c%s%c; load(s)()',34,s,34))"; load(s)()

Det finns även vissa språk, exempelvis Scheme och andra Lisp-språk, APL (programspråk) och BASIC, där tal evaluerar sig själva. I sådana språk går det alltså att bygga en Quine med enbart ett tecken, se exemplet i BASIC nedan. Eftersom sådan kod inte konstruerar sig själv betraktas detta ofta som fusk.

1

Se även redigera

Referenser redigera

  1. ^ Bratley, Paul; Millo, Jean (1972-10). ”Computer recreations” (på engelska). Software: Practice and Experience 2 (4): sid. 397–400. doi:10.1002/spe.4380020411. https://onlinelibrary.wiley.com/doi/10.1002/spe.4380020411. Läst 29 maj 2023.