Надежда Ковалевская
Надежда Ковалевская | Репутация: 0 (Без голоса) 26 мая 2018 в 15:29
Что такое связывание адресов во время выполнения?
Игорь Орещенков
Игорь Орещенков | Репутация: 80 (Без статуса) 26 мая 2018 в 20:20

В контексте операционных систем речь, по-видимому, идёт о так называемом динамическом связывании (в противоположность статическому связыванию). Программы для выполнения рутинных операций (печать символов, обмен данными с файлами или по сети) обращаются к внешним подпрограммам, которые организованы в библиотеки - файлы, содержащие код подпрограмм.

Если используется статическое связывание, то при сборке программы компилятор прикрепляет к её машинному коду код необходимых подпрограмм из библиотек, подставляет в точки вызовов подпрограмм их адреса, и записывает результат в исполняемый файл (например, EXE-файл для Windows). При запуске таких программ они загружаются в память вместе с подпрограммами и выполняются.

Чтобы не дублировать код подпрограмм в каждом исполняемом файле (а потом ещё и в оперативной памяти), операционная система может использовать динамические библиотеки (DLL-файлы для Windows). В этом случае машинный код подпрограмм из библиотеки загружается в общую область памяти, известную операционной системе. Программы, собранные с использованием динамического связывания, не имеют в своих файлах машинных кодов используемых подпрограмм. Вместо этого они настроены на использование таблицы адресов подпрограмм - при необходимости обратиться к подпрограмме программа ищет её адрес в этой таблице. А сама таблица адресов заполняется загрузчиком программы (это модуль операционной системы) в ходе подготовки её к выполнению. Заполнение этой таблицы и есть "связывание адресов во время выполнения".

В объектно-ориентированном программировании используется похожая концепция, которая называется ранним и поздним связыванием.