Подтвердить что ты не робот

Раннее связывание с поздним связыванием: каковы сравнительные преимущества и недостатки?

При обсуждении эволюции компьютерных языков Алан Кей говорит, что единственным важным атрибутом его Smalltalk является поздняя привязка; он придает языку его ковкость и расширяемость, а также позволяет со временем корректировать несоответствующую связь. Вы согласны? Имеются ли компенсирующие преимущества для раннего связывания, которые объясняют, почему это, по-видимому, является доминирующей из двух парадигм для доменов, где они могут быть использованы?

Мой личный опыт (который не является достаточно широким или достаточно глубоким, чтобы быть авторитетным), основанный на реализации веб-приложений с javascript, jQuery, jsext, actionscript, php, java, RoR и asp.net, кажется, предполагает положительную корреляцию между связывание и раздувание. Раннее связывание Я уверен, что помогает обнаруживать и предотвращать некоторые ошибки типов, но также делает автозаполнение и хорошую среду IDE, а также хорошую практику программирования в целом. Поэтому я склоняюсь к тому, чтобы укорениться для последней связующей стороны, прежде чем моя сторона, предотвращающая риск, восстановит мою рациональную перспективу.

Но у меня действительно нет хорошего смысла балансировать компромиссы.

4b9b3361

Ответ 1

Традиционно большое преимущество раннего связывания для производительности: поздний язык привязки должен переносить информацию о типе всех своих данных во время выполнения и теряет возможность делать некоторые оптимизации во время компиляции. Это различие стало намного менее значительным, хотя, по мере того, как компьютеры быстрее развиваются, и как VM умнее оптимизировать "на лету".

Ответ 2

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

Было два основных преимущества раннего связывания. Первое:

  • Производительность выполнения

является общепринятым, но, как правило, неактуальным, поскольку в большинстве случаев возможно бросать аппаратное обеспечение в проблему, что дешевле. Есть, конечно, исключения (например, если у вас нет оборудования, на котором вы работаете).

Второе преимущество раннего связывания:

  • Простота разработки

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

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

Ответ 3

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

В то время как некоторые языки на основе VM, такие как Java, ранний связанный с ним машинный код, действительно могут непосредственно связывать непосредственно привязки непосредственно. Чтобы сделать последнее связывание, он должен делать такой же поиск хэша, как и динамический интерпретатор языка. Позднее связывание затем требует выполнения кода для выполнения адреса (так работает автоматизация OLE). Это не может быть сделано непосредственно CPU - код должен быть выполнен.

Обратите внимание, что код, выполняющий последнее связывание, на самом деле будет иметь свои собственные ранние целевые объекты ветвления в функции поиска хэша и так далее. Таким образом, с этой точки зрения раннее связывание необходимо для любого кода, который должен быть непосредственно выполнен CPU. Позднее связывание должно выполняться в программном обеспечении.

Раннее связывание также необходимо для широкого спектра оптимизаций кода.

Архитектуры, такие как C, имеют сладкое пятно при написании кода, близком к металлу. Там, где вы хотите сделать это, ранний связующий аспект в значительной степени присущ архитектуре языка. В позднем связанном языке, таком как Python, поздняя привязка также присуща. Некоторые языки предлагают оба варианта, но используемый конкретный тип будет привязан к конкретной выполняемой конструкции.

Ответ 4

Late-binging позволяет текущей системе расширяться. Например, система начинает знать о волках. По прошествии времени метод evolveDomesticate(), Wolf (?), Закручивает новый класс Dog и создает его, и теперь у нас есть Собаки. Smalltalk сохранил бы весь образ системы, поэтому, если вы закроете его и перезапустите, собаки будут существовать после перезагрузки. После того, как вы перейдете к объектам, работающим на определенном оборудовании и подключенным в сетчатой ​​сети, нет реального отключения всей экосистемы (пока Солнце не взорвется). Я думаю, что это то, что Алан Кей говорил о преимуществах позднего связывания, стать Богом.

Ответ 5

Я думаю, что есть лучшие способы/шаблоны, чтобы избежать неправильной связи, например, инверсия управления, инъекция зависимостей, фабрики,...

Но мне нравится "простая в использовании" версия независимости позднего связывания
Просто используйте

var excel = CreateObject("Excel.Application");

и Late binding выяснит, какой Excel.Application и где его получить...

Ответ 6

скомпилировать привязку времени, в которой связь выполняется во время компиляции, известна как раннее связывание

динамическое связывание, в котором связывание функции, выполняемой во время выполнения при вызове функции, известно как поздняя привязка