Стек в информационных технологиях
Стек (англ. stack – штабель, стопка, кипа) в информационных технологиях, область оперативной памяти, используемая в режиме LIFO (от англ. Last In, First Out – последним пришёл, первым ушёл) для временного хранения состояния процессора, регистров, локальных переменных. В стеке обычно записывается адрес возврата (англ. return address) при вызове процедуры, метода или функции, а также передаваемые параметры или ссылки на них. Размер выделяемой под стек памяти ограничен и имеет нижнюю и верхнюю границы, нарушение которых называют соответственно переполнением и исчерпанием.
Чаще всего принцип работы стека сравнивают со стопкой тарелок: чтобы взять вторую сверху, нужно снять верхнюю. Другой пример – переход в браузере с одной веб-страницы на другую: гиперссылки, по которым осуществляется переход, сохраняются в стек и при нажатии кнопки возврата осуществляется переход по адресу из «верхней» (т. е. последней сохранённой) гиперссылки.
Каждый процесс, поток или задача имеют собственный стек. Работа со стеком поддерживается аппаратно с помощью команд занесения в стек и извлечения из стека, а также специального регистра – указателя стека и схем контроля нарушения границ. Стек может быть аппаратным (операции поддерживаются набором машинных команд процессора) или программным (реализуется программными средствами). Некоторые процессоры могут иметь несколько стеков и, соответственно, несколько указателей стека. На основе стека может быть разработана специальная стековая архитектура, т. е. компьютерная архитектура, в которой у машинных команд нет адресной части – операнды берутся из вершины стека и помещаются снова в стек. Такая архитектура хорошо подходит для выполнения математических операций, поэтому она частично присутствует в блоке арифметического устройства компьютера с плавающей запятой, регистры которого образуют регистровый стек.
Существуют языки программирования, полностью ориентированные на работу со стеком, самый известный из них – Форт (англ. Forth).
В библиотеки объектных языков программирования (C++, Java и др.) включены реализации структуры данных, основанной на принципе LIFO, также называемой стеком.
Иерархически организованный набор сетевых протоколов, достаточный для организации взаимодействия узлов в компьютерной сети (например, TCP/IP) также именуется стеком.