Я рассчитываю создать виртуальную машину как независимый от платформы способ запуска некоторого игрового кода (по сути, скриптов).
Виртуальные машины, о которых я знаю в играх, довольно старые: Z-Machine от Infocom , SCUMM от LucasArts , Quake 3 от id Software . Как разработчик .net, я знаком с CLR и изучил инструкции CIL, чтобы получить представление о том, что вы на самом деле реализуете на уровне виртуальной машины (по сравнению с языковым уровнем). В прошлом году я также немного поиграл в 6502 Ассемблере .
Дело в том, что теперь, когда я хочу… реализовать это, мне нужно копнуть немного глубже. Я знаю, что существуют виртуальные машины на основе стеков и регистров, но я не знаю, какая из них лучше в чем, и есть ли более или гибридные подходы. Мне нужно разобраться с управлением памятью, решить, какие типы низкого уровня являются частью ВМ, и мне нужно понять, почему такие вещи, как ldstr, работают так, как работают .
Мой единственный справочник (кроме материала по Z-Machine) - это Аннотированный стандарт CLI , но мне интересно, есть ли лучшая, более общая / фундаментальная лекция для виртуальных машин? В основном что-то вроде Книги Дракона , но для ВМ? Мне известно об искусстве компьютерного программирования Дональда Кнута, в котором используется виртуальная машина на основе регистров, но я не уверен, насколько эта серия применима, тем более что она еще не закончена?
Пояснение: цель заключается в создании специализированной виртуальной машины. Например, Z-Machine Infocom содержит коды операций для установки цвета фона или воспроизведения звука. Поэтому мне нужно выяснить, сколько идет на виртуальную машину в виде OpCodes по сравнению с компилятором, который берет скрипт (язык TBD) и генерирует из него байт-код, но для этого мне нужно понять, что я действительно делаю.
¹ Я знаю, что современные технологии позволили бы мне просто интерпретировать язык сценариев высокого уровня на лету. Но где в этом веселье? :) Гуглить тоже немного сложно, потому что виртуальные машины в наше время часто ассоциируются с виртуализацией ОС типа VMWare ...
do { switch(opcode) {case OP1: ... case OP2: ...} while (nextop);
затем, может быть, компилятор ... и тогда начинается самое интересное - оптимизация, чтобы заставить его работать на самом деле
Quake 3
виртуальная машина?