Một máy ảo, như JVM, là một chương trình chấp nhận làm đầu vào, thường là các tệp, một tập các lệnh đơn giản (thường dễ chuyển đổi thành các lệnh CPU thực) và thực sự biên dịch và chạy chúng như các lệnh CPU gốc (thường sử dụng một trình biên dịch theo yêu cầu như HotSpot hoặc JIT).
Nó thực chất là một lớp trừu tượng. Việc chuyển các tập lệnh VM thành các kiến trúc bộ xử lý khác nhau thường dễ dàng hơn nhiều, vì một số điểm tương đồng (chẳng hạn như dựa trên ngăn xếp). Việc chuyển các ngôn ngữ lập trình khác nhau sang các hướng dẫn VM cũng dễ dàng hơn nhiều, vì nó thiên về các ngôn ngữ lập trình hiện đại hơn các hướng dẫn CPU nguyên thủy. Nhiều máy ảo như JVM và CLR (.NET) chứa các hướng dẫn để gọi các phương thức ảo và tạo các thể hiện đối tượng.
Vì vậy, hãy lấy một ngôn ngữ làm ví dụ. Gọi nó là MyL Language. Vì nó là ngôn ngữ lập trình, cuối cùng nó biên dịch thành một tập hợp một số hướng dẫn kiến trúc CPU. Vì vậy, điều đó có nghĩa là, được cung cấp một bộ hướng dẫn Máy ảo linh hoạt, tương thích, bạn cũng có thể biên dịch MyL Language thành một bộ các hướng dẫn của VM đó.
Luôn có câu hỏi về hiệu quả, vì bạn có thể cần phải hack một số cách giải quyết trong các tập lệnh VM mà bạn sẽ không phải thực hiện một cách tự nhiên, nhưng vẫn có thể.