doc: add book,internal,reference,builtins sections
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
# Размещение объектов
|
||||
|
||||
Экземпляр класса во время исполнения представлен структурой объекта с массивом значений полей:
|
||||
|
||||
```
|
||||
typedef struct
|
||||
{
|
||||
fzl_value_t *values;
|
||||
size_t values_count;
|
||||
} fzl_vm_object_t;
|
||||
```
|
||||
|
||||
Поля получают последовательные индексы в порядке объявления.
|
||||
Таблица класса хранит имя поля, тип и `slot_index`.
|
||||
Поэтому `object.field` компилируется в `GET_FIELD` или `SET_FIELD` с числовым индексом.
|
||||
|
||||
Выражение `new ClassName` проверяет наличие класса и генерирует `ALLOC_OBJECT N`, где `N` — число полей.
|
||||
Сравнение объектов проверяет указатели.
|
||||
При уничтожении окружения освобождаются принадлежащие ему объекты и массивы их значений.
|
||||
|
||||
При возврате объекта из вложенного окружения `ESCAPE_OBJECT` переносит владение в родительское окружение.
|
||||
@@ -0,0 +1,24 @@
|
||||
# Стеки виртуальной машины
|
||||
|
||||
ВМ использует три фиксированных стека по 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` печатает декодированную последовательность опкодов и аргументов.
|
||||
Reference in New Issue
Block a user