Библиотека-оболочка
Библиотеки-оболочки (или оболочки библиотек ) состоят из тонкого слоя кода (« прокладки »), который преобразует существующий интерфейс библиотеки в совместимый интерфейс. Это делается по нескольким причинам:
- Для улучшения плохо спроектированного или сложного интерфейса.
- Разрешить совместную работу кода, который в противном случае невозможен (например, несовместимые форматы данных).
- Включить межъязыковую совместимость и/или во время выполнения. совместимость
Библиотеки-оболочки могут быть реализованы с использованием адаптера , фасада и, в меньшей степени, прокси шаблонов проектирования .
Структура и реализация
[ редактировать ]Конкретный способ реализации библиотеки-оболочки сильно зависит от среды, в которой она написана, и сценариев, для которых она предназначена. Это особенно верно в том случае, когда межъязыковая совместимость/взаимодействие во время выполнения учитывается .
Пример
[ редактировать ]Ниже представлена общая иллюстрация общей реализации библиотеки-оболочки. В этом примере интерфейс C++ действует как «обертка» C. интерфейса
Интерфейс C
[ редактировать ]int pthread_mutex_init ( pthread_mutex_t * mutex , pthread_mutexattr_t * attr ); int pthread_mutex_destroy ( pthread_mutex_t * mutex ); int pthread_mutex_lock ( pthread_mutex_t * mutex ); int pthread_mutex_unlock ( pthread_mutex_t * mutex );
оболочка C++
[ редактировать ]класс Mutex { pthread_mutex_t mutex ; public : Mutex () { pthread_mutex_init ( & mutex , 0 ); } ~ Мьютекс () { pthread_mutex_destroy ( & мьютекс ); } Частное : друга класс Lock ; void lock () { pthread_mutex_lock ( & мьютекс ); } void unlock () { pthread_mutex_unlock ( & мьютекс ); } }; класс Lock { частное : Mutex & mutex ; public : Lock ( мьютекс и мьютекс ) : мьютекс { мьютекс } { мьютекс . замок (); } ~ Lock () { мьютекс . разблокировать (); } };
Исходный интерфейс C можно считать подверженным ошибкам, особенно в случае, когда пользователи библиотеки забывают разблокировать уже заблокированный мьютекс. Новый интерфейс эффективно использует инициализацию сбора ресурсов (RAII) в новом интерфейсе. Мьютекс и Блокируйте классы, чтобы гарантировать Mutex в конечном итоге разблокируется и Объекты pthread_mutex_t автоматически освобождаются.
Приведенный выше код точно имитирует реализацию boost::scoped_lock и boost::mutex , которые являются частью библиотеки boost::thread .
Обертки драйверов
[ редактировать ]Межъязыковая совместимость/взаимодействие во время выполнения
[ редактировать ]Некоторые библиотеки-оболочки существуют как мост между клиентским приложением и библиотекой, написанной с использованием несовместимой технологии. Например, приложению Java может потребоваться выполнить системный вызов . Однако системные вызовы обычно представляются как функции библиотеки C. Чтобы решить эту проблему, Java реализует библиотеки-оболочки, которые позволяют вызывать эти системные вызовы из приложения Java.
Чтобы добиться этого, такие языки, как Java, предоставляют механизм, называемый интерфейсом внешней функции , который делает это возможным. Некоторые примеры этих механизмов включают в себя:
- Собственный интерфейс Java (JNI)
- Собственный доступ к Java (JNA)
- Иностранная библиотека функций для Python.
- Управляемые расширения
- SWIG (упрощенная оболочка и генератор интерфейса)
Существующие библиотеки-оболочки
[ редактировать ]Некоторые примеры существующих библиотек-оболочек: