Что такое динамическое и статическое связывание?

Я слышал термины "Динамически связанные" и "Статически связанные", разбросанные в отношении упаковки, и я никогда не понимал, что на самом деле означают эти термины.

Что такое динамическое и статическое связывание?

1 ответ

Решение

Этот вопрос нужно разбить на две части: "Что такое динамическое и статическое связывание?" И "Как Click решает проблемы зависимости?". Два не связаны. Здесь я дам попытку ответить на первый вопрос.

Что такое динамическое и статическое связывание?

Исходный код любой программы использует внешние функции. Внешние функции находятся в библиотеках. При компиляции программы в машинный код * внешние ссылки должны как-то быть связаны с их определениями, то есть с их реализацией в машинном коде. Есть два подхода к этому. Либо (а) код реализации "извлекается" из библиотек и добавляется в результирующий двоичный файл, либо (б) ссылки остаются висящими и будут "указывать" на их реализацию во время выполнения. Мы называем (а) статическое связывание и (б) динамическое связывание.

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

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

Можно сказать, что каждая система упаковки, помимо упрощения установки программного обеспечения, является попыткой решить проблемы зависимости и управления версиями, при этом используя преимущества динамических зависимостей. Система упаковки Debian в то время, когда она появилась, была намного лучше, чем существующие. С тех пор появилось много других решений. Особенно тщательный подход используется GNU Guix и его менеджером пакетов Guix. Нажмите это другое.


*) Мы предполагаем, что программа скомпилирована в машинный код, а не та, которая будет интерпретирована или скомпилирована в промежуточный язык (например, Python, Java). На абстрактном уровне эти языки страдают от тех же проблем динамического разрешения (ClassNotFoundException в Java), но включение их здесь просто запутало бы объяснение.

**) Обратите внимание, что если вы придерживаетесь статически связанных двоичных файлов, то не будет взаимозависимостей во время выполнения. То есть нет библиотечных зависимостей, есть и другие виды.

Другие вопросы по тегам