Языки программирования - концепции и принципы

Выход за нижнюю границу стека


Выход за нижнюю границу стека всегда вызыва­ется ошибкой программирования, поскольку вы сохраняете что-нибудь в сте­ке тогда и только тогда, когда предполагаете извлечь это позднее. Переполне­ние может происходить даже в правильной программе, если объем памяти не­достаточен для вычисления.

 

 

Выделение памяти в стеке

Как используется стек при реализации языка программирования? Стек нужен для хранения информации, касающейся вызова процедуры, включая локаль­ные переменные и параметры, для которых память автоматически выделяется после входа в процедуру и освобождается после выхода. Стек является подхо­дящей структурой данных потому, что входы и выходы в процедуры делаются в порядке LIFO, а все нужные данные принадлежат процедуре, которая в це­почке вызовов встречается раньше.

Рассмотрим программу с локальными процедурами:

procedure Main is

     G: Integer;



Ada

      procedure Proc_1 is

             L1: Integer;

      begin ... end Proc_1 ;

      procedure Proc_2 is

            L2: Integer;

       begin... end Proc_2;

begin

     Proc_1;

     Proc_2;

end Main;



Когда начинает выполняться Main, должна быть выделена память для G. Ког­да вызывается Ргос_1, должна быть выделена дополнительная память для L1 без освобождения памяти для G (см. рис. 7.6а). Память для L1 освобождается перед выделением памяти для L2, так как Ргос_1 завершается до вызова Ргос_2 (см. рис. 7.66). Вообще, независимо оттого, каким образом процедуры вызывают друг друга, первый элемент памяти, который освобождается, явля­ется последним занятым элементом, поэтому память для переменных и пара­метров может отводиться в стеке.

    Рассмотрим теперь вложенные процедуры:

procedure Main is

     G: Integer;

Ada

      procedure Proc_1 (P1: Integer) is

          L1: Integer;

      procedure Proc_2(P2: Integer) is

           L2: Integer;

      begin

          L2 := L1 + G + P2;


Содержание раздела