Динамическое связывание в интерпретируемых языках против скомпилированных языков
Итак, в настоящее время читаем о связывании... Основываясь на примерах, которые я могу придумать, наряду с примерами, найденными в Интернете, кажется, что динамическое связывание обычно происходит в интерпретируемых языках, а не в компилируемых языках. Также имеет тенденцию происходить немного в 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++ с использованием динамической диспетчеризации).