Библиотека (вычисления) - Википедия - Library (computing)

Иллюстрация приложения, которое использует libvorbisfile для воспроизведения Ogg Vorbis файл

В Информатика, а библиотека это собрание энергонезависимый ресурсы, используемые компьютерные программы, часто для разработка программного обеспечения. Сюда могут входить данные конфигурации, документация, справочные данные, шаблоны сообщений, предварительно написанный код и подпрограммы, классы, значения или же тип технические характеристики. В IBM OS / 360 и ее преемники они упоминаются как многораздельные наборы данных.

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

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

Ценность библиотеки заключается в повторном использовании поведения. Когда программа вызывает библиотеку, она получает поведение, реализованное внутри этой библиотеки, без необходимости реализовывать это поведение самостоятельно. Библиотеки поощряют совместное использование кода в модульный мода и облегчение распространения кода.

Реализованное библиотекой поведение может быть связано с вызывающей программой в разных фазы жизненного цикла программы. Если к коду библиотеки обращаются во время сборки вызывающей программы, то библиотека называется статическая библиотека.[1] Альтернативой является создание исполняемого файла вызывающей программы и его распространение независимо от реализации библиотеки. Поведение библиотеки подключается после того, как исполняемый файл был вызван для выполнения, либо как часть процесса запуска выполнения, либо в середине выполнения. В этом случае библиотека называется динамическая библиотека (загружено в время выполнения ). Динамическая библиотека может быть загружена и связана при подготовке программы к выполнению с помощью компоновщик. В качестве альтернативы, в середине выполнения приложение может явно запросить, чтобы модуль был загружен.

Наиболее компилированные языки есть стандартная библиотека, хотя программисты также могут создавать свои собственные библиотеки. Большинство современных программных систем предоставляют библиотеки, которые реализуют большинство системных служб. В таких библиотеках организованы услуги, необходимые современному приложению. Таким образом, большая часть кода, используемого современными приложениями, предоставляется в этих системных библиотеках.

История

Самые ранние концепции программирования, аналогичные библиотекам, предназначались для разделения данные определения из программы выполнение. Веселый привлекла всеобщее внимание к концепции COMPOOL (коммуникационный пул) в 1959 году, хотя она заимствовала идею из больших систем. МУДРЕЦ программного обеспечения. Следуя принципам информатики разделение проблем и скрытие информации, «Цель Comm Pool состояла в том, чтобы разрешить совместное использование системных данных между многими программами путем предоставления централизованного описания данных».[2]

КОБОЛ также включены «примитивные возможности для библиотечной системы» в 1959 г.,[3] но Жан Саммет ретроспективно охарактеризовал их как «неадекватные библиотечные помещения».[4]

Еще один важный вклад в концепцию современной библиотеки внесла библиотека подпрограмма инновация FORTRAN. Подпрограммы FORTRAN можно компилировать независимо друг от друга, но компилятору не хватало компоновщик. Итак, до введения модулей в Fortran-90, проверка типа между FORTRAN[NB 1] подпрограммы было невозможно.[5]

Наконец, историки концепции должны помнить о влиятельных Симула 67. Симула был первым объектно-ориентированного программирования язык, и его классы были почти идентичны современной концепции, используемой в Ява, C ++, и C #. В учебный класс концепция Simula была также прародительницей упаковка в Ада и модуль из Модула-2.[6] Даже при первоначальной разработке в 1965 году классы Simula могли быть включены в файлы библиотеки и добавлены во время компиляции.[7]

Связывание

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

Разрешаемые ссылки могут быть адресами переходов и других обычных вызовов. Они могут быть в основной программе или в одном модуле в зависимости от другого. Они преобразуются в фиксированные или перемещаемые адреса (из общей базы) путем выделения оперативной памяти для сегменты памяти каждого указанного модуля.

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

Переезд

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

Статические библиотеки

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

Все модули, необходимые программе, иногда статически связываются и копируются в исполняемый файл. Этот процесс и полученный в результате автономный файл известен как статическая сборка программы. Статическая сборка может не понадобиться переезд если виртуальная память используется и нет рандомизация разметки адресного пространства желательно.[8]

Общие библиотеки

А общая библиотека или же общий объект это файл, который предназначен для совместного использования исполняемые файлы и другие общие объектные файлы. Модули, используемые программой, загружаются из отдельных общих объектов в память на время загрузки или же время выполнения, а не копируется компоновщиком при создании единого монолитного исполняемого файла для программы.

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

