セルフホスティング

セルフホスティング（）は、ツール群やオペレーティングシステムの一部であるプログラムを使って、同じプログラムの新しいバージョンを作ることを指す。例えば、コンパイラでそのコンパイラ自身のソースコードをコンパイルすることなどを意味する。セルフホスティング・ソフトウェアはパーソナルコンピュータや大型のシステムでよく使われる。その他にセルフホスティングとなっている典型例としては、カーネル、アセンブラ、シェルなどがある。
全くソフトウェアが書かれていない新しいシステムの場合、ソフトウェアは別のセルフホスティングシステム上で開発され、ターゲットの新システムが読み取れる記憶装置に格納される。この形態の開発は、ターゲットシステムがある程度の信頼性を持って自身の開発に利用できるようになるまで続けられる。例えば、Linuxオペレーティングシステムの開発は、当初MINIXシステム上で行われた。新たなシステムで使うソフトウェアを、このような別のホストシステムを使わずに開発することは非常に珍しく、多くの場合不可能である。
プログラミング言語にも、セルフホスティング方式、すなわちコンパイラがその言語で書かれているものがある。新規のプログラミング言語の最初のコンパイラは、別の言語（場合によっては機械語）で書かれるか、ブートストラップ方式で開発される。セルフホスティング言語としては、LISP、Forth、Pascal、Delphi、C言語、Modula-2、Oberon、Smalltalk、OCaml、FreeBASIC、Haskell などがある。
歴史.
最初のセルフホスティング式コンパイラ（アセンブラを使わずに開発されたコンパイラ）は、1962年にMITのHartとLevinが開発したLISP 1.5コンパイラであった。LISPインタプリタがそれ以前に存在していたが、コンパイラは無く、独自の方式でコンパイラをコンパイルした。コンパイラ自体がLISPで書かれていて、他のLISPプログラムと同様、LISPインタプリタ上でも動作可能であった。そこで彼らはコンパイラをインタプリタ上で動作させ、自分自身のソースコードを入力としてコンパイルさせた。
この技法はインタプリタが事前に存在していて、コンパイラと言語仕様がほぼ同じ場合にのみ適用可能である。このような自分自身の動作の定義を入力とするという考え方は理論計算機科学での様々な証明で使われており、チューリングマシンの停止問題の決定不能性の証明などにも使われている。