Language Bootstrapping

It is very common for a general-purpose, high-level programming language to be implemented using a minimal subset of itself. In other words, it is very common for a compiler/interpreter for a high-level language to be written in a minimal subset of that langauge (e.g. a Java Virtual Machine written in Java, or a C compiler written in C). This is called "bootstrapping."

Given that bootstrapping seems complicated, why do people bootstrap? There are a number of reasons for bootstrapping, but the two main reasons for doing it are: prestige and portability. In terms of prestige, there is a notion that if a language is not powerful enough to express an interpreter/compiler for itself, then it it cannot be considered to be a general-purpose and is not worth implementing; by writing the interpreter/compiler for that language in a subset of that language, one gives a constructive proof that the language is expressive enough to be used as a general-purpose programming language. The second reason, portability, is based on the idea that if the language is implemented in a minimal subset of itself, only the minimal subset needs to be recoded when switching platforms; since the remainder of the language is implemented using the minimal subset and not some platform-specific language, these other parts do not need to be rewritten.