A program that emulates a hardware environment and executes MachineCode inside it.
A well-known example is the JVM, a VirtualMachine that allows for the execution of Java ByteCode: just about every WebBrowser has one. Lesser known examples include the SmallTalk and LISP VirtualMachines.
While many VirtualMachines are designed to provide an environment different from the hardware they run on, this doesn't necessarily have to be the case: VMWare emulates a PC in a PC, f.ex. This is useful for running a real version of MicrosoftWindows under Linux instead of using Wine, or for testing multiple LinuxDistributions on a fast machine without having to stop what you're doing.
Virtual machines are used for:
- a VirtualMachine is simple, a Compiler is complicated. MachineCode from one Compiler can run on any type of machine, with any type of CPU, providing someone's written a VirtualMachine for it.
- Anything the program running in a VirtualMachine does has to be done by the VirtualMachine on its behalf. The VirtualMachine could decide not to write to the harddisk because you haven't given permission for the program inside it to do so; and the VirtualMachine could even pretend to have written to disk successfully to the emulated code -- it will be none the wiser, because it exists in an isolated universe. Thus, in theory the Java applet your WebBrowser downloaded from a webserver in Estonia can't do any harm.
- Programming languages implicitly define what a computer is. If that computer is far different from a JohnVonNeumann machine (the basis of most modern CPU designs), then you may as well write a VirtualMachine for your imaginary computer, and have your Compiler create code for that machine. The result probably won't be much less efficient than a native code compiler, and will be far easier to attain.
- A VirtualMachine emulates an entire hardware environment. You can stop a running program at any point and examine everything about the machine's state -- something not possible with a regular debugger. Bochs was written for this purpose.
- I get to play my favourite ZX Spectrum video game1? on my PC. Whee!
1? Ant Attack!