Статический и динамический - это жаргонные слова, которые относятся к моменту времени, когда разрешается некоторый элемент программирования. Статический указывает, что разрешение имеет место во время создания программы. Динамический указывает, что разрешение происходит во время выполнения программы.
Статическая и динамическая печать
Печать относится к изменениям в структуре программы, которыеиз-за различий между значениями данных: целыми числами, символами, числами с плавающей запятой, строками, объектами и так далее.Эти различия могут иметь много эффектов, например:
- макет памяти (например, 4 байта для целого числа, 8 байтов для двойного, больше для объекта)
- выполненные инструкции (например,примитивные операции для добавления маленьких целых чисел, вызовы библиотек для добавления больших)
- поток программ (простые соглашения о вызовах подпрограмм в сравнении с хеш-диспетчеризацией для нескольких методов)
Статическая типизация означает, что исполняемая форма программы, сгенерированная во время сборки, будет варьироваться в зависимости от типов значений данных, найденных в программе. Динамическая типизация означает, что сгенерированный код всегда будет одинаковым, независимо от типа - любые различия в исполнении будут определены во время выполнения.
Обратите внимание, что немногие реальные системы являются чистоодин или другой, вопрос только в том, какая стратегия является предпочтительной.
Статическое и динамическое связывание
Связывание относится к ассоциации имен в тексте программы сместа хранения, к которым они относятся.В статической привязке эта связь предопределена во время сборки.При динамическом связывании эта связь не определяется до времени выполнения.
Действительно статическое связывание практически исчезло.Например, более ранние ассемблеры и FORTRAN полностью рассчитывали точное местоположение памяти всех переменных и местоположений подпрограмм.Эта ситуация длилась недолго, с введением выделения стека и кучи для переменных и динамически загружаемых библиотек для подпрограмм.
Так что с определениями нужно быть немного свободнее.Это дух концепции, которая имеет здесь значение: статически связанные программы предварительно рассчитывают как можно больше о разметке хранилища, насколько это практично в современной виртуальной памяти, сборщике мусора, отдельно скомпилированном приложении.Динамически связанные программы ждут как можно позже.
Пример может помочь.Если я попытаюсь вызвать метод MyClass.foo()
, система статической привязки проверит во время сборки, что существует класс с именем MyClass
и этот класс имеет метод с именем foo
.Система динамического связывания будет ждать до времени выполнения, чтобы выяснить, существует ли какой-либо из них.
Контрасты
Основная сила статических стратегий заключается в том, что транслятор программ гораздо лучше осведомлен о намерениях программиста.Это облегчает:
обнаружение многих распространенных ошибок на ранних стадиях сборки
инструменты рефакторинга сборки
Влечет значительную сумму вычислительных затрат, необходимых для определения исполняемой формы программы только один раз, во время сборки
Основная сила динамических стратегий заключается в том, что онинамного проще в реализации, что означает:
рабочую динамическую среду можно создать за долю от стоимости статической
itпроще добавить языковые функции, которые могут быть очень сложными для статической проверки
, легче обрабатывать ситуации, требующие самоизменяющегося кода