From my understanding, for a common microcontroller (e.g. AVR, PIC), there are generally two methods of programming its flash memory.
Using a programmer: In-Circuit Serial Programming (or some variant?) Some form of a boot-loader, to which an external device communicates, ultimately allowing the micro-controller to flash its own memory. Certainly there must be a very good reason to use a boot-loader, else its current widespread use would be very odd. I just haven't seemed to have fully grasped it yet.
Is it that a programmer is expensive? But then, there are Arduinos (At-mega micro-controller) which can function as programmers. Is the cost of one extra IC enough to warrant the use of a boot-loader? If I'm not mistaken, the latest Arduinos get rid of the FTDI chip altogether, replacing it with an At-mega processor that does the USB to serial interfacing. Surely it would be possible to integrate the programmer's function on this IC for instance?
Or take for example, the PIC micro-controller. There is something I've seen called the JDM programmer. If something like this, with virtually no active components, can program a PIC then,
Why use a boot-loader at all? What is the purpose of the relatively much more complex PICkit (aside from robustness)? Debugging capability?