ВМ не имеет ничего общего с языком. Любой язык может работать поверх виртуальной машины (виртуальная машина Java уже поддерживает сотни языков).
Виртуальная машина позволяет запускать другой вид «языка ассемблера», более подходящий для адаптации компилятора. Все, что делается на виртуальной машине, можно делать в процессоре, поэтому думайте о виртуальной машине как о процессоре. (Некоторые фактически реализованы аппаратно).
Это чрезвычайно низкий уровень, и во многих случаях он сильно основан на стеке - вместо регистров математические вычисления на машинном уровне относятся к местоположениям относительно текущего указателя стека.
При использовании обычных скомпилированных языков для одного шага требуется множество инструкций. a + может выглядеть так: «Захватите элемент из точки относительно указателя стека в регистр a, возьмите другой элемент в регистр b. Добавьте регистры a и b. поместите регистр a в место относительно указателя стека.
ВМ делает все это с помощью одной короткой инструкции, возможно, одного или двух байтов вместо 4 или 8 байтов НА ИНСТРУКЦИЮ на машинном языке (в зависимости от 32- или 64-разрядной архитектуры), что (предположение) должно означать около 16 или 32 байт x86 на 1-2 байта машинного кода. (Могу ошибаться, мой последний код для x86 был в эпоху 80286)
Microsoft использовала (вероятно, до сих пор использует) виртуальные машины в своих офисных продуктах, чтобы уменьшить объем кода.
Процедура создания кода виртуальной машины такая же, как и при создании машинного языка, только с другим типом процессора.
Виртуальные машины могут также реализовать собственные механизмы безопасности, восстановления после ошибок и памяти, которые очень тесно связаны с языком.
Некоторые из моих описаний здесь краткие и по памяти. Если вы хотите самостоятельно изучить определение байт-кода, это будет весело:
http://java.sun.com /docs/books/jvms/second_edition/html/Instructions2.doc.html
Связанный вопрос: http://stackoverflow.com/questions/688803/how-does-a-register-based-virtual-machine-work
– lothar29 мая 2009, 21:18