OK, well....
Editor: you write the C code in plain text in whatever editor take your fancy. For instance:
#define MESSAGE "Hello world"
int
main(int argc, char **argv)
{
printf("%s", MESSAGE);
return 0;
}
Preprocessor: takes your code and does various things to it. Prepocessor commands generally start with '#', and in the example above the command is to define the string MESSAGE to mean "Hello world". The preprocessor just replaces MESSAGE, wherever it occurs, with "Hello world". The result is for printf, which outputs text to the console, to send "Hello world" rather than MESSAGE.
Note that the preprocessor is generally part of the compiler so unless you specifically ask for it you wouldn't see the processed output before the compiler gets it.
Compiler: takes the code (after preprocessing) and translates the statements into processor op-codes. For example, the code "var = 52" might translate to "mov a, 0x34". The latter would be fed through an assembler to create the binary code for the processor to execute. Some compilers may skip the assembler step and go straight from C code to binary data.
Assembler: converts the assembler output from the compiler into binary data the processor can run. In the above case, the assembler "mov a, 0x34" may resolve to "23 34" where '23' means 'mov a' (that is, move some value into the a register) and '34' is the value to use.
Linker: The output from the assembler needs to be placed into specific parts of the processor memory map, which is what the linker does. Having set the memory address of various things, the code that references those things needs to be updated to use the actual address, and this is also what the linker does.
Loader: This is a bit too broad. Basically you need to get the program, which your code defined and the compiler compiled and the linker linked, in the real memory of your processor, and this is what the loader does. Depending on the target it may be some file on external storage that is read into memory when required (which I think is your desired definition). If the program is already in memory (say, programmed into flash) then the loader may mean the part of code that copies various data into RAM.