Related to:
If you are writing co
The problem these days is that embedded can be anything from an ATTiny with 6 pins and a few bytes of RAM to a multi-core SBC running an embedded OS that would put some people's desktop computers to shame.
As such, the choice of langauge / development environment needs to take into account how efficient you need to be vs how complex the system is.
First off - C works everywhere and scales pretty well, the higher you go the more you'll end up calling external libraries etc. to handle the complexity.
For very small micros (measuring flash/ram in bytes) you are best off using ASM, when you get up to the kb range, C or any of the other traditional languages can be used as you don't need to count every byte. Once you have megabytes to play with you have both the ability and increasingly likely the requirement to use an RTOS to take care of everything and cut down development time. By the time you have hardware you could run a full blown OS on you can probably abstract yourself from the hardware and just write everything in a padded cell like Java or somesuch without worrying too much about how terribly wasteful it all is and how you're not a real programmer anymore... ;)
The exception to the above is when you need all the performance you can wring out of the hardware, at which point you may need to drop down a level or two to keep things efficient.