What is the difference between a simulator, emulator, and cross compiler? As far as I understand, cross compilers, emulators, and simulators are all ways that one computer system to be able to behave like or run another computer system.
What is the difference between these concepts? Are some of them equivalent?
Cross-development environment involve

a host computer (such as a PC) that runs the development tools,

a target computer (such as an embedded processor) that is where the code will eventually run.


A cross-compiler* generates the code that the target can understand, though compilation takes place on the host. The compiled code is sent to the target for execution.
An emulator is an ad-hoc piece of hardware that is able to mimic the behavior of the target, but is better suited for evaluation and testing.
A simulator is a software running on the host and able to mimic the behavior of the target without a physical target being present. Even though it runs on the host, it is able to execute the cross-compiled code.
A typical development scheme goes as follows:

cross-compile and debug with a simulator to obtain the correct functional behavior,

then cross-compile and debug with an emulator to check real-time performance and possibly interaction with real peripherals,

finalize the product on the real target.



*A compiler that compiles for the platform it runs on is called native.