With slightly different concepts of “self-hosting”:
- Compilers (if the compiler can compile itself e.g. gcc, GHC, many others)
- Operating systems (either in terms of development of the OS, or virtual machines run on the OS)
- Build tools (e.g. make, autoconf etc.)
- Version Control Systems (git, mercurial etc.)
- Testing libraries and tools
- Bug tracking tools (e.g. Trac)
- Editors and IDEs (if you use the editor/IDE to develop itself)
- File distribution servers (e.g. web server, bittorrent client/server, which can be used to distribute themselves.)
- Grammar definition languages (e.g. BNF, which can be described in BNF)
- Package management tools (apt, Cabal etc)
- Documentation tools (e.g. Sphinx)
- Manufacture of robot parts
- An item in a list that depends on self-reference to be properly understood, like this one :-)
I'm struggling to define this concept exactly. A common thread with all of them is that there will be some kind of boot-strapping problem before maturity is reached. Also, most of these things can be classified more simply as “software development tools” — due to the fact that most software development tools are software, there is the possibility of this kind of “recursion”.
Are there other things in this category that I haven't thought of? Are there lots of areas of life outside the software world where this is common?