Глава 27 Динамическая загрузка во время выполнения
Глава 27
Динамическая загрузка во время выполнения
Загрузка разделяемых (совместно используемых) объектов во время выполнения может оказаться полезным способом для структурирования собственных приложений. Если правильно организовать этот процесс, то тогда можно будет сделать ваше приложение расширяемым, а кроме этого, вы сможете разбивать свой код на логически отдельные модули, что является хорошим стилем написания программ.
Многие Unix-приложения, в частности крупные приложения, в основном реализуются в виде отдельных блоков кода, часто называемых подключаемыми модулями или просто модулями. В некоторых случаях они реализуются в виде полностью независимых программ, которые связываются с основным кодом приложения через каналы или с помощью какой-то другой разновидности межпроцессного взаимодействия (interprocess communication — IPC). В остальных случаях они реализуются в виде разделяемых объектов.
Разделяемые объекты обычно создаются подобно стандартным разделяемым библиотекам (см. главу 8), однако используются они совершенно иначе. Компоновщику никогда не сообщается о разделяемых объектах, и во время компоновки приложения они даже не нужны. Их не нужно устанавливать в системе таким же способом, как и разделяемые библиотеки.
Подобно обычным разделяемым библиотекам, разделяемые объекты должны компоноваться явным образом с каждой библиотекой, которая их вызывает. Это позволит гарантировать, что динамический загрузчик корректно разрешит работу всех внешних ссылок при загрузке разделяемого объекта. Если этого не сделать, то внешние ссылки будут разрешены только в контексте того приложения, которое в данном случае будет загружать разделяемый объект. Теоретически разделяемые объекты могут быть стандартными объектными файлами. Однако так поступать не рекомендуется, поскольку внешние зависимости разделяемой библиотеки не будут разрешены должным образом, как и разделяемой библиотеки, явным образом не скомпонованной относительно всех библиотек, от которых она зависит.
Символьные имена, используемые в разделяемых объектах, не обязательно должны быть уникальными среди различных разделяемых объектов, загружаемых в одну и ту же программу; обычно они таковыми и не являются. Различные разделяемые объекты, написанные для одного и того же интерфейса, обычно используют точки входа с одинаковыми именами. Для обычных разделяемых библиотек такая практика будет истинным бедствием, а для разделяемых объектов, динамически загружаемых во время выполнения, именно так и поступают.
Пожалуй, чаще всего разделяемые объекты, загружаемые во время выполнения, применяются при создании интерфейса для некоторого общего средства, которое может иметь множество различных реализаций. Рассмотрим, к примеру, процедуру сохранения графического файла. Приложение может иметь один внутренний формат для управления его графикой, однако существует много других форматов файлов, в которых приложению понадобится сохранить графические данные, и еще больше форматов создано для разнообразных частных ситуаций [21]. Обобщенный интерфейс для сохранения графического файла, который экспортируется разделяемыми объектами, загружаемыми во время выполнения, позволяет программистам добавлять новые форматы графических файлов в приложение без повторной его компиляции. Если интерфейс хорошо документирован, то даже независимые разработчики, не имеющие исходного кода приложения, смогут включать новые форматы графических файлов.
Точно так же используется и код каркаса (framework), который предлагает только интерфейс, а не реализацию. Например, каркас РАМ (Pluggable Authentication Modules — подключаемые модули аутентификации) предлагает обобщенный интерфейс для методов аутентификации с запросом и подтверждением, например, с участием имен пользователей и паролей. Сам процесс аутентификации осуществляется посредством модулей, а решение о выборе модуля аутентификации для отдельно взятого приложения принимается во время выполнения (а не во время компиляции) за счет обращения к конфигурационным файлам. Этот интерфейс имеет хорошее описание и является стабильным, а новые модули можно внедрять и использовать в любой момент без повторной компиляции каркаса или приложения. Каркас загружается в виде разделяемой библиотеки, а код в этой разделяемой библиотеке загружает и выгружает модули, обеспечивающие методы аутентификации.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
ГЛАВА 7 Потоки и планирование выполнения
ГЛАВА 7 Потоки и планирование выполнения Основной единицей выполнения в Windows является поток, и одновременно несколько потоков могут выполняться в рамках одного процесса, разделяя его адресное пространство и другие ресурсы. В главе 6 процессы ограничивались только одним
Глава 6 Загрузка файлов из Интернета
Глава 6 Загрузка файлов из Интернета • Загрузка файлов с помощью браузера• Менеджеры закачек• Загрузка и скачивание файлов посредством FTP• Файлообменные сетиПользователь, хотя бы немного знакомый с Интернетом, наверняка знает, что содержимое Сети не ограничивается
Глава 3 Загрузка Ubuntu с LiveCD
Глава 3 Загрузка Ubuntu с LiveCD Одной из интереснейших особенностей Ubuntu является то, что вы можете оценить систему в первом приближении, не устанавливая её на компьютер. Итак, у вас уже есть установочный диск (или флешка), давайте запустим с него
Глава 8 Первая загрузка
Глава 8 Первая загрузка Надеюсь, вы успешно справились с установкой Ubuntu на ваш компьютер. Настало время первый раз загрузиться в вашу новую систему. Итак, что же вас ждёт?Сначала, после экрана BIOS, вы увидите загрузчик GRUB. Если у вас на компьютере кроме свежеустановленной
Глава 2 Загрузка файлов из Интернета
Глава 2 Загрузка файлов из Интернета Загрузка файлов с помощью браузераМенеджеры закачекЗагрузка и выгрузка файлов посредством FTPФайлообменные сетиМультимедийные файлыАрхивыДокументыПользователь, хотя бы немного знакомый с Интернетом, наверняка знает, что
15.8.2. Emacs и отладка во время выполнения
15.8.2. Emacs и отладка во время выполнения Для обнаружения ошибок времени выполнения Emacs предоставляет аналогичную возможность интеграции с символическим отладчиком, т.е. разработчик может использовать какой-либо Emacs-режим для установки контрольных точек в программах и
15.8.2. Emacs и отладка во время выполнения
15.8.2. Emacs и отладка во время выполнения Для обнаружения ошибок времени выполнения Emacs предоставляет аналогичную возможность интеграции с символическим отладчиком, т.е. разработчик может использовать какой-либо Emacs-режим для установки контрольных точек в программах и
1.4.1. Кодирование во время выполнения
1.4.1. Кодирование во время выполнения Мы уже упоминали директивы load и require. Важно понимать, что это не встроенные предложения и не управляющие конструкции; на самом деле это методы. Поэтому их можно вызывать, передавая переменные или выражения как параметры, в том числе
8.6. Определение типа объекта во время выполнения
8.6. Определение типа объекта во время выполнения ПроблемаВо время выполнения требуется динамически узнавать тип определенного класса.РешениеДля запроса, на объект какого типа указывает адрес объекта, используйте идентификацию типов во время выполнения (обычно
2.3.6. Динамическая загрузка и выгрузка
2.3.6. Динамическая загрузка и выгрузка Иногда на этапе выполнения программы требуется загрузить некоторый код без явной компоновки. Рассмотрим приложение, поддерживающее подключаемые модули: Web-броузер. Архитектура броузера позволяет сторонним разработчикам создавать
19.1. Идентификация типов во время выполнения
19.1. Идентификация типов во время выполнения * RTTI позволяет программам, которые манипулируют объектами через указатели или ссылки на базовые классы, получить истинный производный тип адресуемого объекта. Для поддержки RTTI в языке C++ есть два оператора: оператор dynamic_cast
Глава 4 БЕСПЛАТНАЯ ЗАГРУЗКА МЕЛОДИЙ, КАРТИНОК И ИГР
Глава 4 БЕСПЛАТНАЯ ЗАГРУЗКА МЕЛОДИЙ, КАРТИНОК И ИГР Сегодня распространение мелодий, картинок и игр превратилось в очень доходный и можно даже сказать модный бизнес. Путешествуя по Интернету, вы увидите огромное количество баннеров, оповещающих о том, что на таком-то