If I am correct in understanding what I've read a virtual machine is essentially a compiler for intermediate code. But it is never said that Delphi (as an example of unmanaged code) runs in its compiler. Would it be less confusing to just describe a virtual machine as a compiler?
A traditional compiler does a one-time conversion from source code to object code. A virtual machine like the JVM uses a mixture of interpretation (of bytecode) and a just-in-time compiler that compiles segments of bytecode to native code. It's not accurate to describe a VM overall as a compiler.
There's a compiler that translates source code to VM code (bytecode), and a JIT compiler for VM code -> machine code. The VM is the standard that the source code -> VM compiler targets, not necessarily the specific implementation. It could be implemented with a real machine, in which case it wouldn't need to do JIT compilation.
A VM is closer to an emulator (or if your JIT is really stupid, an interpreter :))
I think what people are trying to capture with the terminology is that there's an extra layer of abstraction with virtual machines. So, same code, but the VM for each platform allows it to run on that specific platform.