Разделы

3.1. Стек

Тип виртуальной машины - стековая. Общение между хост программой и средой s4g осуществляется посредством стека. В данной версии - через стек исполнения виртуальной машины. То есть, по сути, каждый вызов API функции генерирует команды для исполнения виртуальной машиной.

Размер стека исполнения ограничен значением дефайна S4G_VM_MAX_SIZE_STACK_EXE, который объявлен в s4g.h, по умолчанию 1000, при превышении этого количества элементов в стеке будет выдана соответствующая ошибка.

Ограничение стека исполнения сделано для того, чтобы избежать как ошибок программистов хост программы, так и ошибок разработчиков данной машины.
В то же время, инструкции такого большого объема могут свидетельствовать о возможно неверном подходе к разработке скрипта.
Переполнение стека исполнения может говорить о неверной проектировки взаимодействия хост программы со скриптами.
Данный стек может принимать только значения типа s4g_value. Однако объекты данного типа могут содержать в себе все то, что может содержать код скрипта. И API s4g предоставляет для этого необходимые возможности.

Также виртуальная машина содержит еще дополнительный стек вызовов, который служит для хранения данных для вызова и возврата. Данный стек имеет ограничение по размеру, которое регулируется дефайном S4G_MAX_CALL, определенным в s4g.h, и означает максимальное количество вызовов (как рекурсивных, так и вложенных), по умолчанию 1000. При превышении этого количества будет выдана соответствующая ошибка. Если Вам нужно большее количество - увеличивайте это значение.

Виртуальная машина содержит еще и стек блоков, который не имеет границ (кроме памяти). Данный стек работает (в правильном режиме) по классическому понимаю стека.
Индексация стека начинается с нуля. Реализация стеков не придерживается классического правила стеков (первый зашел – последний вышел). Положительный индекс это абсолютное положение в стеке, отрицательный индекс это позиция элемента относительно вершины стека, то есть -1 это вершина стека, -2 на один элемент ниже вершины и так далее.