stringtranslate.com

Библиотека-оболочка

Библиотеки-оболочки (или оболочки библиотек) состоят из тонкого слоя кода (« прокладки »), который преобразует существующий интерфейс библиотеки в совместимый интерфейс. Это делается по нескольким причинам:

Библиотеки-оболочки могут быть реализованы с использованием шаблонов проектирования адаптера , фасада и, в меньшей степени, прокси .

Структура и реализация

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

Пример

Ниже представлена ​​общая иллюстрация общей реализации библиотеки-оболочки. В этом примере интерфейс 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 ( & мьютекс ); }   частный : замок класса друга ;    void lock () { pthread_mutex_lock ( & ​​мьютекс ); }     void unlock () { pthread_mutex_unlock ( & ​​мьютекс ); } };    класс Lock { частное : Mutex & mutex ;   public : Lock ( мьютекс и мьютекс ) : мьютекс { мьютекс } { мьютекс . замок (); }       ~ Блокировка () { мьютекс . разблокировать (); } };   

Исходный интерфейс C можно считать подверженным ошибкам, особенно в случае, когда пользователи библиотеки забывают разблокировать уже заблокированный мьютекс. Новый интерфейс эффективно использует RAII (получение ресурсов — это инициализация) в новых классах Mutex и Lock , чтобы обеспечить в конечном итоге разблокировку Mutex и автоматическое освобождение объектов pthread_mutex_t .

Приведенный выше код точно имитирует реализацию boost::scoped_lock и boost::mutex , которые являются частью библиотеки boost::thread.

Обертки драйверов

Межъязыковая совместимость/взаимодействие во время выполнения

Некоторые библиотеки-оболочки существуют как мост между клиентским приложением и библиотекой, написанной с использованием несовместимой технологии. Например, приложению Java может потребоваться выполнить системный вызов . Однако системные вызовы обычно представляются как функции библиотеки C. Чтобы решить эту проблему, Java реализует библиотеки-оболочки, которые позволяют вызывать эти системные вызовы из приложения Java.

Чтобы добиться этого, такие языки, как Java, предоставляют механизм, называемый интерфейсом внешней функции , который делает это возможным. Некоторые примеры этих механизмов включают в себя:

Существующие библиотеки-оболочки

Некоторые примеры существующих библиотек-оболочек:

Смотрите также