Библиотека (вычисления)
В информатике библиотека — это набор ресурсов , доступных только для чтения , который используется во время разработки программного обеспечения для реализации компьютерной программы .
Исторически библиотека состояла из подпрограмм (сегодня их обычно называют функциями). Эта концепция теперь включает в себя другие формы исполняемого кода, включая классы и неисполняемые данные, включая изображения и текст . Он также может ссылаться на коллекцию исходного кода .
Например, программа может использовать библиотеку для косвенного выполнения системных вызовов вместо того, чтобы выполнять эти системные вызовы непосредственно в программе.
Характеристики [ править ]
Общие [ править ]
Библиотека может использоваться несколькими независимыми потребителями (программами и другими библиотеками). Это отличается от ресурсов, определенных в программе, которые обычно могут использоваться только этой программой.
Когда потребитель использует библиотечный ресурс, он получает ценность библиотеки без необходимости реализовывать ее самостоятельно. Библиотеки поощряют повторное использование кода по модульному принципу.
При написании кода, использующего библиотеку, программисту необходимо знать только информацию высокого уровня, например, какие элементы она содержит и как их использовать, а не все внутренние детали библиотеки.
Библиотеки могут использовать другие библиотеки, что приводит к иерархии библиотек в программе.
Исполняемый файл [ править ]
Библиотека исполняемого кода имеет четко определенный интерфейс , с помощью которого вызываются функциональные возможности. Например, в C библиотечная функция вызывается через обычную возможность вызова функции C. Компоновщик генерирует код для вызова функции через библиотечный механизм, если функция доступна из библиотеки, а не из самой программы. [1]
Функции библиотеки могут быть подключены к вызывающей программе на разных этапах жизненного цикла программы . Если доступ к коду библиотеки осуществляется во время сборки вызывающей программы, то библиотека называется статической библиотекой . [2] Альтернативой является создание исполняемого файла программы отдельно от файла библиотеки. Функции библиотеки подключаются после запуска исполняемого файла, либо во время загрузки , либо во время выполнения . В этом случае библиотека называется динамической библиотекой .
Большинство компилируемых языков имеют стандартную библиотеку , хотя программисты также могут создавать свои собственные библиотеки. Большинство современных программных систем предоставляют библиотеки, реализующие большинство системных сервисов. Такие библиотеки организовали сервисы, необходимые современному приложению. Таким образом, большая часть кода, используемого современными приложениями, содержится в этих системных библиотеках.
История [ править ]
Идея компьютерной библиотеки восходит к первым компьютерам, созданным Чарльзом Бэббиджем . В статье 1888 года, посвященной его аналитической машине, предполагалось, что компьютерные операции могут выполняться на отдельных картах с числовым вводом. Если бы эти перфокарты операций были сохранены для повторного использования, то «со временем у движка появилась бы собственная библиотека». [3]
В 1947 году Гольдстайн и фон Нейман предположили, что было бы полезно создать «библиотеку» подпрограмм для их работы на машине IAS , раннем компьютере, который в то время еще не работал. [4] Они представляли себе физическую библиотеку записей магнитных проводов , в которой каждый провод хранит многоразовый компьютерный код. [5]
Вдохновленный фон Нейманом, Уилкс и его команда создали EDSAC . с В шкафу перфолентой хранилась библиотека подпрограмм для этого компьютера. [6] Программы для EDSAC состояли из основной программы и последовательности подпрограмм, скопированных из библиотеки подпрограмм. [7] В 1951 году коллектив опубликовал первый учебник по программированию « Подготовка программ для электронного цифрового компьютера» , в котором подробно описал создание и назначение библиотеки. [8]
COBOL включил «примитивные возможности библиотечной системы» в 1959 году. [9] но Жан Самме ретроспективно охарактеризовал их как «неадекватные библиотечные возможности». [10]
У JOVIAL есть коммуникационный пул (COMPOOL), примерно библиотека заголовочных файлов.
Еще одним важным вкладом в концепцию современной библиотеки стало подпрограмме нововведение в FORTRAN . Подпрограммы FORTRAN можно компилировать независимо друг от друга, но в компиляторе отсутствовал компоновщик . Поэтому перед введением модулей в Фортран-90 необходимо провести проверку типов между FORTRAN-90. [Примечание 1] подпрограмм было невозможно. [11]
К середине 1960-х годов библиотеки копирования и макросов для ассемблеров стали обычным явлением. Начиная с популярности IBM System/360 , библиотеки, содержащие другие типы текстовых элементов, например, системные параметры, также стали обычным явлением.
В IBM OS/360 и ее преемниках это называется секционированным набором данных .
Первый объектно-ориентированный язык программирования Simula , разработанный в 1965 году, поддерживал добавление классов в библиотеки через свой компилятор. [12] [13]
Связывание [ править ]
Библиотеки важны в процессе компоновки или привязки программ , который разрешает ссылки, известные как ссылки или символы, на библиотечные модули. Процесс связывания обычно автоматически выполняется программой компоновщика или связывателя , которая ищет набор библиотек и других модулей в заданном порядке. Обычно это не считается ошибкой, если цель ссылки может быть найдена несколько раз в данном наборе библиотек. Связывание может выполняться при создании исполняемого файла (статическое связывание) или всякий раз, когда программа используется во время выполнения (динамическое связывание).
Разрешаемые ссылки могут быть адресами для переходов и других стандартных вызовов. Они могут находиться в основной программе или в одном модуле в зависимости от другого. Они преобразуются в фиксированные или перемещаемые адреса (из общей базы) путем выделения памяти времени выполнения для сегментов памяти каждого модуля, на который ссылаются.
В некоторых языках программирования используется функция, называемая интеллектуальным связыванием , при которой компоновщик знает о компиляторе или интегрируется с ним, так что компоновщик знает, как используются внешние ссылки, а код в библиотеке, который фактически никогда не используется , даже если есть внутренние ссылки, может быть отбрасывается из скомпилированного приложения. Например, программа, которая использует только целые числа для арифметических операций или вообще не выполняет арифметических операций, может исключить библиотечные подпрограммы с плавающей запятой. Эта функция интеллектуального связывания может привести к уменьшению размера файлов приложения и уменьшению использования памяти.
Переезд [ править ]
Некоторые ссылки в программе или библиотечном модуле хранятся в относительной или символической форме, которую невозможно разрешить до тех пор, пока всему коду и библиотекам не будут присвоены окончательные статические адреса. Перемещение — это процесс корректировки этих ссылок, который выполняется либо компоновщиком, либо загрузчиком . Как правило, перемещение отдельных библиотек невозможно выполнить, поскольку адреса в памяти могут различаться в зависимости от программы, использующей их, и других библиотек, с которыми они объединены. Независимый от позиции код избегает ссылок на абсолютные адреса и, следовательно, не требует перемещения.
Статические библиотеки [ править ]
Когда связывание выполняется во время создания исполняемого или другого объектного файла, оно называется статическим связыванием или ранним связыванием . В этом случае связывание обычно выполняется компоновщиком , но также может быть выполнено компилятором . [14] Статическая библиотека , также известная как архив , предназначена для статического связывания. Первоначально существовали только статические библиотеки. Статическое связывание необходимо выполнять при перекомпиляции любых модулей.
Все модули, необходимые программе, иногда статически связываются и копируются в исполняемый файл. Этот процесс и полученный в результате отдельный файл известны как статическая сборка программы. Статическая сборка может не нуждаться в дальнейшем перемещении , если виртуальная память используется рандомизация структуры адресного пространства . и не требуется [15]
[ править ]
Общая библиотека или общий объект — это файл, который предназначен для совместного использования исполняемыми файлами и другими файлами общих объектов . Модули, используемые программой, загружаются из отдельных общих объектов в память во время загрузки или во время выполнения , а не копируются компоновщиком, когда он создает для программы один монолитный исполняемый файл.
Общие библиотеки могут быть статически связаны во время компиляции. Это означает, что ссылки на модули библиотеки разрешаются, и модулям выделяется память при создании исполняемого файла. [ нужна ссылка ] Но часто связывание общих библиотек откладывается до их загрузки. [ сомнительно ]
Библиотеки объектов [ править ]
Хотя динамическое связывание впервые было изобретено в 1960-х годах, оно не достигло наиболее часто используемых операционных систем до конца 1980-х годов. К началу 1990-х годов он был доступен в той или иной форме в большинстве операционных систем. В тот же период объектно-ориентированное программирование (ООП) стало важной частью среды программирования. ООП с привязкой во время выполнения требует дополнительной информации, которую традиционные библиотеки не предоставляют. Помимо имен и точек входа кода, расположенного внутри, им также требуется список объектов, от которых они зависят. Это побочный эффект одной из основных концепций ООП — наследования, что означает, что части полного определения любого метода могут находиться в разных местах. Это больше, чем просто указание того, что одна библиотека требует услуг другой: в настоящей ООП-системе сами библиотеки могут быть неизвестны во время компиляции и различаться от системы к системе.
В то же время многие разработчики работали над идеей многоуровневых программ, в которых «дисплей», работающий на настольном компьютере, использовал бы услуги мэйнфрейма или миникомпьютера для хранения или обработки данных. Например, программа на компьютере с графическим интерфейсом будет отправлять сообщения на миникомпьютер, чтобы вернуть небольшие образцы огромного набора данных для отображения. Удаленные вызовы процедур (RPC) уже решали эти задачи, но стандартной системы RPC не существовало.
Вскоре большинство производителей мини-компьютеров и мейнфреймов инициировали проекты по объединению этих двух технологий, создав формат ООП-библиотеки, который можно было бы использовать где угодно. Такие системы назывались объектными библиотеками или распределенными объектами , если они поддерживали удаленный доступ (не все). COM от Microsoft является примером такой системы для локального использования. DCOM, модифицированная версия COM, поддерживает удаленный доступ.
Некоторое время объектные библиотеки сохраняли статус «следующей большой вещи» в мире программирования. Было предпринято множество попыток создать системы, которые могли бы работать на разных платформах, и компании соревновались в попытках запереть разработчиков в своей собственной системе. Примеры включают IBM системную объектную модель (SOM/DSOM), Sun Microsystems , Distributed Objects Everywhere (DOE) NeXT Portable Distributed Objects PDO) Digital , ObjectBroker ( Microsoft , объектную модель компонентов (COM/DCOM) и любое количество систем на базе CORBA .
Библиотеки классов [ править ]
Библиотеки классов — это грубый ООП-эквивалент старых типов библиотек кода. Они содержат классы , которые описывают характеристики и определяют действия ( методы ), связанные с объектами. Библиотеки классов используются для создания экземпляров или объектов, характеристики которых имеют определенные значения. В некоторых языках ООП, таких как Java , различие очевидно: классы часто содержатся в библиотечных файлах (например, в формате файлов JAR Java ), а созданные объекты находятся только в памяти (хотя потенциально их можно сделать постоянными в отдельных файлах). В других, таких как Smalltalk , библиотеки классов являются просто отправной точкой для образа системы , который включает в себя все состояние среды, классов и всех созданных объектов.
Сегодня большинство библиотек классов хранятся в репозитории пакетов (например, Maven Central для Java). Клиентский код явно объявляет зависимости от внешних библиотек в файлах конфигурации сборки (например, Maven Pom в Java).
Удаленные библиотеки [ править ]
Другой библиотечный метод использует совершенно отдельные исполняемые файлы (часто в некоторой облегченной форме) и вызывает их с помощью удаленного вызова процедур (RPC) по сети на другой компьютер. Это максимизирует повторное использование операционной системы: код, необходимый для поддержки библиотеки, — это тот же код, который используется для обеспечения поддержки приложений и безопасности для любой другой программы. Кроме того, такие системы не требуют наличия библиотеки на том же компьютере, но могут пересылать запросы по сети.
Однако такой подход означает, что каждый вызов библиотеки требует значительных накладных расходов. Вызовы RPC намного дороже, чем вызов общей библиотеки, которая уже загружена на ту же машину. Этот подход обычно используется в распределенной архитектуре , которая интенсивно использует такие удаленные вызовы, особенно в системах клиент-сервер и серверах приложений, таких как Enterprise JavaBeans .
Библиотеки генерации кода [ править ]
высокого уровня Библиотеки генерации кода — это API , которые могут генерировать или преобразовывать байт-код для Java . Они используются аспектно-ориентированным программированием , некоторыми платформами доступа к данным, а также для тестирования для создания динамических прокси-объектов. Они также используются для перехвата доступа к полям. [16]
Именование файла [ править ]
Большинство современных Unix-подобных систем [ править ]
Система хранит libfoo.a
и libfoo.so
файлы в таких каталогах, как /lib
, /usr/lib
или /usr/local/lib
. Имена файлов всегда начинаются с lib
и заканчиваются суффиксом .a
( архив , статическая библиотека) или .so
(общий объект, динамически подключаемая библиотека). В некоторых системах может быть несколько имен для динамически подключаемой библиотеки. Эти имена обычно имеют один и тот же префикс и разные суффиксы, указывающие номер версии. Большинство названий являются символическими ссылками на последнюю версию. Например, в некоторых системах libfoo.so.2
будет именем файла второй основной версии интерфейса динамически подключаемой библиотеки. libfoo
. .la
файлы, которые иногда встречаются в каталогах библиотек, представляют собой архивы libtool и не могут использоваться системой как таковые.
macOS [ править ]
Система наследует соглашения о статических библиотеках от BSD , при этом библиотека хранится в .a
файл и может использовать .so
динамически подключаемые библиотеки в стиле (с .dylib
вместо этого суффикс). Однако большинство библиотек в macOS состоят из «фреймворков», размещенных в специальных каталогах, называемых « пакетами », которые содержат необходимые файлы и метаданные библиотеки. Например, структура под названием MyFramework
будет реализован в пакете под названием MyFramework.framework
, с MyFramework.framework/MyFramework
быть либо файлом динамически подключаемой библиотеки, либо символической ссылкой на файл динамически подключаемой библиотеки в MyFramework.framework/Versions/Current/MyFramework
.
Microsoft Windows [ править ]
Библиотеки динамической компоновки обычно имеют суффикс *.DLL
, [17] хотя другие расширения имен файлов могут идентифицировать динамически подключаемые библиотеки специального назначения, например *.OCX
для OLE -библиотек. Версии интерфейса либо кодируются в именах файлов, либо абстрагируются с помощью интерфейсов COM-объектов . В зависимости от того, как они составлены, *.LIB
файлы могут быть либо статическими библиотеками, либо представлениями динамически подключаемых библиотек, необходимых только во время компиляции, известных как « библиотеки импорта ». В отличие от мира UNIX , где используются разные расширения файлов, при связывании с .LIB
В Windows необходимо сначала узнать, является ли это обычной статической библиотекой или библиотекой импорта. В последнем случае .DLL
файл должен присутствовать во время выполнения.
См. также [ править ]
- Повторное использование кода — использование существующего программного обеспечения для создания нового программного обеспечения.
- Компоновщик (вычисления) - компьютерная программа, которая объединяет несколько объектных файлов в один файл.
- Загрузчик (вычисления) - часть операционной системы.
- Библиотека динамической компоновки - реализация Microsoft концепции общей библиотеки в Windows и OS / 2.
- Объектный файл – файл, содержащий машинный код перемещаемого формата.
- Плагин – программный компонент, который добавляет определенную функцию к существующему программному приложению.
- Prelink , также известный как Prebinding
- Статическая библиотека - набор подпрограмм, внешних функций и переменных в информатике.
- Библиотека времени выполнения – набор подпрограмм, которые могут быть вызваны скомпилированным двоичным файлом программного обеспечения во время его выполнения.
- Библиотека визуальных компонентов – Визуальная библиотека (VCL)
- Библиотека компонентов для кроссплатформенности (CLX)
- Стандартная библиотека C – Стандартная библиотека для языка программирования C.
- Библиотека классов Java
- Библиотека классов Framework – стандартная библиотека Microsoft .NET Framework.
- Общее программирование — стиль компьютерного программирования (используется стандартной библиотекой C++ ).
- soname – Поле данных в общем объектном файле.
- Заглушка метода – короткая и простая версия метода.
Примечания [ править ]
- ^ Раньше это было возможно, например, между подпрограммами Ada.
Ссылки [ править ]
- ^ Дешпанде, Прасад (2013). Обнаружение метаморфических явлений с использованием анализа графа вызовов функций (Диссертация). Библиотека государственного университета Сан-Хосе. doi : 10.31979/etd.t9xm-ahsc .
- ^ «Статические библиотеки» . TLDP. Архивировано из оригинала 3 июля 2013 г. Проверено 3 октября 2013 г.
- ^ Бэббидж, HP (12 сентября 1888 г.). «Аналитическая машина» . Труды Британской ассоциации . Ванна.
- ^ Голдстайн, Герман Х. (31 декабря 2008 г.). Компьютер от Паскаля до фон Неймана . Принстон: Издательство Принстонского университета. дои : 10.1515/9781400820139 . ISBN 978-1-4008-2013-9 .
- ^ Голдстайн, Герман ; фон Нейман, Джон (1947). Планирование и кодирование задач для электронно-вычислительного прибора (Отчет). Институт перспективных исследований. стр. 3, 21–22. OCLC 26239859 .
вероятно, будет очень важно разработать обширную «библиотеку» подпрограмм
- ^ Уилкс, М.В. (1951). «Компьютер EDSAC» . 1951 Международный семинар по управлению знаниями о требованиях . 1951 Международный семинар по управлению знаниями о требованиях. IEEE. п. 79. дои : 10.1109/afips.1951.13 .
- ^ Кэмпбелл-Келли, Мартин (сентябрь 2011 г.). «Во славу Уилкса, Уиллера и Гилла » . Коммуникации АКМ . 54 (9): 25–27. дои : 10.1145/1995376.1995386 . S2CID 20261972 .
- ^ Уилкс, Морис ; Уилер, Дэвид ; Гилл, Стэнли (1951). Подготовка программ для электронной цифровой вычислительной машины . Аддисон-Уэсли. стр. 45, 80–91, 100. OCLC 641145988 .
- ^ Вексельблат, Ричард (1981). История языков программирования . Серия монографий ACM. Нью-Йорк, штат Нью-Йорк: Academic Press (дочерняя компания Harcourt Brace ). п. 274 . ISBN 0-12-745040-8 .
- ^ Wexelblat, соч. цит. , с. 258
- ^ Уилсон, Лесли Б.; Кларк, Роберт Г. (1988). Сравнительные языки программирования . Уокингем, Англия: Аддисон-Уэсли. п. 126. ИСБН 0-201-18483-4 .
- ^ Уилсон и Кларк, соч. цит. , с. 52
- ^ Wexelblat, соч. цит. , с. 716
- ^ Каминский, Дэн (2008). «Глава 3 — Переносимый исполняемый файл и исполняемые и связывающие форматы» . Реверс-инжиниринг кода с помощью IDA Pro . Эльзевир. стр. 37–66. дои : 10.1016/b978-1-59749-237-9.00003-x . ISBN 978-1-59749-237-9 . Проверено 27 мая 2021 г.
- ^ Коллберг, Кристиан; Хартман, Джон Х.; Бабу, Шридивья; Удупа, Шарат К. (2003). SLINKY: перезагрузка статического связывания . УСЕНИКС '05. Департамент компьютерных наук Университета Аризоны . Архивировано из оригинала 23 марта 2016 г. Проверено 17 марта 2016 г.
- ^ «Библиотека генерации кода» . Исходная кузница . Архивировано из оригинала 12 января 2010 г. Проверено 3 марта 2010 г.
Библиотека генерации байт-кода — это API высокого уровня для генерации и преобразования байт-кода JAVA. Он используется АОП, тестированием и платформами доступа к данным для создания динамических прокси-объектов и перехвата доступа к полям.
- ^ Бреснахан, Кристина; Блюм, Ричард (27 апреля 2015 г.). Учебное пособие по сертификации LPIC-1 Linux Professional Institute: экзамен 101-400 и экзамен 102-400 . Джон Уайли и сыновья (опубликовано в 2015 г.). п. 82. ИСБН 9781119021186 . Архивировано из оригинала 24 сентября 2015 г. Проверено 3 сентября 2015 г.
Общие библиотеки Linux аналогичны библиотекам динамической компоновки (DLL) Windows. Библиотеки Windows DLL обычно идентифицируются по
.dll
расширения имен файлов.
Дальнейшее чтение [ править ]
- Левин, Джон Р. (2000) [октябрь 1999 г.]. «Глава 9: Общие библиотеки и Глава 10: Динамическое связывание и загрузка». Линкеры и загрузчики . Серия Моргана Кауфмана по разработке программного обеспечения и программированию (1-е изд.). Сан-Франциско, США: Морган Кауфманн . ISBN 1-55860-496-0 . OCLC 42413382 . Архивировано из оригинала 5 декабря 2012 г. Проверено 12 января 2020 г. Код: [1] [2] Ошибки: [3]
- Статья «Руководство по линкерам для начинающих» Дэвида Дрисдейла
- Статья Ускорение запуска программ C++ за счет повышения эффективности компоновки во время выполнения, Леон Ботту и Джон Райланд
- Как создавать библиотеки программ Барис Симсек
- BFD — библиотека дескрипторов двоичных файлов
- 1-й семинар по проектированию библиотечного программного обеспечения LCSD'05. Архивировано 28 августа 2019 г. на Wayback Machine на OOPSLA'05.
- 2-й семинар по проектированию библиотечно-ориентированного программного обеспечения LCSD'06 на выставке OOPSLA'06
- Как создать общую библиотеку Ульриха Дреппера (с большим количеством справочной информации)
- Анатомия динамических библиотек Linux на IBM.com