Самый современный операционные системы[NB 2] могут иметь файлы общей библиотеки того же формата, что и исполняемые файлы. Это дает два основных преимущества: во-первых, требуется сделать только один загрузчик для обоих, а не два (считается, что наличие одного загрузчика стоит его дополнительной сложности). Во-вторых, он позволяет использовать исполняемые файлы в качестве разделяемых библиотек, если у них есть таблица символов. Типичные комбинированные форматы исполняемых файлов и разделяемых библиотек: ELF и Мачо (как в Unix), так и PE (Windows).

В некоторых старых средах, таких как 16-битная Windows или же MPE для HP 3000 только стековые данные (локальные) были разрешены в коде разделяемой библиотеки, или другие существенные ограничения были наложены на код разделяемой библиотеки.

Совместное использование памяти

Код библиотеки может совместно использоваться в памяти несколькими процессы, а также на диске. Если используется виртуальная память, процессы будут выполнять одну и ту же физическую страницу ОЗУ, которая отображается в разные адресные пространства процессов. В этом есть свои преимущества. Например, на OpenStep системы, приложения часто имели размер всего несколько сотен килобайт и загружались быстро; большая часть их кода находилась в библиотеках, которые уже были загружены операционной системой для других целей.[нужна цитата ]

Программы могут выполнять совместное использование ОЗУ с помощью позиционно-независимый код, как в Unix, что приводит к сложной, но гибкой архитектуре, или за счет использования общих виртуальных адресов, как в Windows и OS / 2. Эти системы с помощью различных уловок, таких как предварительное отображение адресного пространства и резервирование слотов для каждой разделяемой библиотеки, гарантируют, что этот код с большой вероятностью будет совместно использоваться. Третья альтернатива - одноуровневый магазин, как используется IBM System / 38 и его преемники. Это допускает позиционно-зависимый код, но не накладывает существенных ограничений на то, где код может быть размещен или как он может быть передан.

В некоторых случаях разные версии общих библиотек могут вызывать проблемы, особенно когда библиотеки разных версий имеют одинаковое имя файла, а для разных приложений, установленных в системе, требуется определенная версия. Такой сценарий известен как DLL ад, названный в честь Windows и OS / 2 DLL файл. Большинство современных операционных систем после 2001 г. имеют методы очистки для устранения таких ситуаций или используют «частные» библиотеки для конкретных приложений.[9]

Динамическое связывание

Динамическое связывание или позднее связывание связывание выполняется во время загрузки программы (время загрузки ) или выполнен (время выполнения ), а не при создании исполняемого файла. Динамически подключаемая библиотека (библиотека с динамической компоновкой, или DLL, в Windows и OS / 2; динамический общий объект или DSO под Unix-подобный systems) - это библиотека, предназначенная для динамической компоновки. Только минимальный объем работы выполняется компоновщик при создании исполняемого файла; он только записывает, какие библиотечные подпрограммы нужны программе, а также индексные имена или номера подпрограмм в библиотеке. Большая часть работы по связыванию выполняется во время загрузки приложения (время загрузки) или во время выполнения (время выполнения). Обычно необходимая программа компоновки, называемая «динамический компоновщик» или «загрузчик компоновки», на самом деле является частью базового Операционная система. (Тем не менее, возможно, и не очень сложно, написать программу, которая использует динамическое связывание и включает свой собственный динамический компоновщик, даже для операционной системы, которая сама по себе не поддерживает динамическое связывание.)

Первоначально программисты разработали динамическое связывание в Мультики операционная система, начиная с 1964 г., и МТС (Терминальная система Мичигана ), построенный в конце 1960-х гг.[10]

Оптимизация

Поскольку общие библиотеки в большинстве систем меняются нечасто, системы могут вычислить вероятный адрес загрузки для каждой разделяемой библиотеки в системе до того, как она понадобится, и сохранить эту информацию в библиотеках и исполняемых файлах. Если каждая загруженная совместно используемая библиотека прошла этот процесс, каждая из них будет загружаться по заранее определенному адресу, что ускоряет процесс динамического связывания. Эта оптимизация известна как предварительная привязка в macOS и предварительная ссылка в Linux. К недостаткам этого метода можно отнести время, необходимое для предварительного вычисления этих адресов каждый раз при изменении разделяемых библиотек, невозможность использования рандомизация разметки адресного пространства, а также требование достаточного виртуального адресного пространства для использования (проблема, которая будет решена путем принятия 64-битный архитектуры, по крайней мере, на данный момент).

Размещение библиотек во время выполнения

