Раннее связывание против позднего связывания: каковы сравнительные преимущества и недостатки? - PullRequest
20 голосов
/ 15 декабря 2008

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

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

Но я действительно не знаю, как сбалансировать компромиссы.

Ответы [ 6 ]

12 голосов
/ 15 декабря 2008

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

11 голосов
/ 19 января 2009

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

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

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

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

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

  • Простота освоения

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

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

3 голосов
/ 15 октября 2013

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

3 голосов
/ 06 января 2009

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

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

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

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

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

2 голосов
/ 15 декабря 2008

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

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

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

и Позднее связывание выяснит, что это за Excel.Application и где его взять ...

0 голосов
/ 16 октября 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...