Я пытался понять, что различие между ранним и поздним связыванием, и в процессе поняло, что понятие привязки туманно мне. Я думаю, что понимаю, что это касается пути data-as-a-word-of-memory, связан с type-as-a-set-of-language-features, но я не уверен, что это - правильные понятия. Кроме того, как делает понимание, что это глубоко помогает людям стать лучшими программистами?
Пожалуйста, примите во внимание: Этот вопрос не, "что является поздним v. ранних связываний" или, "что является компромиссами между 2". Они уже существуют здесь.
Спасибо,
JDelage
Привязка в общем случае связывает имя с некоторым значением. Значение не обязательно должно быть данными, но может быть любым, у кого есть имя, например функция или класс.
Что касается компромисса:
Раннее связывание делает значение доступным раньше. Так, например, компиляторы могут применять оптимизацию на основе известного значения, например, для вычисления постоянных выражений. Это может привести к повышению производительности и не требует поддержки времени выполнения для получения значения.
Позднее связывание требует значения позже, поэтому оно обеспечивает большую гибкость. Становится проще изменять части кода или реконфигурировать систему.
Общая тенденция заключается в более позднем связывании, потому что с более быстрыми процессорами и лучшими методами (например, JIT-компиляция) это становится возможным чаще.
В контексте компиляторов привязка - это этап, на котором адресные ссылки меняются на фактические абсолютные адреса.
Когда программа скомпилирована , адрес каждого символа (переменной, функции) сохраняется в таблице символов, например, как относительное смещение от начала объектного модуля вместе с именем символа. Имя символа необходимо, поскольку символы могут быть вызваны из другого объектного модуля.
Когда программа связана , объектные модули объединяются в один файл программы, и имена символов больше не нужны. Если программа связана с известным абсолютным адресом, все адресные ссылки могут быть привязаны к абсолютным адресам уже на этом этапе.
Однако на рабочих станциях, таких как PC: s, программа может быть загружена по любому адресу, поэтому адрес неизвестен во время связывания. Таким образом, дополнительная информация о перемещении сохраняется в файле программы, так что загрузчик может связывать адреса во время загрузки.
Привязка выполняется во время загрузки с использованием информации о перемещении. Когда известен адрес, по которому программа будет запускаться, загрузчик заменяет относительные адреса абсолютными адресами, используя информацию о перемещении, которая сообщает, где в коде необходимо внести изменения.
Для динамических объектов / переменных привязка может выполняться во время выполнения . (Я думаю, это то, что обычно называют поздним связыванием.)
Обычно вам не нужно особо заботиться о связывании, по крайней мере, когда используется раннее связывание.(Однако привязка во время выполнения может отрицательно сказаться на производительности и безопасности.)
В простейшем случае привязка - это ассоциация символа в программе с адресом в памяти.
Например: вызов функции в C. Когда вы объявляете функцию, компилятор записывает имя функции и расположение ее кода в объектном файле. Когда вы вызываете функцию из отдельно скомпилированного файла, компилятор записывает ссылку на это имя в том месте, где происходит вызов. Компоновщик отвечает за связывание этих двух ссылок, так что вызов будет ссылаться на правильную ячейку памяти.
«Связывание» в основном означает, что «это имя функции / свойства соответствует этому биту кода».
Если вы говорите больше о привязке данных, то я бы сказал, что определение, используемое Microsoft в их Обзор привязки данных работает достаточно хорошо:
«Привязка данных - это процесс, который устанавливает связь между пользовательским интерфейсом приложения и бизнес-логикой. Если привязка имеет правильные настройки и данные обеспечивают правильные уведомления , затем, когда данные изменяют свое значение, элементы, которые привязаны к данным, отражают изменения автоматически. Связывание данных также может означать, что если внешнее представление данных в элементе изменяется, тогда базовые данные могут быть {{1} } автоматически обновляется, чтобы отразить изменение . Например, если пользователь редактирует значение в элементе TextBox, базовое значение данных автоматически обновляется до отражать это изменение ».
Другими словами, это способ получения данных из источника данных (например, s база данных или XML-файл) и применение этих данных к интерфейсу или элементу отображения. Например, форма может иметь раскрывающийся список значений, которые хранятся в таблице в базе данных. Привязка данных - это процесс «привязки» значений из базы данных к списку. Односторонняя привязка данных обычно доступна только для чтения, но двусторонняя привязка данных позволяет пользователю обновлять значения обратно в базовый источник данных.