Я пишу виртуальную машину на С просто для удовольствия. Хромой, я знаю, но, к счастью, я на ТАК, так что, надеюсь, никто не будет смеяться :))
Я написал очень быструю и грязную виртуальную машину, которая читает строки (моего собственного) ASM и делает вещи. Сейчас у меня только 3 инструкции: add
, jmp
, end
. Все хорошо, и на самом деле очень круто иметь возможность кормить строки (делать что-то вроде write_line(&prog[1], "jmp", regA, regB, 0);
и затем запускать программу:
while (machine.code_pointer <= BOUNDS && DONE != true)
{
run_line(&prog[machine.cp]);
}
Я использую таблицу поиска кода операции (которая может быть неэффективной, но элегантной) в C, и все, кажется, работает хорошо.
Мой вопрос больше относится к "наилучшей практике", но я думаю, что есть правильный ответ на него. Я делаю виртуальную машину способной читать двоичные файлы (сохраняя байты в unsigned char[]
) и выполнять байт-код. Мой вопрос: это задача виртуальной машины, чтобы убедиться, что байт-код правильно сформирован или просто работа компилятора, чтобы убедиться, что бинарный файл, который он выдает, правильно сформирован?
Я спрашиваю об этом только потому, что произойдет, если кто-то отредактирует двоичный файл и испортит содержимое (удалит его произвольные части и т. Д.). Очевидно, что программа будет глючной и, вероятно, не будет работать. Это даже проблема ВМ? Я уверен, что люди намного умнее, чем я, нашли решение этих проблем, мне просто любопытно, что они!