[go: nahoru, domu]

Hoppa till innehållet

Quine

Från Wikipedia
För filosofen Quine, se Willard Van Orman Quine
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).

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".

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.

  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.

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
  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.