Mesin, virtual atau tidak, membutuhkan model komputasi yang menggambarkan bagaimana komputasi dilakukan di dalamnya. Menurut definisi, segera setelah dihitung, ia mengimplementasikan beberapa model perhitungan. Pertanyaannya kemudian adalah: Model apa yang harus kita pilih untuk VM kita? Mesin fisik dibatasi oleh apa yang dapat dilakukan secara efektif dan efisien dalam perangkat keras. Tetapi, seperti yang Anda perhatikan, mesin virtual tidak memiliki kendala seperti itu, mereka didefinisikan dalam perangkat lunak menggunakan bahasa tingkat tinggi yang sewenang-wenang.
Sebenarnya, ada mesin virtual yang tingkat tinggi seperti yang Anda gambarkan. Mereka disebut bahasa pemrograman . Standar C misalnya mendedikasikan sebagian besar halamannya untuk mendefinisikan model untuk apa yang disebut "mesin abstrak C" yang menggambarkan bagaimana program C berperilaku, dan dengan ekstensi (as-jika aturan) bagaimana kompiler C yang sesuai (atau penerjemah) harus berperilaku.
Tentu saja, kita biasanya tidak menyebut itu mesin virtual. VM biasanya berarti tingkat yang lebih rendah, lebih dekat dengan perangkat keras, tidak dimaksudkan untuk diprogram secara langsung, dirancang untuk dieksekusi secara efisien. Bias pemilihan ini berarti bahwa sesuatu yang menerima kode komposer tingkat tinggi (seperti apa yang Anda jelaskan) tidak akan dianggap sebagai VM karena dieksekusi kode tingkat tinggi.
Tetapi untuk sampai pada intinya, berikut adalah beberapa alasan untuk membuat VM (seperti, sesuatu yang ditargetkan oleh kompiler bytecode) berbasis register atau sejenisnya. Stack dan mesin register sangat sederhana. Ada urutan instruksi, beberapa status, dan semantik untuk setiap instruksi (fungsi State -> State). Tidak ada pengurangan pohon yang rumit, tidak ada prioritas operator. Memilah, menganalisis, dan mengeksekusinya sangat sederhana, karena ini adalah bahasa minimal (gula sintaksis dikompilasi) dan dirancang untuk dibaca mesin daripada dibaca manusia.
Sebaliknya, mem-parsing bahasa C-seperti paling sederhana pun cukup sulit, dan mengeksekusinya memerlukan analisis non-lokal seperti memeriksa dan menyebarkan jenis, menyelesaikan kelebihan beban, mempertahankan tabel simbol, menyelesaikan pengidentifikasi string , mengubah teks linier menjadi AST yang digerakkan oleh prioritas. , dan seterusnya. Itu dibangun di atas konsep yang menjadi alami bagi manusia tetapi harus dengan susah payah direkayasa secara terbalik oleh mesin.
Bytecode JVM, misalnya, dipancarkan oleh javac
. Ini hampir tidak pernah perlu dibaca atau ditulis oleh manusia, jadi itu wajar untuk membawanya ke konsumsi oleh mesin. Jika Anda dioptimalkan untuk manusia, JVM akan hanya pada setiap startup membaca kode, mengurai, menganalisis, dan kemudian mengubahnya menjadi representasi menengah menyerupai disederhanakan model mesin seperti pula . Mungkin juga memotong perantara.