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 ). Когда происходит вызов санка,

он вычисляет значение фактического параметра ( если этот параметр

не переменная ) и передает адрес этого значения. В теле процедуры

при каждой ссылке на формальный параметр происходит вызов санка,

после чего для обращения к нужному значению используется

переданный санком адрес.

Различие между вызовом по ссылке и вызовом по имени

заключается в следующем: адрес фактического параметра,

вызываемого по ссылке, вычисляется только один раз, перед

фактическим входом в процедуру, в то время как для вызова по

имени адрес вычисляется всякий раз, когда в теле процедуры есть

обращение к формальному параметру.

Имя массива в качестве фактического параметра

В этом случае и фактический, и формальный параметр должны

быть массивами. Процедуре передается адрес первого элемента

массива ( для языков, которые не требуют информационных

векторов ) или адрес информационного вектора, и этот адрес

используется процедурой для ссылки на элементы массива.

Имя процедуры в качестве фактического параметра

Передаваемый адрес - это адрес первой команды процедуры,

которая встретилась в качестве фактического параметра. Если это

имя само является формальным параметром, то адрес был передан

вызывающей процедуре, когда она вызывалась.


Информация о работе «Распределение памяти»
Раздел: Информатика
Количество знаков с пробелами: 46448
Количество таблиц: 0
Количество изображений: 0

Похожие работы

Скачать
13544
0
0

... 12 Библиографический список................................................................. 15 Введение   Целью работы является демонстрация работы с динамической памятью на примере программ разработанных к заданиям 2, 6, 8, 10, 12, 14, 16 из методического указания [1]. Динамическое распределение памяти предоставляет программисту большие возможности при обращении к ресурсам памяти в ...

Скачать
28336
0
12

... задачи П4 место загружается задача П6, поступившая в момент t3. Рис. 2.10. Распределение памяти динамическими разделами Задачами операционной системы при реализации данного метода управления памятью является: ведение таблиц свободных и занятых областей, в которых указываются начальные адреса и размеры участков памяти, при поступлении новой задачи - анализ запроса, просмотр ...

Скачать
48910
4
3

... .) В системах, в которых страницы инструкций (в противоположность страницам данных) являются реентерабельными, бит изменения никогда не устанавливается. 2. Разработка алгоритма управления оперативной памятью Ниже приведён алгоритм управления оперативной памятью в системе Linux. В основе всего лежат страницы памяти. В ядре они описываются структурой mem_map_t. typedef struct page { /* ...

Скачать
21451
0
0

... новые следы памяти могут поступать в активном или неактивном состоянии. Именно это свойство лежит в основе исключительно важного феномена — так называемого латентного обучения. Концепция состояний памяти свободна от условного деления на кратковременную и долговременную и потому может объяснять феномены, которые остаются непонятными с точки зрения временного подхода к организации памяти. То, что ...

0 комментариев


Наверх