# Self reproducing programs

### Self reproducing programs of the first kind: quines
Self reproducing programs are programs that reproduce the source they originate from,
see also 
[quine](https://en.wikipedia.org/wiki/Quine_%28computing%29)

A very simple example:


      #!/bin/bash
      # this is a self reproducing program
      cat $0


In fact, this example cheats, it is making use of the fact the the source is available,
and it asks the operating system to produce a copy of that source to standard output.

On [this page](https://www.nyx.net/~gthompso/self_sh.txt) some examples of real
self reproducing shell scripts is available, for example this one:

      #! /bin/sh
      q="'" qq='echo \#! /bin/sh;echo q=\"$q\" qq=${q}$qq$q;echo eval $qq'
      eval $qq

A nice story about self reproducing zips is [here](https://research.swtch.com/zip) .

A comprehensive article on self reproducing programs is [here](http://www.madore.org/~david/computers/quine.html) .

I guess, that the mathematicians among us can read about
[Kleene's recursion theorem](https://en.wikipedia.org/wiki/Kleene's_recursion_theorem)
but that article is far beyond my capabilities. 

In the year 2004 I played with
self reproducing programs, telling my boss that that was a very important thing to
do: With a self reproducing program, the changes that the source gets lost are minimized.


Here I present [a recipe](../selfrep/recipe) that can be used to convert practically 
any program written in practically
any language into a self-reproducing program.

### Self reproducing programs of the second kind

Above is described how to generate a self reproducing program that consists of one 
source file. In practice, however, most programs consist of more files and folders and
it would be nice to make them self-replicating also.

In the [examples](examples) you will find an example, and you will see that it is easier
to make a self replicator of the second kind than making a self replicator of the first kind,
in fact: it is almost trivial. Despite the triviality, I never saw an example so here is one.

It works as follows:

Create something that is able to generate an representation of the tar-ball of the
source tree. This representation should not to go in the tar-ball. The representation
must be usable by the language of your choice to produce the tar-ball, be it in the form
of a regular file or on standard output. (In stead of a tar-ball you can opt for a zip file
or something else that is appropriate). And then, take care that this representation is
used to generate the tar-ball when the program is run with a special flag, environment
variable, time of day, or whatever you like.

The [example](examples) will make things more clear. 

Btw: the program [xsnow](/xsnow) is also a self replicating program of the second kind,
there the result of `make dist` (a target generated by automake) is used to generate the
tar-ball.

