Quine (Computerprogramm)



Ein Quant ist ein Computerprogramm , das eine eigene Quelltxtes wie Ausgabe schreibt. Es handelt als eine Form der Selbstbezüglichkeit .

Hacker und Geeks Sehen es als Sportliches Herausforderung, kleinstmöglichen Quine in sterben Programmiersprachen ihrer Wahl zu erstellen (siehe IOCCC ).

Quines sind nach dem Logiker und Philosoph Willard Van Orman Quine benannt.

Bau von Quines

Frage dich selbst

Ein Quine ließe in einem C -ähichichen Pseudo-Code so schreiben [1]

main () {
 drucke mich aus .
}

Üblicherweise Werden C – Programme übersetzt , d. H. Die Laufzeitversion des Applications Liegt in Maschinensprache vor (Repräsentation als Folge von Bytes , abgespeichert in Einem sogenannten Binara Datei), seine Ursprüngliche Repräsentation ist jedoch in der Regel eines ASCII -codierter Quelltext wo zudem noch in Einem other Datei abgelegt ist. Der für diesen Ansatz zur Implementierung eines Quine Benötigte zugriff Auf die eigene Repräsentation ( mich ) wäre auch sehr kompliziert.

Weiter fordert man für ein Quine, es ist abgeschlossen.

  • Gerne können Sie auch die Außenseite besuchen.Bitte beachten Sie den Zugriff auf Ihre eigene Quelltextdatei.
  • Ebenso soll die Wesentliche – Code im Quine selbst vorhanden sein, Weshalb extern Die Leistung von nur spärlich genutzt Werden Soll, stirbt Bibliotheksfunktion ein Zeichen ausgibt ETWA noch ist Zulässig.

Nur Wenige Sprachen unterstützen Selbstbezüglichkeit ( Reflexion ) in der Formular that ein Applications of this language zugriff auf seine eigene Repräsentation hat.

Eine interpretiert Programmiersprache, Wie zum beispiel Perl oder Python , hätte es prinzipiell leichter, wenn Sie vom Interpreter Benötigte Repräsentation Dezember auszuführenden Programm Auch sie Selb verfügbar machen Könnte, aber in der Regel Wird das nicht Unterstützt, zum beispiel aus Sicherheitsgründen, oder Weil sterben sterben Designer der Sprache nicht so weit gehen will (zum beispiel Weil selbstmodifizierender – Code abgelehnt Wird). Meist SIND sie Programm dort nicht viel mehr Möglich Reflexion, als Sein Name und sterben Namen Wadenfänger Die Variable und die Leistung der vom Laufzeitsystem zu erfahren.

Reflexion führt dazu in den meisten Programmieranfragen keine korrekte Quine.

Code als Daten

Diejenigen, die zu dem Programm eingeladen wurden, werden Ihnen gerne mit dem Programm helfen,

  • Solche Analysen ( Parsen ),
  • aus vorhandenen Repräsentationen neuen Programm zu erzeugen ( Komposition ) und insbesondere
  • das repräsentierte Programm auszuführen ( Anwendung ).

Ein Bekanntes Anwendungsbeispiel wäre ein Funktionsplotter , das ist ein Programm zum aufgetragen , wo Graph Beliebers Mathematisch Die Leistung.

Meine Warzen Würze:

Für Funktionen gibt es für Programmiersprachen keinen angepassten Datentypen mit entsprechenden Operationen.

In C Stück Applikationen – Code in Einer ein Kann man Zeichenkette AbleGet, Mann Kann aber wenig DAMIT Anfang, denn of this ist mit den mitteln von C nur aufwendig zu analysieren und auszuführen. Man muss Dann zu Komplex verpointerten Struktur und extern Bibliotheken greifen.

Ein positives Beispiel für LISP , weil hier Programmcode sehr einfach representiert und manipuliert werden kann.

Quinierung

Wer mit der Schwierig- keit arbeitet, die ein Programm hat, wird eine eigene Struktur haben. Dennoch Muss es available in C Möglich sein, EIN Quine zu Realisiert (siehe sterben Ausführung zur eXistenZ von Quine im Theorieteil). Dazu wird folgende Technik verwöhnt:

Wenn Sie Ihren eigenen Struktur-Cousin finden, können Sie ihn von vornherein löschen.

