25 lines
1.5 KiB
Markdown
25 lines
1.5 KiB
Markdown
# Стеки виртуальной машины
|
|
|
|
ВМ использует три фиксированных стека по 256 элементов.
|
|
|
|
## Стек данных
|
|
|
|
`dstack` хранит значения `fzl_value_t`: числа, строки, булевы значения, ссылки на объекты и null.
|
|
`PUSHNUM`, `PUSHBOOL` и `LOADCONST` помещают значения на стек.
|
|
Арифметические и логические операции снимают операнды и кладут результат обратно.
|
|
|
|
## Стек вызовов
|
|
|
|
`cstack` хранит адреса возврата.
|
|
`CALL` сохраняет текущий адрес и переходит к функции,
|
|
`RET` снимает последний адрес.
|
|
Рекурсивные вызовы используют отдельные записи.
|
|
|
|
## Стек окружений
|
|
|
|
`estack` хранит таблицы имён и владельцев объектов.
|
|
`MK_ENVTABLE` создаёт окружение, `RM_ENVTABLE` уничтожает его, `STORE` добавляет имя, `LOOKUP_ENV` ищет значение, `WRITE` изменяет переменную.
|
|
`ESCAPE_OBJECT` переносит возвращаемый объект перед закрытием окружения.
|
|
|
|
Запуск `fz -d program.fzb` печатает декодированную последовательность опкодов и аргументов.
|