The real “kicker” is that you can’t do native development with embedded code. In other words, you can’t program the microcontroller just using the microcontroller the way you can create desktop applications using a desktop computer. Instead, you need to have a host and a target. The host is the computer you use for development (such as a normal desktop unit) while the target is the thing you’re developing for (the embedded application). The compiler that you use is technically referred to as a cross-compiler because it creates machine code for a processor other than the one the host uses. For example, your PC might use a Pentium processor, but the cross-compiler that runs on it creates machine code for a specific Atmel AVR microcontroller. To test your code, you need to either simulate the target on the host, or you can download the compiled code to the target and test it there. This is an extra, but unavoidable, step.