Your usual PC runs an operating system (OS). Often used OSs include Linux, BSD, OS X, Android, Windows and many others. Main point of an OS is to cover hardware abstraction. As a result, an application no longer tells the hardware which bits to change to what, it simply tells the OS to write a file. Advantage of this is, the 'write to file' command is always the same for a given OS, no matter which hardware the application runs on.
'Bare metal' means that there is no operating system, no standard library, no user management, much less a user privilege system. Whatever is done to hardware, the application does it directly (and has to know on how to do it).
Having no OS has a number of drawbacks, but also advantages important for controllers:
People typically create a bare-metal application on a PC with a cross-compiler such as a compiler for arm, and then transfer the executable to the target hardware using a bootloader such as the LPC1114 Bootloader.
Compilers usually support building for bare metal, but need additional parameters, like
There are libraries which provide OS-like functionality, e.g. functions to write a file to a storage medium. Using such libraries can provide a programming experience similar to when coding for an OS. Still these libraries have to be linked in directly.
Precompiler-optimisations. It's a good idea to let the precompiler do one-time calculations as much as possible. Then only the result is stored in the binary, saving the calculation effort at runtime. Teacup Firmware uses this strategy a lot, making it about double as fast and half as big as compareable printing firmwares.