2008-12-15 6 views
20

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

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

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

+1

Что-то думать о том, что многие языки предлагают как VB, Objective-C, C++/COM, так и C#. – 2012-03-29 00:18:05

ответ

12

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

+0

Тогда вы ожидаете, что мы будем все чаще обращаться к поздним языкам привязки? Или что существующие языки будут морфироваться от раннего до позднего? Являются ли позднесвязывающие Java и C# разумными понятиями? – dkretz 2008-12-15 04:22:36

+0

@ [le dorfier]: аппаратное обеспечение продолжает работать быстрее, поэтому накладные расходы становятся менее значительными – 2008-12-15 05:06:21

+0

Я знаю. Но является ли это единственной причиной того, что все языки не являются поздними связями? Smalltalk был почти приемлемо быстрым 20 лет назад - сейчас он должен быть быстрым, но он не является доминирующим. В частности, мы все еще оседланы ранними C# и java в качестве языков выбора для большинства новых не-веб-приложений. – dkretz 2008-12-15 06:33:48

2

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

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

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

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

3

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

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

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

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

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

11

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

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

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

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

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

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

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

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

-1
времени

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

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

3

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