Есть компилятор, который переводит исходный код в код виртуальной машины (байт-код), и JIT-компилятор для кода виртуальной машины -> машинный код.ВМ - это стандарт, на который ориентирован компилятор исходного кода -> ВМ, а не конкретная реализация.Это может быть реализовано на реальной машине, и в этом случае не нужно будет выполнять JIT-компиляцию.
Виртуальная машина ближе к эмулятору (или, если ваш JIT действительно глуп, интерпретатор:))