 <p>In general it depends on the target. On small targets (i.e. microcontrollers like AVR) you don't have that complex programs running. Additionally, you need to access the hardware directly (f.e. a UART). High level languages like Java don't support accessing the hardware directly, so you usually end up with C. </p> <p>In the case of C versus Java there's a major difference:</p> <p>With C you compile the code and get a binary that runs on the target. It <em>directly</em> runs on the target.</p> <p>Java instead creates Java Bytecode. The target CPU cannot process that. Instead it requires running another program: the Java runtime environment. That translates the Java Bytecode to actual machine code. Obviously this is more work and thus requires more processing power. While this isn't much of a concern for standard PCs it is for small embedded devices. (Note: some CPUs do actually have support for running Java bytecode directly. Those are exceptions though.)</p> <p>Generally speaking, the compile step isn't the issue -- the limited resources and special requirements of the target device are.</p>