Why do compilers produce assembly code?
Other reason for compilers to produce assembly rather than proper machine code are:


The symbolic addresses used by assemblers instead of hard-coding machine addresses
 make code relocation much easier.
Linking code may involve safety checks such as type-checking, and that's easier
 to do with symbolic names.
Small changes in machine code are easier to accomodate by changing the assembler
 rather than the code generator.