Что такое динамическое и статическое подключение?

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

Что такое динамическое и статическое подключение?

1
задан 31 July 2015 в 06:52

1 ответ

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

, Что такое динамическое и статическое подключение?

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

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

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

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

<час>

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

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

2
ответ дан 7 December 2019 в 13:55

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

Похожие вопросы: