Thanks for this—it’s important to keep in mind that a LOT of systems are easier to sustain or expand than to begin. Perhaps most systems face this.
In a lot of domains, this is known as the “bootstrap” problem, based on the concept of “lift yourself up by your bootstraps”, which doesn’t actually work well as a metaphor. See Bootstrapping—Wikipedia
In CS, for instance, compilers are pieces of software that turn source code into machine code. Since they’re software, they need a complier to build them. GCC (and some other from-scratch compilers, but many other compilers just depend on GCC) includes a “bootstrap C compiler”, which is some hand-coded (actually nowadays it’s not, it’s compiled as well) executable code which can compile a minimal “stage 2″ compiler, which then compiles the main compiler, and then the main compiler is used to build itself again, with all optimizations available.
In fact, you’ve probably heard the term “booting up” or “rebooting” your computer. This is a shortening of the word “bootstrap”, and refers to powering on without any software, loading a small amount of code from ROM or Flash (or other mostly-static store), and using that code to load further stages of Operating System.
Yep, compilers and booting are good examples. Making a compiler from scratch is a pain in the rear, making a second compiler when you already have the first is easier.
For a concrete example: I once screwed up my operating system and got it into a state where it wouldn’t boot. Downloading a fresh copy of an OS is pretty straightforward, if you have a working copy of an operating system already, but I didn’t. In this case, I wound up asking a friend to download a copy and then used that to get my machine working again.
Gah! I missed my chance to give one of my favorite Carl Sagan quotes, a recipe for Apple Pie, which demonstrates the universality and depth of this problem:
If you wish to make an apple pie from scratch you must first invent the universe.
Thanks for this—it’s important to keep in mind that a LOT of systems are easier to sustain or expand than to begin. Perhaps most systems face this.
In a lot of domains, this is known as the “bootstrap” problem, based on the concept of “lift yourself up by your bootstraps”, which doesn’t actually work well as a metaphor. See Bootstrapping—Wikipedia
In CS, for instance, compilers are pieces of software that turn source code into machine code. Since they’re software, they need a complier to build them. GCC (and some other from-scratch compilers, but many other compilers just depend on GCC) includes a “bootstrap C compiler”, which is some hand-coded (actually nowadays it’s not, it’s compiled as well) executable code which can compile a minimal “stage 2″ compiler, which then compiles the main compiler, and then the main compiler is used to build itself again, with all optimizations available.
In fact, you’ve probably heard the term “booting up” or “rebooting” your computer. This is a shortening of the word “bootstrap”, and refers to powering on without any software, loading a small amount of code from ROM or Flash (or other mostly-static store), and using that code to load further stages of Operating System.
Yep, compilers and booting are good examples. Making a compiler from scratch is a pain in the rear, making a second compiler when you already have the first is easier.
For a concrete example: I once screwed up my operating system and got it into a state where it wouldn’t boot. Downloading a fresh copy of an OS is pretty straightforward, if you have a working copy of an operating system already, but I didn’t. In this case, I wound up asking a friend to download a copy and then used that to get my machine working again.
Gah! I missed my chance to give one of my favorite Carl Sagan quotes, a recipe for Apple Pie, which demonstrates the universality and depth of this problem: