В языках программирования , имя связывание является объединением юридических лиц (данных и / или коды) с идентификаторами . [1] Считается, что идентификатор, связанный с объектом, ссылается на этот объект. Машинные языки не имеют встроенного понятия идентификаторов, но привязки имя-объект как услуга и нотация для программиста реализованы языками программирования. Связывание тесно связано с областью видимости , поскольку область видимости определяет, какие имена связаны с какими объектами - в каких местах программного кода ( лексически ) и в каком одном из возможных путей выполнения ( временно ).
Использование идентификатора id
в контексте, который устанавливает привязку для id
, называется привязкой (или определяющим) вхождением. Во всех других случаях (например, в выражениях, назначениях и вызовах подпрограмм) идентификатор обозначает то, с чем он связан; такие случаи называются прикладными.
Связывание времени
- Статическая привязка (или ранняя привязка ) - это привязка имени, выполняемая перед запуском программы. [2]
- Динамическое связывание (или позднее связывание, или виртуальное связывание ) - это связывание имени, выполняемое во время работы программы. [2]
Примером статической привязки является прямой вызов функции C : функция, на которую ссылается идентификатор, не может измениться во время выполнения.
Но примером динамического связывания является динамическая отправка , как в вызове виртуального метода C ++ . Поскольку конкретный тип полиморфного объекта неизвестен до времени выполнения (в общем случае), выполняемая функция динамически связана. Возьмем, например, следующий код Java :
public void foo ( java . util . List < String > list ) { list . добавить ( "бар" ); }
List
является интерфейсом , поэтому list
должен относиться к его подтипу . Это ссылка на LinkedList
, ArrayList
, или какой -либо другой подвид из List
? Фактический метод, на который ссылается, add
неизвестен до времени выполнения. В C таким экземпляром динамического связывания может быть вызов функции, на которую указывает переменная или выражение типа указателя на функцию, значение которого неизвестно до тех пор, пока оно не будет фактически оценено во время выполнения.
Повторное связывание и мутация
Повторное связывание не следует путать с мутацией.
- Повторная привязка - это изменение ссылочного идентификатора.
- Мутация - это изменение объекта, на который имеется ссылка .
Рассмотрим следующий код Java :
LinkedList < String > list ; список = новый LinkedList < String > (); список . добавить ( "фу" ); список = ноль ;
Идентификатор list
изначально ни на что не ссылается (он не инициализирован ); затем он повторно связывается для ссылки на объект (связанный список строк). Связанный список, на который ссылается, list
затем изменяется, добавляя строку в список. И, наконец, list
отскок null
.
Поздняя статика
Поздняя статическая привязка - это вариант привязки где-то между статической и динамической привязкой. Рассмотрим следующий пример PHP :
класс А { общедоступные статические $ word = "привет" ; общедоступная статическая функция hello () { print self :: $ word ; } }класс B расширяет A { public static $ word = "пока" ; }B :: привет ();
В этом примере интерпретатор PHP связывает ключевое слово self
внутри A::hello()
с классом A
, и поэтому вызов to B::hello()
производит строку «hello». Если бы семантика self::$word
была основана на позднем статическом связывании, то результатом было бы «пока».
Начиная с версии PHP 5.3, поддерживается позднее статическое связывание. [3] В частности, если self::$word
в приведенном выше было изменено на, static::$word
как показано в следующем блоке, где ключевое слово static
будет привязано только во время выполнения, тогда результатом вызова B::hello()
будет «до свидания»:
класс А { общедоступные статические $ word = "привет" ; общедоступная статическая функция hello () { print static :: $ word ; } }класс B расширяет A { public static $ word = "пока" ; }B :: привет ();
Смотрите также
- Поздняя привязка
- Таблица ветвлений метод применения привязки имен через таблицу ветвлений или указатели функций
- Динамическая отправка
- Абстрактный синтаксис высшего порядка (HOAS)
Рекомендации
- ^ Microsoft (11 мая 2007 г.), Использование раннего и позднего связывания в автоматизации , Microsoft , получено 11 мая 2009 г.
- ^ а б Системная и программная инженерия - Словарь ISO / IEC / IEEE 24765: 2010 (E) , IEEE, 15 декабря 2010 г.
- ^ «Поздние статические привязки» . Проверено 3 июля 2013 года .