Загрузчики для общих библиотек сильно различаются по функциональности. Некоторые зависят от исполняемого файла, хранящего явные пути к библиотекам. Любое изменение наименования библиотеки или макета файловой системы приведет к сбою этих систем. Чаще всего в исполняемом файле хранится только имя библиотеки (а не путь), при этом операционная система предоставляет метод поиска библиотеки на диске на основе некоторого алгоритма.

Если общая библиотека, от которой зависит исполняемый файл, будет удалена, перемещена или переименована, или если несовместимая версия библиотеки скопирована в место, которое находится раньше в поиске, исполняемый файл не загрузится. Это называется ад зависимости, существующие на многих платформах. (Печально известный) вариант Windows широко известен как DLL ад. Эта проблема не может возникнуть, если каждая версия каждой библиотеки имеет уникальный идентификатор и каждая программа ссылается на библиотеки только по их полным уникальным идентификаторам. Проблемы с «адом DLL» в более ранних версиях Windows возникали из-за использования только имен библиотек, уникальность которых не гарантировалась, для разрешения динамических ссылок в программах. (Чтобы избежать «ада DLL», более поздние версии Windows в значительной степени полагаются на возможности программ для установки частных библиотек DLL - по сути, частичный отказ от использования общих библиотек - наряду с механизмами предотвращения замены общих системных библиотек DLL более ранними версиями. )

Майкрософт Виндоус

Майкрософт Виндоус проверяет реестр чтобы определить правильное место для загрузки DLL, реализующих COM-объекты, но для других DLL он будет проверять каталоги в определенном порядке. Сначала Windows проверяет каталог, в который загружена программа (частная DLL[9]); любые каталоги, установленные путем вызова SetDllDirectory () функция; каталоги System32, System и Windows; затем текущий рабочий каталог; и, наконец, каталоги, указанные в PATH переменная окружения.[11] Приложения, написанные для .NET Framework framework (с 2002 г.), также проверьте Глобальный кэш сборок в качестве основного хранилища общих файлов DLL, чтобы устранить проблему DLL ад.

OpenStep

OpenStep использовали более гибкую систему, собирая список библиотек из ряда известных мест (аналогично концепции PATH) при первом запуске системы. Перемещение библиотек не вызывает никаких проблем, хотя пользователи несут затраты времени при первом запуске системы.

Unix-подобные системы

Наиболее Unix-подобный системы имеют "путь поиска", определяющий файловую систему каталоги в котором искать динамические библиотеки. Некоторые системы указывают путь по умолчанию в конфигурационный файл, другие жестко закодируют его в динамический загрузчик. Немного запускаемый файл форматы могут указывать дополнительные каталоги, в которых следует искать библиотеки для конкретной программы. Обычно это можно изменить с помощью переменная окружения, хотя он отключен для Setuid и программы setgid, чтобы пользователь не мог заставить такую ​​программу запускать произвольный код с правами root. Разработчикам библиотек рекомендуется размещать свои динамические библиотеки в местах пути поиска по умолчанию. С другой стороны, это может сделать установку новых библиотек проблематичной, и эти «известные» местоположения быстро становятся домом для растущего числа файлов библиотеки, что усложняет управление.

Динамическая загрузка

Динамическая загрузка, подмножество динамического связывания, включает в себя загрузку и выгрузку динамически связанной библиотеки в время выполнения по требованию. Такой запрос может быть сделан явно или неявно. Неявные запросы выполняются, когда компилятор или статический компоновщик добавляет ссылки на библиотеки, которые включают пути к файлам или просто имена файлов.[нужна цитата ] Явные запросы выполняются, когда приложения делают прямые вызовы API операционной системы.

Большинство операционных систем, поддерживающих динамически подключаемые библиотеки, также поддерживают динамическую загрузку таких библиотек через время выполнения компоновщик API. Например, Майкрософт Виндоус использует функции API LoadLibrary, LoadLibraryEx, FreeLibrary и GetProcAddress с Библиотеки динамических ссылок Microsoft; POSIX -системы, включая большинство UNIX и UNIX-подобных систем, используют dlopen, dlclose и dlsym. Некоторые системы разработки автоматизируют этот процесс.

Библиотеки объектов и классов

Хотя изначально динамическое связывание было впервые применено в 1960-х, оно не дало операционные системы использовались потребителями до конца 1980-х годов. К началу 1990-х годов он был доступен в той или иной форме в большинстве операционных систем. В этот же период объектно-ориентированного программирования (ООП) становилось важной частью программирования. ООП с привязкой во время выполнения требует дополнительной информации, которую традиционные библиотеки не предоставляют. Помимо имен и точек входа кода, расположенных внутри, им также требуется список объектов, от которых они зависят. Это побочный эффект одного из основных преимуществ ООП - наследования, что означает, что части полного определения любого метода могут находиться в разных местах. Это больше, чем просто перечисление того, что одна библиотека требует услуг другой: в настоящей системе ООП сами библиотеки могут быть неизвестны в время компиляции, и варьируются от системы к системе.

