Стек вызовов


В информатике стек вызовов представляет собой структуру данных стека , в которой хранится информация об активных подпрограммах компьютерной программы . Этот тип стека также известен как стек выполнения , стек программ , стек управления, стек времени выполнения или машинный стек , и его часто сокращают до просто « стек ». Хотя поддержка стека вызовов важна для правильного функционирования большинства программ , детали обычно скрыты и автоматически выполняются в языках программирования высокого уровня . Много компьютеровнаборы инструкций предоставляют специальные инструкции для управления стеками.

Стек вызовов используется для нескольких взаимосвязанных целей, но основная причина его наличия — отслеживание точки, в которую каждая активная подпрограмма должна вернуть управление после завершения выполнения. Активная подпрограмма — это та, которая была вызвана, но еще не завершила выполнение, после чего управление должно быть возвращено точке вызова. Такие активации подпрограмм могут быть вложены на любом уровне (рекурсивном в частном случае), отсюда и структура стека. Например, если подпрограмма DrawSquareвызывает подпрограмму DrawLineиз четырех разных мест, DrawLineнеобходимо знать, куда следует вернуться после завершения ее выполнения. Для этого адрес , следующий за инструкцией , которая переходит к DrawLine, адрес возврата, помещается на вершину стека вызовов при каждом вызове.

Поскольку стек вызовов организован как стек , вызывающая сторона помещает адрес возврата в стек, а вызываемая подпрограмма, когда она завершается, извлекает или извлекает адрес возврата из стека вызовов и передает управление этому адресу. Если вызываемая подпрограмма вызывает еще одну подпрограмму, она поместит другой адрес возврата в стек вызовов и т. д., при этом информация накапливается и распаковывается в соответствии с указаниями программы. Если отправка занимает все пространство, выделенное для стека вызовов, возникает ошибка, называемая переполнением стека , что обычно приводит к сбою программы . Добавление записи подпрограммы в стек вызовов иногда называют «обмоткой»; и наоборот, удаление записей является «разматыванием».

Обычно с запущенной программой (или, точнее, с каждой задачей или потоком процесса ) связан ровно один стек вызовов , хотя для обработки сигналов или совместной многозадачности могут быть созданы дополнительные стеки ( как в случае с setcontext ). Поскольку в этом важном контексте есть только один, его можно назвать стеком (неявно «задачи»); однако в языке программирования Forth доступ к стеку данных или стеку параметров осуществляется более явно, чем к стеку вызовов, и обычно его называют стеком (см. Ниже).

В языках программирования высокого уровня специфика стека вызовов обычно скрыта от программиста. Им предоставляется доступ только к набору функций, а не к самой памяти в стеке. Это пример абстракции . С другой стороны, большинство языков ассемблера требуют, чтобы программисты участвовали в управлении стеком. Фактические детали стека в языке программирования зависят от компилятора , операционной системы и доступного набора инструкций .


Макет стека вызовов для растущих вверх стеков