Машині, віртуальній чи ні, потрібна модель обчислення, яка описує, як проводиться обчислення на ній. За визначенням, як тільки він обчислює, він реалізує деяку модель обчислення. Тоді питання: яку модель нам вибрати для нашого VM? Фізичні машини обмежуються тим, що можна ефективно та ефективно зробити апаратними засобами. Але, як зазначаєте, віртуальні машини не мають таких обмежень, вони визначаються в програмному забезпеченні, використовуючи довільно мови високого рівня.
Насправді є віртуальні машини на високому рівні, як ви описуєте. Їх називають мовами програмування . Наприклад, стандарт C присвячує основну частину своїх сторінок визначенню моделі для так званої "абстрактної машини C", яка описує, як поводяться програми C, а також розширенням (як би правило) як відповідний компілятор C (або інтерпретатор) повинні поводитися.
Звичайно, ми зазвичай не називаємо це віртуальною машиною. Зазвичай VM означає, що означає щось нижчий рівень, ближчий до апаратного, не призначений для прямого запрограмування, розроблений для ефективного виконання. Цей зміщення вибору означає, що те, що приймає компонований код високого рівня (наприклад, те, що ви описуєте), не вважатиметься VM, оскільки виконується код високого рівня.
Але для досягнення суті, ось декілька причин зробити VM (наприклад, щось націлене на компілятор байт-коду) на базі регістра або тому подібне. Машини для складання та реєстрації надзвичайно прості. Існує послідовність інструкцій, деякий стан та семантика для кожної інструкції (функція State -> State). Без складних скорочень дерев, без пріоритету оператора. Проаналізувати, проаналізувати та виконати це дуже просто, оскільки це мінімальна мова (синтаксичний цукор збирається далеко) і призначена для машинного читання, а не для читання людиною.
На противагу цьому, розбір навіть найпростіших мов, схожих на С, є досить важким, і його виконання вимагає нелокальних аналізів, таких як перевірка та розповсюдження типів, усунення перевантажень, підтримка таблиці символів, вирішення ідентифікаторів рядків , перетворення лінійного тексту в AST, керований пріоритетом , і так далі. Він ґрунтується на концепціях, які є природними для людини, але повинні бути ретельно спроектовані машинами.
Наприклад, байт-код JVM випромінюється javac
. Він практично ніколи не повинен читати чи писати людиною, тому природно орієнтувати його на споживання машинами. Якщо ви оптимізували його для людей, віртуальна машина буде тільки при кожному запуску читати код, аналізувати його, аналізувати це, а потім перетворити його в проміжне представлення , що нагадує така модель спрощеної машини в будь-якому випадку . Може добре вирізати середнього чоловіка.