Аннотация: Отдельное описание стэкового механизма для архитектур А4 и А5 в форме заявки на изобретение (так кстати и не поданной).
Настоящим описывается принцип работы двухстэкового вычислительно-
управляющего механизма, центральной части процессора "А4".
(В дальнейшем - "стэковый механизм".) Он может быть
использован, в случае програмной реализации, для построения алгоритмического
языка, подобного языку ФОРТ; а при аппаратной - вычислительной машины,
подобной ЭВМ Сетунь-70.
Прототипом является стэковый механизм языка ФОРТ. Рассматриваемый
стэковый механизм отличается от прототипа тем, что обеспечивает большую
надежность программирования, позволяет использовать локальные переменные и
поддерживает механизм ситуаций.
1. Общие сведения.
1.1 Стэк (магазин) вообще.
Это структура данных, в которой новый элемент всегда помещается в ее
начало (на вершину стэка) а извлекаемый элемент берется тоже с вершины.
Этот принцип традиционно выражается словами: "последний пришел - первый
вышел". Стэк противоположен очереди, где новый элемент помещается в конец,
а извлекаемый берется из начала. "Бытовые" примеры: магазин пистолета и
стопка подносов в столовой самообслуживания.
1.2 Реализация.
Для хранения данных используется область оперативной памяти или
набор регистров.
а) Новый элемент помещается в первую ячейку области (первый регистр).
Все остальные элементы физически сдвигаются к концу области. Элемент,
находящийся в последней ячейке, теряется. Извлекаемый элемент берется
из первой ячейки, остальные физически сдвигаются к началу. Элемент в
последней ячейке дублируется (или в последнюю ячейку помещается
специальное значение). Предпочтительна аппаратная реализация.
б) Используется регистр "указатель вершины стэка". Содержит номер
первой свободной (или последней занятой) ячейки. Новый элемент помещается
в первую свободную ячейку, которая теперь становится "последней занятой".
Содержимое регистра изменяется в соответствующую сторону - стэк может
расти как в сторону старших адресов, так и в сторону младших, в зависимости
от реализации. Извлекаемый элемент берется из последней занятой ячейки,
которая теперь становится свободной, для чего содержимое регистра указателя
вершины изменяется в другую сторону. Этот способ реализации стэка
используется чаще всего.
в) Элементы размещаются в несмежных участках памяти и связываются
логичесскими связями (например ссылками). Помещение и
извлечение элемента производится изменением логических связей.
Таким способом может быть организована произвольная структура данных.
Стэк - простейшая из них - получается если элементы связаны в цепочку
(для чего достаточно одной связи - указателя на "следующий" элемент),
новый элемент помещается в начало цепочки, при извлечении берется первый
элемент. Предпочтительна программная реализация.
1.3 Применение.
Область применения стэкового принципа весьма широка. Рассмотрим только
некоторые, наиболее интересные для нас примеры.
а) Стэк может быть использован для хранения промежуточных результатов
при вычилениях "по формулам". Для этого обычная форма выражения (формулы)
преобразуется в постфиксную, так называемую "обратную польскую
бесскобочную" запись. Например "(А+Б)*(В-Г)" преобразуется в "А,Б,+,В,Г,-,*".
Она естественным образом вычисляется с помощью стэка: операнды помещаются
на стэк, операции снимают их оттуда и заменяют результатом, который в свою
очередь будет операндом для следующей операции.
б) "Аппаратный" стэк используется в ЭВМ (начиная с третьего поколения)
для сохранения "адреса возврата" при обращении к подпрограмме и для
сохранения состояния процессора при прерываниях. Это позволяет получить
практически неограниченное количество уровней вложенности подпрограмм и
прерываний. А так же позволяет применять рекурсивные подпрограммы, что
было невозможно в более ранних архитектурах, где для указанных целей
использовались регистры и выделенные области памяти.
в) В "структурных" алгоритмических языках, начиная с Алгола-60,
по стэковому принципу выделяется память под локальные
"автоматичесские" переменные. Распределение памяти производится в
процессе выполнения программы: при входе в область локализации (блок,
подпрограмму) выделяется место для размещения переменных, локальных
в этом блоке; при выходе - освобождается. Если внутри данного блока
есть вложенные блоки, память под их локальные переменные выделяется
позже а освобождается раньше. Это экономит оперативную память и
позволяет при рекурсии (обращении подпрограммы к самой себе) получить
не определенное заранее количество наборов локальных переменных рекурсивной
подпрограммы.
г) Через стэк может производиться передача параметров подпрограмме и
возвращение результата, вычисленного подпрограммой-функцией. Если
место под локальные переменные выделяется из стэка, то это особенно удобно,
так как переданные "фактические" параметры становятся начальными значениями
"формальных" параметров, полностью аналогичных локальным переменным.
В результате передаваемые значения достаточно просто оставить там, где будет
выделено место под переменные и они станут их начальными значениями.
Часть стэка, содержащую локальные переменные некоторой подпрограммы,
переданные параметры и возможно служебную информацию называют "кадром
стэка" или "записью активации подпрограммы".
1.4 Конкретные примеры.
а) Для сохранения промежуточных результатов при вычислениях стэк
используется: в программируемых калькуляторах типа "электроника Б3-34"
(и ему подобных); в языке программирования ФОРТ; в математическом
сопроцессоре 8086 (разработка фирмы INTEL); в ЭВМ "Эльбрус".
б) Аппаратный стэк для сохранения адресов возврата из подпрограммы и
состояния процессора при прерываниях используется во многих архитектурах,
в том числе в PDP-11 (разработка фирмы DEC) и в микропроцессоре 8086
(разработка фирмы INTEL). Практичесски везде, в том числе и в двух
рассматриваемых случаях он реализован как описано в п. 1.4.б. В обоих
архитектурах стэк растет в сторону младших адресов; регистр указатель
вершины стэка содержит адрес последней занятой ячейки, следовательно
перед помещением слова на стэк, его содержимое должно уменьшаться, а
после изъятия - увеличиваться. В 8086 указатель стэка - выделенный
регистр, для обращения к стэку введены специальные команды ("pop" и "push"),
автоматичесски изменяющие указатель в нужном направлении. В PDP-11
указателем стэка служит один из равноправных "регистров общего назначения".
Работа со стэком производится универсальными командами с помощью
универсальных "методов адресации" ("автоикрементного" и "автодекрементного"),
автоматичесски производящих изменение указателя стэка в нужную сторону.
"Пользовательский" стэк можно организовать на любом другом регистре
(кроме, разве что, счетчика команд) тем же самым способом.
в) Механизм передачи параметров, используемый в некоторых реализациях
языка ПАСКАЛЬ (например на ЭВМ PDP-11 в ОС RT-11). Количество, тип (и размер)
передаваемых подпрограмме параметров, а так же тип возвращаемого значения
фиксируются на в момент описания подпрограммы. В языке четко различаются
подпрограммы возвращающие значение - "функции" и не возвращающие -
"процедуры". Для передачи параметров и размещения переменных используется
аппаратный стэк. Передаваемые параметры помещаются в точке вызова на
вершину стэка, подпрограмма должна сама убрать их оттуда и заменить
(если это функция) возвращаемым значением. Кадр стэка включает: место
под возвращаемое значение, переданные параметры (если есть), адрес возврата
из подпрограммы, локальные переменные (если есть), указатель на
предыдущий кадр в статической цепочке. (Используется для "прослеживания
статичесской цепочки" - доступа к переменным подпрограмм, в которые вложена
данная.) Размер кадра фиксирован. Доступ к переменным производится по
фиксированным смещениям относительно вершины стэка.
г) Механизм передачи параметров, используемый в некоторых реализациях
языка СИ (например на ЭВМ PDP-11 в ОС UNIX). Количество передаваемых
подпрограмме параметров может быть переменным - фиксируется в момент
вызова. Подпрограммы возвращающие и не возвращающие значение не различаются,
однако накладывается ограничение на тип (и размер) возвращаемого значения.
Оно должно быть одного из "встроенных" типов - чтобы помещалось в один или
два регистра процессора. (В более поздних версиях это ограничение снято:
сложное значение помещается в специально выделенную для этого область памяти,
в регистр помещается указатель на него.) Передача параметров производится
через аппаратный стэк. Передаваемые значения помещаются в точке вызова
на вершину стэка и там же после возврата из подпрограммы убираются оттуда.
Кадр стэка включает: переданные параметры, адрес возврата из подпрограммы,
указатель на предыдущий кадр, локальные переменные. Размер кадра -
переменный. Доступ к параметрам и переменным производится с помощью
смещения относительно "указателя кадра" (хранящегося в регистре процессора).
Положение указателя вершины стэка не зафиксировано, как в предыдущем
случае, и может изменяться (например при выделении памяти функцией
"realloc").
2. Описание прототипа.
3. Стэковый механизм ФОРТ-системы.
Включает в себя два стэка - "операционный" и "управляющий".
Первый используется для хранения данных, а второй - служебной информации
(типа адресов возврата). Локальных переменных в ФОРТе нет - только
глобальные, вместо этого предоставляется явный доступ к операционному
стэку: все "слова" ФОРТа (операции) берут операнды с его вершины и помещают
туда результат. Кроме обычных арифметичесских, логичесских, и т.д. операций в
"словаре" ФОРТа имеется набор действий по реорганизации вершины стэка,
позволяющих копировать, уничтожать слова, почти произвольно менять их
взаимное местоположение. При обращении к подпрограмме нет необходимости
изображать "явный" список параметров (как например в том же Си) - все
они к этому моменту уже должны находиться в стэке. Подпрограмма должна
оставить на их месте результат. Обращение к подпрограмме (как впрочем
и к встроенной операции - они не различаются) состоит только из ее имени.
Это позволяет транслировать программы в специфичесскую форму - "шитый код".
Он состоит из стартовых адресов подпрограмм и выполняется простой передачей
управления по этим адресам.
Критика прототипов.
Положительными качествами прототипа являются: а) Разделение обычных и слу-
жебных данных. Этим достигается простота и наглядность механизма, доступ-
ность его частей. б) Одинаковость интерфейса встроенных и определяемых опе-
раций. Следствием этого является расширяемость языка, использующего этот
стэковый механизм. в) Хорошее соответствие архитектуре вычислительных
систем. В результате этого возможна простая, минимальная по объему и
эффективная програмная реализация.
К недостаткам прототипа можно отнести: а) Необходимость всегда точно знать
состояние операционного стэка. Следствиями этого являются: ненаглядность и
"трудночитаемость" программ, написанных на использующем этот стэковый меха-
низм языке, его низкая надежность; невозможность реализации в этом языке
механизма реагирования на ошибки, события ("ситуации") внутрипрограмные и
внешние, аналогичный механизму ситуаций языка Эль-76. (Невозможно предвидеть
каково будет состояние стэка на момент возникновения ситуации.) б) Не пре-
дусмотрены "автоматичесские" (в терминах языка Си) локальные переменные.
Достройка прототипа путем введения "базового" регистра - указателя на список
локальных переменных решает эту проблему не полностью: В операционном стэке
переменные разместить нельзя - это нарушит его работу. В управляющем стэке
можно, но это не удобно. (К тому-же нарушается разделение обычных и слу-
жебных данных.)
Отличия предлагаемого механизма от прототипа.
а) Для операционного стэка введены еще два регистра: "указатель локального
дна" и "указатель базы записи активации". Последний может быть дополнен ре-
гистром "длинны записи активации". Указатель локального дна определяет
нижнюю границу активной части стэка (верхняя граница - вершина). Встроенные
операции имеют право использовать только те данные, которые находятся в пре-
делах активной части стэка. Остальные для них недоступны. Попытка использо-
вать их обнаруживается аппаратурой (интерпретатором) и приводит к возникно-
вению "ситуации". Указатель базы определяет место, где в настоящий момент
находятся локальные переменные и используется для доступа к ним.
б) Запись и чтение информации из управляющего стэка производится порциями
(записями). За одно обращение туда помещается (или убирается) целиком одна
запись. Каждая запись снабжена признаком, позволяющим аппаратуре (при аппа-
ратной реализации) или интерпретатору (при програмной) определять ее назна-
чение.
в) Набор встроенных операций дополнен операциями, использующими локальное
дно (поддержка фразовой структуры программы), командами работы с локальными
переменными и командами, связанными с механизмом ситуаций.
Работа стэкового механизма.
а) Использование управляющего стэка. Как было сказано раньше, управляющий
стэк используется для хранения служебной информации. Это может быть адрес
возврата (содержимое регистра счетчика команд), регистры локального дна и
базы, границы блока, фиктивный адрес возврата, ловушка на ситуацию. Эти зна-
чения помещаются в стэк и извлекаются из него при выполнении некоторых ко-
манд. Например адрес возврата помещается командой перехода к подпрограмме, а
извлекается командой возврата из подпрограммы. Управляющий стэк програмно
недоступен.
После адреса возврата в стэк может быть помещены другие записи и к моменту
выполнения возврата из подпрограммы он может оказаться в глубине стэка.
Адрес возврата (или запись любого другого нужного в данный момент типа)
ищется в управляющем стэке по признаку типа, которым она снабжена. Поиск
заключается в том, что с вершины стэка снимается очередная запись до тех
пор, пока не обнаружится нужная. Каждая запись, извлеченная из стэка сразу
используется "по прямому назначению": сохраненные значения регистров восста-
навливаются, ловушки игнорируются, фиктивный адрес возврата приводит процес-
сор в особое состояние, а обычный (а так-же границы блока) - в нормальное.
Если нужная запись в управляющем стэке отсутствует, то в конце концов он
будет исчерпан. При запуске головной функции программы (тоесть на дно
управляющего стэка) помещается запись специального вида (ее можно назвать
заголовком процесса). Когда эта запись будет извлечена - процесс оканчава-
ется. (Нормально или аварийно - в зависимости от того, почему это прои-
зошло.)
б) Использование локального дна. Регистр указатель локального дна исполь-
зуется для "поддержки фразовой структуры". В начале "фразы" на языке высоко-
го уровня (фразой может быть, например, блок - составной оператор), ко-
мандой, соответствующей открывающей фразу операторной стобке, локальное дно
устанавливается на вершину стэка, делая его пустым.
Каждый оператор оканчивается командой "опустошение", соответствующей за-
канчивающей его точке с запятой. Она убирает со стэка все до его локального
дна - значения "забытые" оператором.
Фраза завершается командой, восстанавливающей старое положение локального
дна, сохраненное ранее в управляющем стэке. При его поиске ликвидируются ло-
кальные объекты, созданные внутри фразы. (Ловушки, локальные переменные.)
в) Механизм передачи параметров. Параметры подпрограммы, как и в прототи-
пе, накапливаются и передаются в активной части стэка. Подпрограммы делятся
на две категории. Первые - аналогично встроенным командам и подпрограммам
прототипа сами заботятся о том, чтобы снять с вершины стэка нужное (заранее
фиксированное) количество параметров и поместить на их место результат. Вы-
зовы подпрограмм второй категории обязательно должны быть оформлены как опе-
ратор - список параметров надлежит начинать накапливать с пустого стэка.
(Программам первой категории это безразлично.) Зато количество параметров
может не фиксироваться заранее - параметрами является все, что выше локаль-
ного дна.
Эти подпрограммы имеют возможность завести локальные переменные. Это дела-
ется командой "создать запись активации". Начальными значениями переменных
становятся значения, находившиеся в активной части стэка (возможно это пере-
данные параметры). Выполнение этой команды происходит следующим образом: со-
держимое регистра базы сохраняется в управляющем стэке; в регистр базы поме-
щается содержимое регистра указателя локального дна; в регистр локльного дна
помещается содержимое указателя вершины стэка. Таким образом после создания
записи активации - стэк становится пустым. В регистр длинны записи активации
(если он есть) помещается разность между значениями регистров базы и локаль-
ного дна. Старое его значение сохраняется в стэке вместе с регистром базы.
Обращение к локальным переменным производится с помощью смещения относи-
тельно регистра базы. В данном варианте регистр базы единственный, поэтому
одновременно доступен только один набор локальных переменных. (Переменные,
как в языке Си, либо локальные либо глобальные.) Если требуется иметь доступ
сразу к нескольким записям активации (при необходимости иметь переменные с
промежуточными степенями глобальности, как в языке Алгол-60), то придется
использовать несколько базовых регистров. Каждый базовый регистр будет со-
ответствовать одному уровню статичесской вложенности, а общее их количество
будет ограничивать максимальную глубину вложенности программы. В команде
создающей запись активации и в командах обращения к локальным переменным
придется использовать дополнительный параметр - уровень статичесской вложен-
ности (он-же номер базового регистра). Именно так сделано в системе Эльбрус
(32 базовых регистра).
Запись активации ликвидируется тогда, когда из управляющего стэка извлека-
ется сохраненное значение базового регистра. Запись активации при этом
должна быть уничтожена. Это происходит следующим образом: активная часть
стэка копируется на место записи активации; содержимое базового регистра по-
мещается в регистр локального дна; указатель вершины устанавливается на рас-
стоянии, равном размеру активной части стэка от локального дна; в базовый
регистр (и регистр длинны записи активации, если он есть) помещается значе-
ние, считанное из управляющего стэка. Таким образом никаких действий по
ликвидации локальных переменных в программе предусматривать не надо. Все это
делается автоматичесски.
г) Механизм ситуаций. Ситуация это состояние программы, в котором дальней-
шее "нормальное" выполнение алгоритма невозможно (или нецелесообразно). Си-
туацией можно считать сбой аппаратуры, арифметичесское переполнение, выход
за границы массива, или например возникновения условий для прекращения неко-
торого цикла. Ситуация порождается аппаратурой или создается "искуственно"
специальной командой. Имеется несколько (достаточное для практичесских целей
количество) типов ситуаций. Если программа "значет что делать" при возникно-
вении некоторой ситуации, то она ставит на нее ловушку и указывает реакцию
(которая, впрочем, может быть нулевой). Ловушка локальна внутри фразы, кото-
рая ее поставила. В обычном состоянии ловушки игнорируются, а при возникно-
вении ситуации происходит "структурный переход" - срабатывает самая
последняя из ловушек данного типа, выполняется указанная в ней реакция,
после чего поставившая ловушку фраза заканчивается "нормально" - как если бы
был достигнут ее текстуальный конец. Подпрограмма реакции ничем не отлича-
ется от остальных подпрограмм. Ей тоже могут (или даже должны) быть переданы
некоторые параметры; она может возвратить некоторое значение. Это значение
возвращается "от имени" фразы поставившей ловушку. (Если реакция нулевая -
возвращаемым значением становится то, что передается в качестве параметров
подпрограмме реакции, которая в данном случает отсуствует.) Если ни одной
ловушки на данную ситуацию нет, то выполнение программы аварийно заканчива-
ется.
Ловушка на ситуацию устанавливается командой "поставить ловушку". Она по-
мещается в управляющий стэк и содержит тип ситуации и адрес начала
подпрограммы, выполняющей реакцию на нее. Искуственное порождение ситуации
мало отличается от обращения к подпрограмме - тоже накапливается список па-
раметров, но вместо перехода к подпрограмме выполняется команда "создать си-
туацию". (И возврат управления в точку вызова не происходит.) Если ситуация
порождается "по инициативе аппаратуры", то на стэк должны быть помещены не-
которые стандартные параметры.
Поиск в управляющем стэке ловушки нужного типа происходит точно так-же как
и поиск там любой другой записи. Когда ловушка найдена, управление переда-
ется подпрограмме реакции, но перед этим "восстанавливается програмное окру-
жение": активная часть стэка (на момент возникновения ситуации) копируется
туда, куда указывает регистр локального дна, восстановленный в процессе
распространения ситуации. При активизации подпрограммы реакции в управляющем
стэке сохраняется не "настоящий", а "фиктивный" адрес возврата. Он содержит
только соответствующий признак. Если при возврате из подпрограммы из стэка
получен фиктивный адрес возврата, то поиск адреса возврата продолжается, но
теперь в этом качестве может быть использована и запись, содержащая границы
блока.
д) Блок и цикл. Имеются три команды: "начало", "повторить" и "выход". Ко-
манда "начало" помещает в управляющий стэк запись с границами блока. В ней
содержатся два адреса: начало блока - адрес следующей команды после данной,
и конец блока - содержится в команде. Команда "выход" извлекает эту запись
из управляющего стэка и производит переход ко второму адресу (к первой ко-
манде после конца блока). Команда "повторить" тоже извлекает из стэка эту
запись, но тутже помещает ее обратно и передает управление по первому адресу
(тоесть в начало блока, а в данном случае - цикла). Эти три команды исполь-
зуются для организации фразы, которая (как и подпрограмма) служит границей
распространения ситуации. Структуры, построенные с помощью переходов
(условный и выбирающий операторы, обыкновенные циклы), а так-же фраза ранее
описанного типа (образованная командами, манипулирующими с локальным дном) в
этом качестве выступать не могут.
Дополнительные возможности.
В дополнение ко всему вышесказанному, управляющий стэк может быть исполь-
зован для управления объектами, существующими как глобальные, но время жизни
которых должно быть ограничено временем выполнения фразы, внутри которой они
созданы. Примером может служить область памяти произвольной длинны, выделен-
ная "из кучи". (В языке Си - при помощи помощи функции "malloc"). При созда-
нии такого объекта в управляющий стэк помещается специальная запись, со-
держащая указатель на него. Когда запись этого типа извлекается из стэка, то
объект, ссылка на который в ней содержится, уничтожается. (Например вызыва-
ется функция "free".)
Об аппаратной реализации.
Програмная реализация вышеописанного стэкового механизма мало отличается
от програмной реализации прототипа: каждый стэк размещается в собственной
области памяти, указателями вершин, базы и локального дна могут служить пе-
ременные интерпретатора. Но более эффективно, если они будут размещены в ре-
гистрах процессора.
При аппаратной реализации можно сделать то-же самое, но так как активная
часть стэка играет роль сверхоперативной памяти процессора, то размещать ее
в оперативной памяти неэффективно. При наличии КЭШ-памяти эффективность за-
метно повышается, но количество лишних обращений в ОЗУ все равно будет вели-
ко. (Не следует спешить копировать в основную память значение, помещаемое на
вершину стэка - очень велика вероятность, что оно в ближайшее время будет
оттуда убрано.) Поэтому предлагается реализация активной части стэка в виде
набора регистров процессора.
В процессоре имеется регистровый пул (например 32 регистра), предназначен-
ных для размещения активной части стэка. Каждый регистр пула снабжен двумя
признаками: "есть" и "новый". Признак "есть" указывает, что в данном ре-
гистре содержится некоторая полезная информация, а признак "новый" - указы-
вает, что эта информация еще не скопирована в оперативную память. Еще име-
ется счетчик, содержащий номер того регистра, который в данный момент со-
держит слово, находящееся на вершине стэка. (При 32х регистрах - счетчик пя-
тиразрядный.) Количество разрядов счетчика N, а количество регистров - два в
степени N. При чтении слова со стэка оно берется из регистра, номер которого
содержится в счетчике, а он автоматичесски уменьшается; при помещении слова
на стэк, содержимое счетчика автоматичесски увеличивается, а потом произво-
дится запись в регистр с получившимся номером. При этом счетчик может пере-
полняться и обнуляться, так что регистровый пул замкнут в кольцо.
Считывание слова из буферного регистра возможно только в том случае, если
признак "есть" установлен; запись - если признак "новый" сброшен. Иначе дея-
тельность процессора приостанавливается до тех пор, пока соответствующий
признак не изменится. В процессоре имеются два автономно действующих меха-
низма. Один из них занимается подкачкой данных из памяти в регистровый пул,
а второй - откачкой из пула в память. Первый механизм находит максимально
удаленный от вершины регистр у которого признак "есть" сброшен, читает слово
из памяти и поместив его туда устанавливает это признак. (Признак "новый"
остается сброшенным.) Второй находит максимально удаленный от вершины ре-
гистр, у которого установлен признак "новый", копирует слово в память и
сбрасывает его. (Признак "есть" остается установленным.) Следует заметить,
что при записи слова на вершину стэка устанавливаются оба признака, а при
чтении - оба признака сбрасываются.
Оба механизма обращаются к памяти через общее для всего процессора устрой-
ство связи с памятью, причем их приоритет ниже приоритетов всех остальных
устройств процессора. (Тоесть устройство связи с памятью обслуживает их в
последнюю очередь, когда ни одно другое устройство процессора к памяти не
обращается.) Относительный приоритет больше у того из двух устройств, кото-
рое нашло слово, дальше отстоящее от вершины стэка.
Таким образом одно из этих устройств стремится добиться такого состояния,
когда максимальное количество регистров заполнено полезной информацией, а
второе - чтобы было максимальное количество места для результатов. Пока для
очередной команды есть операнды и место, куда поместить результаты, происхо-
дит "привентивная" перекачка данных в моменты когда к памяти никто не обра-
щается. Иначе перекачка данных происходит в срочном порядке, так как другие
действия приостанавливаются.
Такая организация активной части стэка удобна еще и тем, что позволяет
обойтись без реальной передачи данных в случаях, когда часть содержимого
стэка уничтожается, а активная часть переносится на его место. (Это происхо-
дит при распространении ситуации и при ликвидации записи активации.) Если
размер активной части стэка меньше размера регистрового пула, то достаточно
просто переставить соответствующим образом указатели вершины и дна, сбросить
признак "есть" у всех регистров, "ниже дна", а у остальных установить
признак "новый".
Заключение.
Описанный стэковый механизм, сохраняя основные достоинства прототипа,
обладает дополнительными свойствами, которые в совокупности можно определить
как "более высокий семантичесский уровень".