Man entpackt das Programm in zwei Teilen, in einem, den man den Code und die Daten eingeben kann. Die Daten repräsentieren den Kodex (BZW. seine Text Form) und sie sind auf Einems algorithmischen Weg vom Kodex hergeleitet (meistens, INDEMAR Anführungszeichen Gesetzt gerechnet wurden, manchmal aber noch Auf eine leicht kompliziertere Weise). Dort verwendet Code die Daten, um den Code auszugeben (war einfach, als die Daten den Code nahmen); formte die Daten, war die Daten, die in einer algorithmischen Transformation gemacht wurden.

Wie oben ausgeführt, geht das in Einigen Sprachen leichter und in anderen Schwierig, zum beispiel je Once, Ob die Leistung der Bürger erster Klasse dort Sprache Sind, oder nicht.

Im Strings Sinn soll Quines vom Zeichensatz unabhängig sein, und Quellcode soll genau jeden Zeilenwechsel genau wieder gegeben werden.

Sprache beispiel Hinweise
Lispeln
(( Lambda ( x )
 ( Liste x ( Streifen ( Zitat Zitat ) x )))
 ( Zitat
 ( lambda ( x )
 ( Liste x ( Streifen ( Zitat Zitat ) x )))))
gehen
verpacken Haupt
Import "FMT"
func Haupt () {
FMT . Printf ( "% s% c% s% c \ n" , s , 0x60 , s , 0x60 )
}
wobei s = `
Paket
Hauptimport" fmt "
func main {
fmt.Printf ("% s% c% s% c \ n ", s, 0x60, s, 0x60)
}
wobei s =`
C
#include <stdio.h>
char * f = "#einschließen <stdio.h>% cchar * f =% c% s% c; main () {printf (f, 10.34, f, 34.10); }% c " ; main () { printf ( f , 10 , 34 , f , 34 , 10 )}
Verwendet wurde die ASCII-Kodierung des Anführungszeichens
Lua
a = "a =% c% s% c; io.schreiben (string.format (a, 34, a, 34))" ; io.write ( Zeichenfolgenformat ( a , 34 , a , 34 ))
Verwendet wurde die ASCII-Kodierung des Anführungszeichens
Python 2
a = "a = % c% s% c ; drucke ein %% (34, a, 34)" ; Drucken ein % ( 34 , a , 34 )
Verwendet wurde die ASCII-Kodierung des Anführungszeichens
Python 3
a = "a = % c% s% c ; drucken (a %% (34, a, 34))" ; Drucken ( a % ( 34 , a , 34 ))
Verwendet wurde die ASCII-Kodierung des Anführungszeichens
Perl
$ a = '$ a =% c% s% c; printf ($ a, 39, $ a, 39,10);% c' ; printf ( $ a , 39 , $ a , 39 , 10 );
Verwendet wurde die ASCII-Kodierung des Anführungszeichens
Perl
$ r = '\'; $ _ = $ R; s / ([\\\ ‚\\\\]) / \\\\ 1 $ / g; print \ '$ r = \\\' \ '. $ _. $ r;
' ; $ _ = $ r ; s / ([\ '\\]) / \ $ 1 / g ; Druck '$ r = \' ' . $ _ . $ r ;
Vom Zeichensatz unabhängig
Perl6
my $ t = "; say \" my \\\ $ t = \ ", \ $ t.perl, \ $ t" ; sage "mein \ $ t =" , $ t . Perl , $ t
Rubin
setzt << 2 * 2 , 2
setzt << 2 * 2 , 2
2
Vom Zeichensatz unabhängig
Rubin
eval s = % q (setzt "eval s =% q (# {s})")
Vom Zeichensatz unabhängig
Rost
fn main () { lex x = "fn main () { \ n let x =" ; Lassen Sie y = "print! { \" {} {:}}; \ n lassen Sie y = {:?}; \ n {} \ " , x, x, y, y) \ n } \ n " ; drucken ! ( "{} {:?}; lass y = {:?}; {}" , x , x , y , y ) }
C #
Mit System ; Klasse Quine { static String f =
„Verwenden System; Klasse Quine {{static String f = {1} , {0} {1}; static void main () {{Console.Write (f, f, Convert.ToChar (34) );}}}} " ;
static void Haupt () { Konsole . Schreiben ( f , f , konvertieren . Toches ( 34 ));}}
Java
Klasse Q { public static Hohlraumhaupt ( String [] a ) { String f = „class Q {public static void main (String [] a) {String f =% C% s% 1 $ c; System.out.printf ( 34 f, f);}} " ; System . aus . printf ( f , 34 , f );}}
Nur eine Zeile
JavaScript
waren x = '„' + "; alert ( ‚var x = x + [9] + x [0] + x [9] + + + x + x);" ; alert ( 'var x =' + x [ 9 ] + x [ 0 ] + x [ 9 ] + '+' + x + x );
Schlaf
[{ $ s = '; print ("[{\ $ s =" .chr (39). $ s.chr (39). $ s);}]' ; Druck ( "[{ \ $ s =" . chr ( 39 ) . $ s . chr ( 39 ) . $ s );}]
PHP
$ vEngu = 96 ; printf ( $ c = '$ vengu =% s; printf (c = $% c% c% s $ vengu, 39, $ C, 39);' , $ vengu , 39 , $ C , 39 );
Pascal
const a = '; fange an zu schreiben (^ # ^ / ^. ^ 3 ^ 4 ^ `^! ^} # 39, a, # 39, a) ende. ; beginnen write ( ^ # ^ / ^. ^ 3 ^ 4 ^ ` ^ ! ^ } # 39 , ein , # 39 , A ) Ende .
Verwendet Escape-Sequenzen
Delphi
Programm quine ; {$ Anwendungsart CONSOLE} war x : String =
'application Quine; {$ Anwendungsart CONSOLE} var x:. String =; Begin Insert (# 39 + x + # 39, x, 46); WriteLn (x); ReadLn; end' ;
Begin Insert ( # 39 + x + # 39 , x , 46 ) ; WriteLn ( x ) ; ReadLn ; Ende .
ohne Zeilenumbrüche (wäre sonst zu lang für this Tabellen)

Theoretischer Hintergrund

Die eXistenZ von Quine Wird theoretisch Durch den Rekursionssatz (auch Fixpunktsatz von Kleene genannt) gesichert.

Grob stützt sich auf die Argumentation wie folgt:

  • Man Kann auf Eigenschaften von Programmiersprachen Durch ergebnisse der sterben Berechenbarkeitstheorie schließen, Welche sehr Einfache Modelle von Prog Rahmen Mathematisch EXAKT Analysiert.
  • Beobachten Sie alle Programme (Genau: Derens Endlich Quelltexte) abzählen, auch bijektiv Auf die natürlich Zahlen abbilden Kann, reicht in of this Modellwelt sterben Angabe Einer Naturlich Zahl als Repräsentation Eines Programm vollkommen aus. Diese Zahl liest Dasselbe, der der Quelltext ist, und erwähnt die Auswahl Genau der Funktion, die Semantik des Programms.
  • Ich diese Fixes gelesen werden, wie sie sind , und das ist ein Programm mit dieser Nummer{\ displaystyle q} (mit {\ displaystyle \ forall x: \ varphi _ {q} (x) = q}) gibt, seine Ausgabe (für alle möglichen Eingaben {\ displaystyle x}) wiederum de Zahl {\ displaystyle q}ist. Etwas ist das{\ displaystyle q}sowie Lemma der Berechenbarkeit Theory Genau das Ävivalent eines Programms, Welches Seine Repräsentierung Ausgibt – ein Quines.

Die aussagen aus der Berechenbarkeitstheorie für bere chen nur die Leistung von lassen sich leicht auf Turingmaschinen und DAMIT letztlich auf Beliebers Turing Vollständige Sprachen verallgemeinern.

Quine Sind Daher, nicht nur das Zufällig Plan Ergebnis FINDER Programmierer, Die Eine Programmiersprache Aust Ricksen, Es Handelt sich vielmehr um Eine grundlegende Eigenschaft Turing vollständiger Programmiersprachen, Dass sie für quine existieren.

Siehe auch

  • HQ9 + ( Esoterische Programmiersprache ) Gibt Profilierung mittels des Q -Befehls die Eigenen Quelltext aus.
  • Reproduktionen

Literatur

  • S. Barry Cooper: Berechenbarkeitstheorie. Chapman & Hall / CRC Mathematik, Boca Raton FL u. A. 2004, ISBN 1-58488-237-9 .
  • Douglas R. Hofstadter : Gödel, Escher, Bach . Ein Endloses Geflochtes Band. 16. Auflage. Klett-Cotta, Stuttgart 2001, ISBN 3-608-94338-2 .
  • Ken Thompson : Überlegungen zum Vertrauensvertrauen . In: Mitteilungen des ACM . Vol. 27, Nr. 8, August 1984, S. 761-763.

Weblinks

  • Ausführliche Seite zu Quines (Englisch)
  • Quines in gesprochenen Sprachen (Englisch)

Einzelstunden

  1. Hochspringen↑ Craig S. Kaplan: Die Suche nach einem selbstdokumentierenden Code