Mesin virtual, seperti JVM, adalah program yang menerima sebagai input, biasanya file, seperangkat instruksi sederhana (yang biasanya mudah dikonversi menjadi instruksi CPU nyata), dan sebenarnya mengkompilasi dan menjalankannya sebagai instruksi CPU asli (biasanya menggunakan kompiler sesuai permintaan seperti HotSpot atau JIT).
Ini pada dasarnya adalah lapisan abstraksi. Biasanya lebih mudah untuk menempatkan implementasi set instruksi VM ke arsitektur prosesor yang berbeda, karena beberapa kesamaan (seperti berbasis stack). Ini juga jauh lebih mudah untuk port bahasa pemrograman yang berbeda untuk instruksi VM, karena itu lebih berorientasi pada bahasa pemrograman modern daripada instruksi CPU primitif. Banyak Mesin Virtual seperti JVM dan CLR (.NET) berisi instruksi untuk memanggil metode virtual, dan membuat instance objek.
Jadi mari kita ambil sebuah bahasa sebagai contoh. Sebut saja MyLanguage. Karena ini adalah bahasa pemrograman, akhirnya dikompilasi hingga ke beberapa instruksi arsitektur CPU. Jadi itu berarti bahwa, mengingat set instruksi Mesin Virtual yang kompatibel dan fleksibel, juga memungkinkan untuk mengkompilasi MyLanguage ke set instruksi VM itu.
Selalu ada pertanyaan tentang efisiensi, karena Anda mungkin perlu meretas beberapa solusi dalam set instruksi VM yang tidak harus Anda lakukan secara native, tetapi itu masih mungkin.