6. Соответствие фактических и формальных параметров
Рассмотрим различные типы формальных параметров и их
соответствие фактическим параметрам и покажем, как каждый из них
может быть реализован. Под формальным параметром мы понимаем
идентификатор в процедуре, который заменяется другим
идентификатором или выражением при вызове процедуры.
При обращении к процедуре, скажем, устанавливается некоторым
образом связь между формальными параметрами и фактическими
параметрами.
Когда в каком-нибудь языке происходит обращение к процедуре,
ей передается список адресов аргументов. Процедура переписывает
эти адреса в свою собственную область данных и использует их для
установления соответствия фактических и формальных параметров.
Кроме фактических параметров, часто имеется несколько неявных
параметров, о которых программист не знает. Один из них это,
конечно, адрес возврата. Следовательно, вызываемой процедуре
передается список такого вида:
неявный параметр 1
.
.
.
неявныи параметр m
адрес фактического параметра 1
.
.
.
адрес фактического параметра n
Что представляют собой адреса в списке? Это зависит от языка
и от типа параметра. Нише перечислены типы параметров, которые
мы будем рассматривать:
1) вызов по ссылке;
2) вызов по значению;
3) вызов по результату;
4) фиктивные аргументы;
5) вызов по имени;
6) имена массивов в качестве фактических параметров;
7) имена процедур в качестве фактических параметров.
Вызов по ссылке ( by reference )
Этот тип параметра самый простой для реализации.
Фактический параметр обрабатывается во время выполнения
программы перед вызовом; если он не является переменной или
константой, он вычисляется и запоминается во временной ячейке.
Затем вычисляется адрес ( переменной, константы или временной
ячейки ), и этот адрес передается вызываемой процедуре.
Вызываемая процедура использует его для ссылки на ячейку (ячейки),
содержащую значение.
Вызов по значению ( by value )
При этом типе соответствия формального и фактического
параметров вызываемая процедура имеет ячейку, выделенную в ее
области данных для значения формального параметра этого типа. Как
и при вызове по ссылке, адрес фактического параметра вычисляется
перед вызовом и передается вызываемой процедуре в списке
параметров. Однако перед фактическим началом выполнения процедура
выбирает значение по адресу и заносит его в свою собственную
ячейку. Эта ячейка затем используется как ячейка для величины
точно так же, как любая переменная, локализованная в процедуре.
Таким образом, нет никакого способа изменить в процедуре значение
фактического параметра.
Вызов по результату ( by result )
В языке АЛГОЛ W для любого формального параметра Х,
объявленного параметром RESULT, справедливо следующее:
1. Для параметра Х отводится ячейка в области данных
процедуры. Эта ячейка используется в процедуре как локализованная
ячейка для переменной Х.
2. Как и в случае параметра VALUE, при рызоре при вызове
процедуры вычисляется и передается адрес фактического параметра.
3. Когда выполнение процедуры заканчивается, полученное
значение Х запоминается по адресу, описанному в п.2.
Другими словами, параметр RESULT есть переменная,
локализованная в процедуре, значение которой при выходе
запоминается в соответствующем фактическом параметре (который
должен быть конечно, переменной ). Понятие RESULT было
предназначено для того, чтобы дополнить в АЛГОЛе вызов по имени
( который описан ниже ), так как последний весьма неэффективен и
обладает большими возможностями, чем это необходимо в
большинстве случаев.
Фиктивные аргументы
В развитых языках следующие фактические параметры
обрабатываются по-разному:
1) константы;
2) выражения, которые не являются переменными;
З) переменные, чьи характеристики отличаются от характеристик
указанных для соответствующих формальных параметров.
Для такого фактического параметра в вызывающей процедуре
заводится временная переменная. Фактический параметр вычисляется
и запоминается во временной переменпой, и адрес этой переменной
передается в списке параметров. Такая переменная называется
фиктивным аргументом.
Вызов по имени
Согласно сообщению о языке АЛГОЛ, использование вызова
параметра по имени означает буквальную замену имени формального
параметра фактическим параметром.
Получить эффективную реализацию с помощью такой текстовой
замены, конечно, нельзя, и мы должны разработать соответствующий
эквивалентный способ.
Обычный способ реализации вызова параметров по имени
состоит в том, чтобы иметь отдельную программу или процедуру в
объектном коде для каждого такого параметра. Для такой программы
был введен термин "санк" ( thunk ). Когда происходит вызов санка,
он вычисляет значение фактического параметра ( если этот параметр
не переменная ) и передает адрес этого значения. В теле процедуры
при каждой ссылке на формальный параметр происходит вызов санка,
после чего для обращения к нужному значению используется
переданный санком адрес.
Различие между вызовом по ссылке и вызовом по имени
заключается в следующем: адрес фактического параметра,
вызываемого по ссылке, вычисляется только один раз, перед
фактическим входом в процедуру, в то время как для вызова по
имени адрес вычисляется всякий раз, когда в теле процедуры есть
обращение к формальному параметру.
Имя массива в качестве фактического параметра
В этом случае и фактический, и формальный параметр должны
быть массивами. Процедуре передается адрес первого элемента
массива ( для языков, которые не требуют информационных
векторов ) или адрес информационного вектора, и этот адрес
используется процедурой для ссылки на элементы массива.
Имя процедуры в качестве фактического параметра
Передаваемый адрес - это адрес первой команды процедуры,
которая встретилась в качестве фактического параметра. Если это
имя само является формальным параметром, то адрес был передан
вызывающей процедуре, когда она вызывалась.
... 12 Библиографический список................................................................. 15 Введение Целью работы является демонстрация работы с динамической памятью на примере программ разработанных к заданиям 2, 6, 8, 10, 12, 14, 16 из методического указания [1]. Динамическое распределение памяти предоставляет программисту большие возможности при обращении к ресурсам памяти в ...
... задачи П4 место загружается задача П6, поступившая в момент t3. Рис. 2.10. Распределение памяти динамическими разделами Задачами операционной системы при реализации данного метода управления памятью является: ведение таблиц свободных и занятых областей, в которых указываются начальные адреса и размеры участков памяти, при поступлении новой задачи - анализ запроса, просмотр ...
... .) В системах, в которых страницы инструкций (в противоположность страницам данных) являются реентерабельными, бит изменения никогда не устанавливается. 2. Разработка алгоритма управления оперативной памятью Ниже приведён алгоритм управления оперативной памятью в системе Linux. В основе всего лежат страницы памяти. В ядре они описываются структурой mem_map_t. typedef struct page { /* ...
... новые следы памяти могут поступать в активном или неактивном состоянии. Именно это свойство лежит в основе исключительно важного феномена — так называемого латентного обучения. Концепция состояний памяти свободна от условного деления на кратковременную и долговременную и потому может объяснять феномены, которые остаются непонятными с точки зрения временного подхода к организации памяти. То, что ...
0 комментариев