Курс Основы построения трансляторов


Связывание. Сравнительная характеристика языков программирования - часть 5


 

- виртуальный массив, в котором может меняться не только размерность, но и типы хранящихся в нем элементов, можно смоделировать в Си с помощью динамического массива указателей на переменные - элементы массива:

 

void **p; int n=10;

p = malloc(sizeof(void*)*n);     

int b; double c;

i = 5;

if (i >= n)            // Если надо,

{ n = i+10;      // увеличить размерность

p = realloc(p, sizeof(void *)*n);

}

p[i] = &b;

// ПРИМЕР СИНТАКСИСА ВИРТУАЛЬНОГО МАССИВА

// С ПРОИЗВОЛЬНЫМИ ТИПАМИ ЭЛЕМЕНТОВ

// ReDim  A[];

// int b; double c;

// A[5] = b;

// A[66]= c;

 

Из рассмотренного примера видно, что реализация позднего связывания в языках программирования связана с использованием неявных (скрытых) указателей на структуры данных. Это предположение можно подтвердить и примером связывания для к такого объекта, как функция:

- тело функции является статическим объектом. То есть память под нее выделяется во время трансляции (когда генерируется программный код) в создаваемом объектном модуле. Что же касается вызова функции, то связывание вызова функции с самой функцией может производиться на разных этапах;

- если функция вызывается в том же самом модуле, где она определена, то связывание вызова функции с ее телом (адресом) осуществляется в процессе трансляции;

- если функция определена в другом модуле (частный случай, библиотека), то связывание вызова функции с ее телом (адресом) осуществляется при компоновке. Для этой цели тело функции в объектном модуле сопровождается информацией, именуемой “точкой входа”, сам вызов сопровождается “внешней ссылкой”, а для корректного формирования вызова Си-компилятору необходимо объявить прототип внешней функции. Для библиотечных функций необходимо подключить заголовочный файл, в котором они содержатся.

В технологии объектно-ориентированного программирования существует термин ПОЛИМОРФНАЯ ФУНКЦИЯ. В Си++ она называется ВИРТУАЛЬНОЙ. На самом деле она представляет собой группу одноименных функций, определенных соответственно для группы родственных (производных классов).


Начало  Назад  Вперед



Книжный магазин