Я пишу небольшую языковую виртуальную машину с произвольными целочисленными (кодирующими, а не буквально) параметрами и собираюсь реализовать операторы if.Проверенная формула для операторов if предназначена для компиляции
if (EXPRESSION) {
BODY
}
в
EXPRESSION
JUMP-IF-FALSE body-length
BODY
Однако я изо всех сил пытаюсь понять, как однопроходный компилятор может определить телоlength при генерации команды JUMP-IF-FALSE
.
С инструкциями постоянного размера вы можете просто добавить два дополнительных байта или что-то еще и вернуться назад и исправить это, но с переменными размерами, которые потребуют либо вставки, либоконкатенация, два процесса O (N).
Итак, мой единственный вариант - переключиться на инструкции перехода постоянного размера, и каждые MAXJUMP-1
байты вставляют команду для перехода к следующей инструкции, а затем другуюJUMP
инструкция.
Даже если такая ситуация (65 КБ + плоские байты с 2-байтовым переходом) действительно маловероятна, я бы очень, очень не хотел этого делать.