Динамическое связывание в интерпретируемых языках против скомпилированных языков

Итак, в настоящее время читаем о связывании... Основываясь на примерах, которые я могу придумать, наряду с примерами, найденными в Интернете, кажется, что динамическое связывание обычно происходит в интерпретируемых языках, а не в компилируемых языках. Также имеет тенденцию происходить немного в Java, но Java не является "чисто" скомпилированным языком. Я прочитал - http://en.wikipedia.org/wiki/Dynamic_binding_(computing).

Мой вопрос тогда - для классов, методов и объектов, динамическое связывание происходит сначала на уровне объекта, а затем прослеживается до методов, классов и тому подобного? Кроме того, существуют ли случаи, когда динамическое связывание происходит на уровне объекта в скомпилированном языке?

3 ответа

Скомпилированный язык и интерпретируемый язык - это ложная дихотомия, которая вызывает много путаницы в сообществе языков программирования. Многие современные платформы реализации языка включают в себя как интерпретатор, так и компилятор. Даже если оригинальная и давняя реализация языка была компилятором, это не значит, что кто-то не сможет написать интерпретатор для него позже. Существует более одного интерпретатора C, а также дюжина компиляторов Lisp.

У вашего вопроса есть ряд проблем с определениями. Для динамического связывания вы можете подумать о:

  • перегрузка функций (C++)
  • vtable dispatch (C++)
  • динамический поиск имен и отправка классов (Smalltalk, ruby, python и т. д.)
  • динамический поиск имени и диспетчеризация объекта (Javascript)
  • позднее связывание (VB6 COM)
  • динамическая отправка (Лисп, Дилан)

Для скомпилированных и интерпретированных вы можете подумать о:

  • скомпилировано в машинный код (C/C++)
  • скомпилирован в байт-код, затем скомпилирован JIT (C#, Java)
  • скомпилирован в байт-код, с VM (Java, Python)
  • разобрали и токенизировали (?)

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

Таким образом, ответ, это зависит.

Нет, динамическое связывание может происходить в скомпилированных языках, таких как C++:

https://en.wikipedia.org/wiki/Dynamic_binding_%28computing%29

Обратите внимание, что Java также скомпилирована в байт-код, который затем интерпретируется JVM. Иногда разница между интерпретируемыми и скомпилированными языками может быть размытой (например, C++ с использованием динамической диспетчеризации).