Как скомпилировать оператор if с инструкциями переменной длины - PullRequest
0 голосов
/ 22 февраля 2019

Я пишу небольшую языковую виртуальную машину с произвольными целочисленными (кодирующими, а не буквально) параметрами и собираюсь реализовать операторы if.Проверенная формула для операторов if предназначена для компиляции

if (EXPRESSION) {
    BODY
}

в

EXPRESSION
JUMP-IF-FALSE body-length
BODY

Однако я изо всех сил пытаюсь понять, как однопроходный компилятор может определить телоlength при генерации команды JUMP-IF-FALSE.

С инструкциями постоянного размера вы можете просто добавить два дополнительных байта или что-то еще и вернуться назад и исправить это, но с переменными размерами, которые потребуют либо вставки, либоконкатенация, два процесса O (N).

Итак, мой единственный вариант - переключиться на инструкции перехода постоянного размера, и каждые MAXJUMP-1 байты вставляют команду для перехода к следующей инструкции, а затем другуюJUMP инструкция.

Даже если такая ситуация (65 КБ + плоские байты с 2-байтовым переходом) действительно маловероятна, я бы очень, очень не хотел этого делать.

...