The terms “simulation” and “emulation” are often used incorrectly, and I’d like to do my part to set the record straight, because the distinction is an important one.
Simulation is, in the words of the Wikipedia entry for the term, “the imitation of the operation of a real-world process or system over time”. A simulator is a computing device or software program that accomplishes this.
Emulation is the reproduction of the behavior of a computing device or software program by executing its defining code within the context of another device or program. The Wikipedia entry for emulator describes it as “hardware or software or both that duplicates (or emulates) the functions of a first computer system (the guest) in a different second computer system (the host), so that the emulated behavior closely resembles the behavior of the real system”.
When we say we’re going to simulate something, we mean we’re going to imitate the behavior of the original, to whatever level of fidelity is required to accomplish the high-level goals of the simulation. When we say we’re going to emulate something, we mean we’re going to actually execute its code within a larger simulation so that the emulated device or program behaves exactly as it would in a comparable real world scenario.
Only some types of objects can be emulated. In order for emulation to be possible, an object has to be either a software program, or a computing device that can be reduced to a software program. We can’t emulate an automobile, since an automobile is a physical object with physical processes. We have to simulate the operation of the engine, the performance of the suspension, how the tires react to road conditions, and so on. But in theory, we could emulate computer-based subsystems on the auto, were doing so desirable.