Комментарии 16
Интересно! Не сообразил как это сделать, если я не храню количество аргументов, локальных переменных и программа не имеет доступа к регистрам. Подскажите как? Попробую реализовать.
Наверное, пора писать парсер для построения полноценного Abstract Syntax Tree и генерацию кода из C подобного языка. Уже хочу закрыть гештальт на тему "могу ли написать полноценную виртуальную машину и компилятор" на C++ )))
Вы правы, делать свою VM - это не практично, о чем говорил в первой части. Причина по которой пишу VM и компилятор - это желание самому детально понять как всё работает с нуля. По той же причине не использую парсеры (типа bison). Хочу во всём разобраться и понять. Дай бог закончу, можно будет заменить VM на нативную компиляцию (x86/64) или в WASM, или Java Bytecode.
Если я правильно понял вопрос, то локальная переменная 'c' в функции SUM создана по адресу [32] командой ICONST 10 (аллокация на стеке места под переменную и её инициализация константой 10), по адресу [39] её значение добавляется на вершину стека командой ILOAD #0 для вычислений, без изменения переменной.
Константа которая была передана как второй аргумент изначально создана по адресу [9].
Аргументы функции идут по адресам FP+0 (A=I), FP+1 (B=10) - доступ к ним по команде ARG #index. Локальные переменные по адресам LP+0 (C=10), доступ к ним iload #index.
Разработка стековой виртуальной машины и компилятора под неё (часть III)