В то же время многие разработчики работали над идеей многоуровневых программ, в которых «дисплей», работающий на настольном компьютере, использовал бы услуги мэйнфрейм или же миникомпьютер для хранения или обработки данных. Например, программа на компьютере с графическим интерфейсом будет отправлять сообщения на миникомпьютер, чтобы вернуть небольшие образцы огромного набора данных для отображения. Вызов удаленных процедур (RPC) уже справлялся с этими задачами, но стандартной системы RPC не было.

Вскоре большинство производителей миникомпьютеров и мэйнфреймов инициировали проекты по их объединению, создавая формат библиотеки ООП, который можно было использовать где угодно. Такие системы были известны как библиотеки объектов, или же распределенные объекты, если они поддерживали удаленный доступ (не все). Microsoft COM является примером такой системы для локального использования. DCOM, модифицированная версия COM, поддерживает удаленный доступ.

Некоторое время объектные библиотеки имели статус «следующей большой вещи» в мире программирования. Был предпринят ряд попыток создать системы, которые могли бы работать на разных платформах, и компании соревновались, пытаясь запереть разработчиков в их собственных системах. Примеры включают IBM с Системная объектная модель (SOM / DSOM), Sun Microsystems ' Распределенные объекты повсюду (DOE), Следующий с Переносимые распределенные объекты (PDO), Цифровой с ObjectBroker, Microsoft Компонентная объектная модель (COM / DCOM) и любое количество CORBA -системы.

После того как маркетинговая ажиотаж поутих, объектные библиотеки продолжали использоваться как в объектно-ориентированном программировании, так и в распределенных информационных системах. Библиотеки классов являются грубым эквивалентом ООП старых типов библиотек кода. В них содержатся классы, которые описывают характеристики и определяют действия (методы ), которые включают объекты. Библиотеки классов используются для создания экземпляры, или объекты с определенными значениями характеристик. В некоторых языках ООП, например Ява, различие очевидно: классы часто содержатся в файлах библиотеки (например, в Java Формат файла JAR ), а экземпляры объектов находятся только в памяти (хотя потенциально могут быть настойчивый в отдельных файлах). В других, как Болтовня, библиотеки классов являются лишь отправной точкой для образ системы который включает в себя все состояние среды, классов и всех созданных объектов.

Удаленные библиотеки

Другое решение проблемы библиотеки заключается в использовании полностью отдельных исполняемых файлов (часто в некоторой облегченной форме) и их вызове с помощью удаленный вызов процедур (RPC) по сети на другой компьютер. Такой подход максимизирует повторное использование операционной системы: код, необходимый для поддержки библиотеки, - это тот же код, который используется для обеспечения поддержки приложений и безопасности для любой другой программы. Кроме того, такие системы не требуют наличия библиотеки на одном компьютере, но могут пересылать запросы по сети.

Однако такой подход означает, что каждый вызов библиотеки требует значительных накладных расходов. Вызовы RPC намного дороже, чем вызов разделяемой библиотеки, которая уже была загружена на тот же компьютер. Этот подход обычно используется в распределенная архитектура который интенсивно использует такие удаленные вызовы, особенно системы клиент-сервер и серверы приложений Такие как Enterprise JavaBeans.

Библиотеки генерации кода

Библиотеки генерации кода высокоуровневые API которые могут генерировать или преобразовывать байтовый код за Ява. Они используются аспектно-ориентированное программирование, некоторые платформы доступа к данным, а также для тестирования для создания динамических прокси-объектов. Они также используются для перехвата доступа к полю.[12]

Именование файлов

Самый современный Unix-подобный системы

Система хранит libfoo.a и libfoo.so файлы в каталогах, таких как / lib, / usr / lib или же / USR / местные / библиотека. Имена файлов всегда начинаются с lib, и оканчиваются суффиксом .a (архив, статическая библиотека) или .так (общий объект, динамически подключаемая библиотека). Некоторые системы могут иметь несколько имен для динамически подключаемой библиотеки, при этом большинство имен являются именами для символические ссылки к оставшемуся имени; эти имена могут включать основную версию библиотеки или полный номер версии; например, в некоторых системах libfoo.so.2 будет именем файла для второй основной версии интерфейса динамически подключаемой библиотеки libfoo. В .la файлы, которые иногда можно найти в каталогах библиотеки, libtool архивы, не используемые системой как таковые.

