Информатика и технология программирования

       

Динамическое связывание


Как известно, транслятор превращает вызов функции в команду процессора, в которой присутствует адрес этой функции. Если же функция внешняя, то это же самое делает компоновщик на этапе сборки программы (см.4.6). Это называется СТАТИЧЕСКИМ СВЯЗЫВАНИЕМ в том смысле, что в момент загрузки программы все связи между вызовами функций и самими функциями установлены. ДИНАМИЧЕСКИМ СВЯЗЫВАНИЕМ называется связывание вызова внешней функции с ее адресом во время работы программы. Это дает более компактный код программы, так как сама вызываемая функция может отсутствовать в памяти и загружаться только по мере необходимости. Само собой разумеется, что транслятор должен иметь встроенные механизмы поддержки таких функций и библиотек. Сам способ связывания носит название динамического связывания, а библиотеки -динамически связываемыми библиотеками (DLL - dynamic link library). Сам механизм основывается на использовании указателей на функции. Следующий пример раскрывает в первом приближении сущность процесса динамического связывания.


//------------------------------------------------------bk56-03.cpp


&#35include &#60math.h&#62
typedef void (*VPTR)();
typedef double (*DPTR)(double);
struct ENTRY // описание точки входа функции


{
char name[20];
VPTR pf;
};
struct ENTRY DLL[] = // массив точек входа


{
{"sin", (VPTR)sin}, {"cos", (VPTR)cos,},
{"tan", (VPTR)tan}, {"",NULL}};
// Поиск указателя на функцию по имени функции


// (функция возвращает указатель на функцию вида void f())


VPTR DLink(ENTRY *pDLL, char *ps)
{ int n;
for (n=0; pDLL[n].pf !=NULL; n++)
if (strcmp(pDLL[n].name,ps) == 0)
return pDLL[n].pf;
return NULL;
}
void main()
{
double (*pa1)(double), (*pa2)(double);
//----- Динамическое связывание и вызов функций


if ((pa1 = (DPTR)DLink(DLL,"a1")) == NULL) return;
if ((pa2 = (DPTR)DLink(DLL,"a2")) == NULL) return;
y = (*pa1)(2.0) + (*pa2)(x);
}



Содержание раздела