в чем разница между этими 4 терминами, можете ли вы привести примеры?
статически/динамически типизированный против статического/динамического связывания
Ответы (2)
Статический и динамический – жаргонные слова, обозначающие момент времени, в который разрешается какой-либо программный элемент. Статический указывает, что разрешение происходит во время создания программы. Динамический указывает, что разрешение происходит во время запуска программы.
Статическая и динамическая типизация
Ввод относится к изменениям в структуре программы, вызванным различиями между значениями данных: целыми числами, символами, числами с плавающей запятой, строками, объектами и т. д. Эти различия могут иметь множество последствий, например:
- макет памяти (например, 4 байта для int, 8 байтов для двойного, больше для объекта)
- выполняемые инструкции (например, примитивные операции для добавления маленьких целых чисел, библиотечные вызовы для добавления больших)
- поток программы (простые соглашения о вызове подпрограммы по сравнению с хэш-диспетчером для нескольких методов)
Статическая типизация означает, что исполняемая форма программы, сгенерированная во время сборки, будет различаться в зависимости от типов значений данных, найденных в программе. Динамическая типизация означает, что сгенерированный код всегда будет одинаковым, независимо от типа — любые различия в выполнении будут определены во время выполнения.
Обратите внимание, что лишь немногие реальные системы являются либо одним, либо другим, вопрос лишь в том, какая стратегия предпочтительнее.
Статическая и динамическая привязка
Привязка относится к ассоциации имен в тексте программы с местами хранения, к которым они относятся. В статической привязке эта связь предопределяется во время сборки. При динамическом связывании эта связь не определяется до времени выполнения.
Настоящая статическая привязка почти исчезла. Более ранние ассемблеры и FORTRAN, например, полностью предварительно вычисляли точное расположение в памяти всех переменных и местоположений подпрограмм. Эта ситуация длилась недолго, с введением выделения стека и кучи для переменных и динамически загружаемых библиотек для подпрограмм.
Так что следует проявить некоторую вольность в определениях. Здесь важен дух концепции: статически связанные программы заранее вычисляют как можно больше информации о расположении хранилища, насколько это возможно в современной виртуальной памяти, со сборкой мусора, отдельно скомпилированным приложением. Динамически связанные программы ждут как можно дольше.
Пример может помочь. Если я попытаюсь вызвать метод MyClass.foo()
, система статической привязки проверит во время сборки, что существует класс с именем MyClass
и этот класс имеет метод с именем foo
. Система динамического связывания будет ждать до времени выполнения, чтобы увидеть, существует ли какой-либо из них.
Контрасты
Основная сила статических стратегий заключается в том, что транслятор программы гораздо лучше осведомлен о намерениях программиста. Это упрощает:
поймать много распространенных ошибок на ранней стадии, на этапе сборки
создавать инструменты рефакторинга
нести значительную часть вычислительных затрат, необходимых для определения исполняемой формы программы только один раз, во время сборки
Основная сила динамических стратегий заключается в том, что их гораздо проще реализовать, а это означает, что:
рабочая динамическая среда может быть создана за долю стоимости статической
легче добавлять языковые функции, которые может быть очень сложно проверить статически
легче обрабатывать ситуации, требующие самомодифицирующегося кода
Типизация - относится к типам переменных и разрешено ли переменным изменять тип во время выполнения программы.
http://en.wikipedia.org/wiki/Type_system#Type_checking
Связывание - это, как вы можете прочитать ниже, может относиться к связыванию переменных или связыванию библиотек.
http://en.wikipedia.org/wiki/Binding_%28computer_science%29#Language_or_Name_binding