macOS

Система наследует соглашения о статической библиотеке от BSD, с библиотекой, хранящейся в .a файл и может использовать .такдинамически подключаемые библиотеки (с .dylib суффикс). Однако большинство библиотек в macOS состоят из «фреймворков», помещенных в специальные каталоги, называемые «связки ", которые содержат необходимые файлы и метаданные библиотеки. Например, фреймворк под названием MyFramework будет реализован в пакете под названием MyFramework.framework, с MyFramework.framework / MyFramework являясь либо динамически связанным файлом библиотеки, либо символической ссылкой на файл динамически подключаемой библиотеки в MyFramework.framework / Versions / Current / MyFramework.

Майкрософт Виндоус

Библиотеки с динамической компоновкой обычно имеют суффикс * .DLL,[13] хотя другие расширения имен файлов могут идентифицировать динамически подключаемые библиотеки специального назначения, например * .OCX за OLE библиотеки. Версии интерфейса либо закодированы в именах файлов, либо абстрагируются с помощью COM-объект интерфейсы. В зависимости от того, как они скомпилированы, * .LIB файлы могут быть либо статическими библиотеками, либо представлениями динамически подключаемых библиотек, необходимых только во время компиляции, известных как "библиотеки импорта ". В отличие от UNIX world, который использует разные расширения файлов при связывании с .LIB файл в Windows сначала нужно знать, является ли это обычной статической библиотекой или библиотекой импорта. В последнем случае .DLL файл должен присутствовать во время выполнения.

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

Примечания

  1. ^ Раньше это было возможно, например, между подпрограммами Ada.
  2. ^ Некоторые старые системы, например, Берроуз MCP, Мультики, также имеют только один формат для исполняемых файлов, независимо от того, являются ли они общими.

Рекомендации

  1. ^ «Статические библиотеки». TLDP. В архиве из оригинала от 03.07.2013. Получено 2013-10-03.
  2. ^ Вексельблат, Ричард (1981). История языков программирования. Серия монографий ACM. Нью-Йорк, штат Нью-Йорк: Academic Press (дочерняя компания Харкорт Брейс ). п.369. ISBN  0-12-745040-8.
  3. ^ Вексельблат, op. соч., п. 274
  4. ^ Вексельблат, op. соч., п. 258
  5. ^ Уилсон, Лесли Б.; Кларк, Роберт Г. (1988). Сравнительные языки программирования. Уокингем, Англия: Аддисон-Уэсли. п. 126. ISBN  0-201-18483-4.
  6. ^ Уилсон и Кларк, op. соч., п. 52
  7. ^ Вексельблат, op. соч., п. 716
  8. ^ Кристиан Коллберг, Джон Х. Хартман, Шридивья Бабу, Шарат К. Удупа (2003). "SLINKY: Static Linking Reloaded". Департамент компьютерных наук, Университет Аризоны. В архиве из оригинала от 23.03.2016. Получено 2016-03-17.CS1 maint: использует параметр авторов (связь)
  9. ^ а б Андерсон, Рик (2000-01-11). "Конец ада DLL". microsoft.com. Архивировано из оригинал на 2001-06-05. Получено 2012-01-15. Частные библиотеки DLL - это библиотеки DLL, которые устанавливаются с определенным приложением и используются только этим приложением.
  10. ^ «История МТС». Дайджест информационных технологий. 5 (5).
  11. ^ «Порядок поиска в динамически подключаемой библиотеке». Сетевая библиотека разработчика Microsoft. Microsoft. 2012-03-06. В архиве из оригинала 2012-05-09. Получено 2012-05-20.
  12. ^ «Библиотека генерации кода». Source Forge. В архиве из оригинала 12.01.2010. Получено 2010-03-03. Библиотека генерации байтового кода - это высокоуровневый API для генерации и преобразования байтового кода JAVA. Он используется АОП, тестированием, структурами доступа к данным для создания динамических прокси-объектов и перехвата доступа к полям.
  13. ^ Бреснахан, Кристина; Блюм, Ричард (27 апреля 2015 г.). Учебное пособие по сертификации LPIC-1 Linux Professional Institute: экзамен 101-400 и экзамен 102-400. John Wiley & Sons (опубликовано в 2015 г.). п. 82. ISBN  9781119021186. В архиве из оригинала от 24.09.2015. Получено 2015-09-03. Совместно используемые библиотеки Linux похожи на библиотеки динамической компоновки (DLL) Windows. Библиотеки DLL Windows обычно обозначаются .dll расширения файлов.

дальнейшее чтение