Quine (computing)

Self-replicating program
title: "Quine (computing)" type: doc version: 1 created: 2026-02-28 author: "Wikipedia contributors" status: active scope: public tags: ["source-code", "articles-with-example-c-code", "willard-van-orman-quine", "test-items-in-computer-languages", "computer-programming-folklore", "self-replication"] description: "Self-replicating program" topic_path: "linguistics" source: "https://en.wikipedia.org/wiki/Quine_(computing)" license: "CC BY-SA 4.0" wikipedia_page_id: 0 wikipedia_revision_id: 0
::summary Self-replicating program ::
::figure[src="https://upload.wikimedia.org/wikipedia/commons/d/d8/Java_implementation_of_a_quine_program.png" caption="A quine's output is exactly the same as its source code."] ::
A quine is a computer program that takes no input and produces a copy of its own source code as its only output. The standard terms for these programs in the computability theory and computer science literature are "self-replicating programs", "self-reproducing programs", and "self-copying programs".
A quine is a fixed point of an execution environment, when that environment is viewed as a function transforming programs into their outputs. Quines are possible in any Turing-complete programming language, as a direct consequence of Kleene's recursion theorem. For amusement, programmers sometimes attempt to develop the shortest possible quine in any given programming language.
Name
The name "quine" was coined by Douglas Hofstadter, in his popular 1979 science book Gödel, Escher, Bach, in honor of philosopher Willard Van Orman Quine (1908–2000), who made an extensive study of indirect self-reference, and in particular for the following paradox-producing expression, known as Quine's paradox:
::quote
"Yields falsehood when preceded by its quotation" yields falsehood when preceded by its quotation. ::
History
John von Neumann theorized about self-reproducing automata in the 1940s. Later, Paul Bratley and Jean Millo's article "Computer Recreations: Self-Reproducing Automata" discussed them in 1972.{{cite journal | last1 = Bratley | first1 = Paul | author-link1 = Paul Bratley | last2 = Millo | first2 = Jean | title = Computer Recreations: Self-Reproducing Automata | journal = Software: Practice and Experience | volume = 2 | issue = 4 | year = 1972 | pages = 397–400 | doi=10.1002/spe.4380020411 | s2cid = 222194376 Bratley first became interested in self-reproducing programs after seeing the first known such program written in Atlas Autocode at Edinburgh in the 1960s by the University of Edinburgh lecturer and researcher Hamish Dewar.
The "download source" requirement of the GNU Affero General Public License is based on the idea of a quine.{{cite web | url = http://www.softwarefreedom.org/technology/blog/2007/nov/21/stet-and-agplv3/ | title = stet and AGPLv3 | access-date = June 14, 2008 | last = Kuhn | first = Bradley M. | author-link = Bradley M. Kuhn | date = November 21, 2007 | publisher = Software Freedom Law Center | archive-url = https://web.archive.org/web/20080315231323/http://www.softwarefreedom.org/technology/blog/2007/nov/21/stet-and-agplv3/ | archive-date = March 15, 2008 | url-status = dead
Examples
Shortest proper quine
The shortest non-trivial quine in a major programming language (a "proper" quine) known as of 2020 is the 21 character JavaScript ES6 program ($=_=($=${$})())().
Constructive quines
In general, the method used to create a quine in any programming language is to have, within the program, two pieces: code used to do the actual printing and data that represents the textual form of the code. The code functions by using the data to print the code (which makes sense since the data represents the textual form of the code), but it also uses the data, processed in a simple way, to print the textual representation of the data itself.
Here are three small examples in Python3: ::code[lang=python3]
Example A. chr(39) == "'".
a: str = 'a: str = {}{}{}; print(a.format(chr(39), a, chr(39)))'; print(a.format(chr(39), a, chr(39))) ::
::code[lang=python3]
Example B. chr(39) == "'".
b: str = 'b: str = %s%s%s; print(b %% (chr(39), b, chr(39)))'; print(b % (chr(39), b, chr(39))) ::
::code[lang=python3]
Example C. %r will quote automatically.
c: str = 'c: str = %r; print(c %% c)'; print(c % c) ::
The following classic Java code (Java 1.5) demonstrates the basic structure of a quine. ::code[lang=java] public class Quine { public static void main(String[] args) { char q = 34; // Quotation mark character String[] l = { // Array of source code "public class Quine {", " public static void main(String[] args) {", " char q = 34; // Quotation mark character", " String[] l = { // Array of source code", " ", " };", " for (int i = 0; i < 4; i++) { // Print opening code", " System.out.println(l[i]);", " }", " for (int i = 0; i < l.length; i++) { // Print string array", " System.out.printf("%s%c%s%c,%n", l[4], q, l[i], q);", " }", " for (int i = 5; i < l.length; i++) { // Print this code", " System.out.println(l[i]);", " }", " }", "}", }; for (int i = 0; i < 4; i++) { // Print opening code System.out.println(l[i]); } for (int i = 0; i < l.length; i++) { // Print string array System.out.printf("%s%c%s%c,%n", l[4], q, l[i], q); } for (int i = 5; i < l.length; i++) { // Print this code System.out.println(l[i]); } } } ::
The source code contains a string array of itself, which is output twice, once inside quotation marks.
This code was adapted from an original post from c2.com, where the author, Jason Wilson, posted it as a minimalistic version of a Quine, without Java comments.
Following the introduction of the text blocks feature in Java 15, a more readable and simpler version is possible:
::code[lang=java] public class Quine { public static void main(String[] args) { String textBlockQuotes = new String(new char[]{'"', '"', '"'}); char newLine = 10; String source = """ public class Quine { public static void main(String[] args) { String textBlockQuotes = new String(new char[]{'"', '"', '"'}); char newLine = 10; String source = "%s%s%s%s"; System.out.print(source.formatted(textBlockQuotes, newLine, source, textBlockQuotes)); } } """; System.out.print(source.formatted(textBlockQuotes, newLine, source, textBlockQuotes)); } } ::
This is an example of a modern version of Java 25 code: ::code[lang=java] void main() { String s = """ void main() { String s = %c%c%c %s%c%c%c; IO.print(s.formatted(34, 34, 34, s, 34, 34, 34)); }"""; IO.print(s.formatted(34, 34, 34, s, 34, 34, 34)); } ::
The code above can be executed by simply dropping its content in any file with the extension, such as "", and then executed with "".
The same idea is used in the following SQL quine: SELECT REPLACE(REPLACE('SELECT REPLACE(REPLACE("$",CHAR(34),CHAR(39)),CHAR(36),"$") AS Quine',CHAR(34),CHAR(39)),CHAR(36),'SELECT REPLACE(REPLACE("$",CHAR(34),CHAR(39)),CHAR(36),"$") AS Quine') AS Quine
Eval quines
Some programming languages have the ability to evaluate a string as a program. Quines can take advantage of this feature. For example, this Ruby quine:
::code[lang=ruby] eval s="print 'eval s=';p s"
[[Lua (programming language)|Lua]] can do: s="print(string.format('s=%c%s%c; load(s)()',34,s,34))"; load(s)() ::
In Python 3.8: ::code[lang=python3] exec(s:='print("exec(s:=%r)"%s)') ::
"Cheating" quines
Self-evaluation
In many functional languages, including Scheme and other Lisps, and interactive languages such as APL, numbers are self-evaluating. In TI-BASIC, if the last line of a program returns a value, the returned value is displayed on the screen. Therefore, in such languages a program consisting of only a single digit results in a 1-byte quine. Since such code does not construct itself, this is often considered cheating.
::code[lang=basic] 1 ::
Empty quines
In some languages, particularly scripting languages, an empty source file is a fixed point of the language, being a valid program that produces no output.
Such an empty program, submitted as "the world's smallest self reproducing program", once won the "worst abuse of the rules" prize in the International Obfuscated C Code Contest. The program was not valid C (lacking a main() function) and was not actually compiled, but came with a Makefile which used cp to copy the empty file into another file, which would be executed as a shell script to print nothing.
Source code inspection
Quines, per definition, cannot receive any form of input, including reading a file, which means a quine is considered to be "cheating" if it looks at its own source code. The following shell script is not a quine: ::code[lang=bash] #!/bin/sh
Invalid quine.
Reading the executed file from disk is cheating.
cat $0 ::
A shorter variant, exploiting the behaviour of shebang directives: ::code[lang=bash] #!/bin/cat ::
Other questionable techniques include making use of compiler messages; for example, in the GW-BASIC environment, entering "Syntax Error" will cause the interpreter to respond with "Syntax Error".
Quine code can also be outputted visually, for example it's used to visualize the neutral zone in Yars' Revenge, along with syntactic saccharin, to obfuscate the source code.
Ouroboros programs
The quine concept can be extended to multiple levels of recursion, giving rise to "ouroboros programs", or quine-relays. This should not be confused with multiquines.
Example
This Java program outputs the source for a C++ program that outputs the original Java code. NOTE TO EDITORS: The following code is very fragile. If you edit it, be very careful not to break it -- verify that the output of the Java program is identical to the C++ program, and that the output of the C++ program is identical to the Java program.
::code[lang=cpp] import std;
int main(int argc, char* argv[]) { char q = 34; std::array<std::string, 36> l = { " ", "=============<<<<<<<< C++ Code >>>>>>>>=============", "import std;" "", "int main(int argc, char* argv[]) {", " char q = 34;", " std::arraystd::string l = {", " };", " for (int i = 19; i <= l.size(); ++i) {", " std::println("{}", l[i]);", " }", " for (int i = 0; i <= l.size(); ++i)", " std::println("{}{}{}{},", l[0], q, l[i], q);", " }", " for (int i = 2; i <= 17; ++i)", " std::println("{}", l[i]);", " }", " return 0;", "}", "=============<<<<<<<< Java Code >>>>>>>>=============", "public class Quine {", " public static void main(String[] args) {", " char q = 34;", " String[] l = {", " };", " for (int i = 2; i <= 17; ++i)", " System.out.println(l[i]);", " }", " for (int i = 0; i < l.length; ++i) {", " System.out.printf("%s%c%s%c,%n", l[0], q, l[i], q);", " }", " for (int i = 18; i <= l.length; ++i) {", " System.out.println(l[i]);", " }", " }", "}", }; for (int i = 19; i <= l.size(); ++i) std::println("{}", l[i]);; } for (int i = 0; i <= l.size(); ++i) std::println("{}{}{}{},", l[0], q, l[i], q); } for (int i = 2; i <= 17; ++i) std::println("{}", l[i]);; } return 0; } ::
::code[lang=java] public class Quine { public static void main(String[] args) { char q = 34; String[] l = { " ", "=============<<<<<<<< C++ Code >>>>>>>>=============", "import std;", "", "int main(int argc, char* argv[]) {", " char q = 34;", " std::arraystd::string l = {", " };", " for (int i = 19; i <= l.size(); ++i) {", " std::println("{}", l[i]);", " for (int i = 0; i <= l.size(); ++i) {", " std::println("{}{}{}{},", l[0], q, l[i], q);", " for (int i = 2; i <= 17; ++i) {", " std::println("{}", l[i]);", " }", " return 0;", "}", "=============<<<<<<<< Java Code >>>>>>>>=============", "public class Quine {", " public static void main(String[] args) {", " char q = 34;", " String[] l = {", " };", " for (int i = 2; i <= 17; ++i)", " System.out.println(l[i]);", " for (int i = 0; i < l.length; ++i)", " System.out.printf("%s%c%s%c,%n", l[0], q, l[i], q);", " for (int i = 18; i <= l.length; ++i) {", " System.out.println(l[i]);", " }" " }", "}", }; for (int i = 2; i <= 17; ++i) { System.out.println(l[i]); } for (int i = 0; i < l.length; ++i) { System.out.printf("%s%c%s%c,%n", l[0], q, l[i], q); } for (int i = 18; i <= l.length; ++i) { System.out.println(l[i]); } } } ::
Such programs have been produced with various cycle lengths:
- Haskell → Python → Ruby{{cite web |url = http://blog.sigfpe.com/2008/02/third-order-quine-in-three-languages.html |title = A Third Order Quine in Three Languages |author = Dan Piponi |date = 5 February 2008
- Python → Bash → Perl{{cite web |url = http://www.stratigery.com/source.html#Ouroboros |title = Ask and ye shall receive: Self-replicating program that goes through three generations, Python, Bash, Perl |author = Bruce Ediger |access-date = 2011-03-17 |archive-date = 2011-02-23 |archive-url = https://web.archive.org/web/20110223164033/http://www.stratigery.com/source.html#Ouroboros |url-status = dead
- C → Haskell → Python → Perl{{cite web |url = http://hpaste.org/43501/multiquine |title = multiquine |author = b.m. |date = 1 February 2011 |archive-url = https://archive.today/20130415050710/http://hpaste.org/43501/multiquine |archive-date = 2013-04-15 |url-status = dead
- Haskell → Perl → Python → Ruby → C → Java{{cite web |url = http://blog.sigfpe.com/2011/01/quine-central.html |title = Quine Central |author = Dan Piponi |date = 30 January 2011
- Ruby → Java → C# → Python{{cite web |url = http://ruslan.ibragimov.by/20-04-2013.quine-ruby-java-c-python |title = Quine Ruby - Java - C# - Python |author = Ruslan Ibragimov |date = 20 April 2013 |language = ru |access-date = 20 April 2013 |archive-date = 4 March 2016 |archive-url = https://web.archive.org/web/20160304040341/http://ruslan.ibragimov.by/20-04-2013.quine-ruby-java-c-python |url-status = dead
- C → C++ → Ruby → Python → PHP → Perl{{cite web |url = http://golf.shinh.org/reveal.rb?Quine/shinh+%28C+C%2B%2B+Ruby+Python+PHP+Perl%29_1194650418&rb |title = Quine by shinh (C C++ Ruby Python PHP Perl) |author = Shinichiro Hamaji |date = 10 November 2007
- Ruby → Python → Perl → Lua → OCaml → Haskell → C → Java → Brainfuck → Whitespace → Unlambda{{cite web |url = http://asiajin.com/blog/2009/09/22/uroboros-programming-with-11-programming-languages/ |title = Uroboros Programming With 11 Programming Languages |author = Ku-ma-me |date = 22 September 2009 |access-date = 17 March 2011 |archive-date = 29 August 2011 |archive-url = https://web.archive.org/web/20110829204605/http://asiajin.com/blog/2009/09/22/uroboros-programming-with-11-programming-languages/ |url-status = dead
- Ruby → Scala → Scheme → Scilab → Shell (bash) → S-Lang → Smalltalk → Squirrel3 → Standard ML → ... → Rexx (128 (and formerly 50) programming languages){{cite web |url = https://github.com/mame/quine-relay |title = Quine Relay - An uroboros program with 100+ programming languages |author = Yusuke Endoh |website = GitHub |date = 2 November 2021
- Web application → C (web application source code consists of HTML, JavaScript, and CSS){{cite web |url = http://michaelwehar.com/quines/c_prints_javascript.html |title = C Prints JavaScript |author = Michael Wehar |date = 10 November 2019 |language = en
Multiquines
David Madore, creator of Unlambda, describes multiquines as follows:{{cite web |url = http://www.madore.org/~david/computers/quine.html |title = Quines (self-replicating programs) |author = David Madore
::quote
"A multiquine is a set of r different programs (in r different languages – without this condition we could take them all equal to a single quine), each of which is able to print any of the r programs (including itself) according to the command line argument it is passed. (Cheating is not allowed: the command line arguments must not be too long – passing the full text of a program is considered cheating)." ::
A multiquine consisting of 2 languages (or biquine) would be a program which:
- When run, is a quine in language X.
- When supplied with a user-defined command line argument, would print a second program in language Y.
- Given the second program in language Y, when run normally, would also be a quine in language Y.
- Given the second program in language Y, and supplied with a user-defined command line argument, would produce the original program in language X.
A biquine could then be seen as a set of two programs, both of which are able to print either of the two, depending on the command line argument supplied.
Theoretically, there is no limit on the number of languages in a multiquine. A 5-part multiquine (or pentaquine) has been produced with Python, Perl, C, NewLISP, and F#{{cite web |url = https://github.com/rvantonder/pentaquine |title = Pentaquine - 5 part multiquine |author = Rijnard van Tonder |website = GitHub |date = 14 January 2020 and there is also a 25-language multiquine.{{cite web |url = https://github.com/coolwanglu/quine-chameleon#variants |title = Quine Chameleon#Variants |author = Lu Wang |website = GitHub |date = 21 May 2021
Polyglot
Similar to, but unlike a multiquine, a polyglot program is a computer program or script written in a valid form of multiple programming languages or file formats by combining their syntax. A polyglot program is not required to have a self-reproducing quality, although a polyglot program can also be a quine in one or more of its possible ways to execute.
Unlike quines and multiquines, polyglot programs are not guaranteed to exist between arbitrary sets of languages as a result of Kleene's recursion theorem, because they rely on the interplay between the syntaxes, and not a provable property that one can always be embedded within another.
{{Anchor|RADIATION}}Radiation-hardened
A radiation-hardened quine is a quine that can have any single character removed and still produces the original program with no missing character. Of necessity, such quines are much more convoluted than ordinary quines, as is seen by the following example in Ruby:{{cite web | url = https://github.com/mame/radiation-hardened-quine | title = Radiation-hardened Quine | access-date = 2014-02-24 | author = Yusuke Endoh | website = GitHub
::code[lang=ruby] eval='eval$q=%q(puts %q(10210/#{1 1 if 1==21}}/.i rescue##/
1 1"[13,213].max_by{|s|s.size}#"##").gsub(/\d/){["=\47eval$q=%q(#$q)#\47##\47
",:eval,:instance_,"||=9"][eval$&]} exit)#'##'
instance_eval='eval$q=%q(puts %q(10210/#{1 1 if 1==21}}/.i rescue##/
1 1"[13,213].max_by{|s|s.size}#"##").gsub(/\d/){["=\47eval$q=%q(#$q)#\47##\47
",:eval,:instance_,"||=9"][eval$&]} exit)#'##'
/#{eval eval if eval==instance_eval}}/.i rescue##/
eval eval"[eval||=9,instance_eval||=9].max_by{|s|s.size}#"##" ::
Automatic generation
Using relational programming techniques, it is possible to generate quines automatically by transforming the interpreter (or equivalently, the compiler and runtime) of a language into a relational program, and then solving for a fixed point.
Variants
Hashquines
A hashquine is a file that contains its own cryptographic hash. It is related to a quine but works differently. A quine is a program that produces its own source as output, while a hashquine is usually a static file, such as an image or binary, that has been constructed so that its cryptographic digest (for example SHA-256) appears inside the file itself.
Creating a hashquine normally involves giving the file a region of adjustable bytes and then searching for values that cause the final hash to match the value embedded inside the file. Some hashquines appear as images where the displayed hash is part of the picture and the entire image also hashes to that same value.
Hashquines do not execute or print anything. They illustrate fixed points in cryptographic hash functions and are considered a conceptual relative of quines rather than a type of quine in the strict programming sense.
Notes
References
References
- Alman, Ben. (December 2020). "GitHub Gist".
- "Quine Program".
- "JEP 378: Text Blocks".
- "Simple Java quine, self replicating (Self copying) Java code, with text blocks. This code can be run with Java 15+ or Java 13+ with special flags. License is public domain, no rights reserved".
- "1994/smr - Worst abuse of the rules".
- "Makefile".
- (2012-09-09). "Proceedings of the 2012 Annual Workshop on Scheme and Functional Programming". Association for Computing Machinery.
::callout[type=info title="Wikipedia Source"] This article was imported from Wikipedia and is available under the Creative Commons Attribution-ShareAlike 4.0 License. Content has been adapted to SurfDoc format. Original contributors can be found on the article history page. ::