Эквивалентность типов данных. Ассоциации наименований объектов (пространства имен), страница 3

Временные значения

Локальные данные

Регистры процессора

Связь по доступу

Связь по управлению

Фактические параметры

Возвращаемое значение

Временные значения

Локальные данные

Прямоугольная выноска: Формирует вызывающая процедура

Регистры процессора

Связь по доступу

Связь по управлению

Фактические параметры

 
Возвращаемое значение

Прямоугольная выноска: Запись активации вызывающей процедуры

Стек

 


Передача аргументов

–  передача по значению;

–  передача по указателю;

–  передача по ссылке;

–  копирование-восстановление – значения аргументов при вызове передаются в вызываемую процедуру, а если аргументы имеют l-value, то при возврате новые значения записываются в локальные переменные вызывающей процедуры (в вызове function(a, a+b) первый аргумент имеет l-value, а второй – не имеет);

–  передача по имени – транслятором создаются невидимые программисту thunk-функции, передаваемые из вызывающей процедуры и вычисляющие значения аргументов в контексте вызывающей процедуры при каждом обращении к аргументу в вызываемой процедуре (если вызов функции выглядит примерно так:
               function1( (a+ function2(b)) * c, …)

а сама функция выглядит так:

function1(int arg1) {

    …

    … + arg1 * …

    …

    …* ( arg1 – … )

    …

}

);


Локальные данные процедур

Доступ к объекту примитивного типа


Точка входа

Доступ к объекту

(смещение из команды)

Точка возврата

Команды процедуры

Овал: +Подпись: Поле локальных данных

Объект

Запись активации


Доступ к элементу второго динамического массива в поле локальных данных записи активации

Динамический
массив 2

Динамический
массив 1

Смещение массива 2

внутри записи активации

Запись активации,

поле локальных данных

 
 


Доступ к элементу массива в куче

 



Доступ к нелокальным объектам

Текстуальная область видимости без вложенных процедур

Локальные объекты в записи активации.

Нелокальные объекты – в области статических данных.

Адреса (смещения) и тех и других могут быть вычислены во время трансляции.

Блочные области видимости

Объявление

Область видимости

int a = 0;

B0, B2

int b = 0;

B0, B1

int b = 1;

B1, B3

int a = 2;

B2

int b = 3;

B3

main()

{int a=0;

int b=0;

{int b=1;

{int a=2;

printf(“a=%d b=%d\n”,a,b);

}

{int b=3;

printf(“a=%d b=%d\n”,a,b);

Блок

a

b

B2

2

1

B3

0

3

B1

0

1

B0

0

0

}

printf(“a=%d b=%d\n”,a,b);

}

printf(“a=%d b=%d\n”,a,b);

}

Выделение памяти локальных объектов блоков раздельно в области локальных данных записи активации:

Прямоугольная выноска: Область локальных данных записи активации
 


a2 | b3

b1

b0

a0

Текстуальная область видимости из вложенных процедур