stringtranslate.com

Библиотека (вычисления)

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

В информатике библиотека — это совокупность ресурсов, которые используются во время разработки программного обеспечения для реализации компьютерной программы .

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

В IBM OS/360 и ее преемниках это называется секционированным набором данных .

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

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

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

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

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

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

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

История

Идея компьютерной библиотеки восходит к первым компьютерам, созданным Чарльзом Бэббиджем . В статье 1888 года, посвященной его аналитической машине, предполагалось, что компьютерные операции можно выполнять на отдельных карточках с числовым вводом. Если бы эти перфокарты операций были сохранены для повторного использования, то «со временем у движка появилась бы собственная библиотека». [3]

Женщина работает рядом со шкафом с библиотекой подпрограмм на катушках перфоленты для компьютера EDSAC.

В 1947 году Гольдстайн и фон Нейман предположили, что было бы полезно создать «библиотеку» подпрограмм для их работы на машине IAS , раннем компьютере, который в то время еще не работал. [4] Они представили физическую библиотеку записей магнитных проводов , в которой каждый провод хранит многоразовый компьютерный код. [5]

Вдохновленный фон Нейманом, Уилкс и его команда создали EDSAC . В шкафу с перфолентой хранилась библиотека подпрограмм для этого компьютера. [6] Программы для EDSAC состояли из основной программы и последовательности подпрограмм, скопированных из библиотеки подпрограмм. [7] В 1951 году команда опубликовала первый учебник по программированию « Подготовка программ для электронного цифрового компьютера» , в котором подробно описывалось создание и назначение библиотеки. [8]

COBOL включил «примитивные возможности библиотечной системы» в 1959 году [9] , но в ретроспективе Жан Саммет описал их как «неадекватные библиотечные возможности». [10]

У JOVIAL был коммуникационный пул (COMPOOL), грубо говоря, библиотека заголовочных файлов.

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

К середине 1960-х годов библиотеки копирования и макросов для ассемблеров стали обычным явлением. Начиная с популярности IBM System/360 , библиотеки, содержащие другие типы текстовых элементов, например, системные параметры, также стали обычным явлением.

Simula был первым объектно-ориентированным языком программирования, и его классы были почти идентичны современной концепции, используемой в Java , C++ и C# . Концепция класса Simula также была прародительницей пакета в Ada и модуля Modula - 2 . [12] Даже когда классы Simula были первоначально разработаны в 1965 году, их можно было включать в файлы библиотеки и добавлять во время компиляции. [13]

Связывание

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

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

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

Переезд

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

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

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

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

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

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

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

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

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

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

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

Некоторое время объектные библиотеки сохраняли статус «следующей большой вещи» в мире программирования. Было предпринято множество попыток создать системы, которые могли бы работать на разных платформах, и компании соревновались в попытках запереть разработчиков в своей собственной системе. Примеры включают системную объектную модель IBM (SOM/DSOM), Distributed Objects Everywhere (DOE) Sun Microsystems , Portable Distributed Objects (PDO) NeXT , ObjectBroker Digital , модель компонентных объектов 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динамически подключаемые библиотеки -style ( .dylibвместо этого суффикс). Однако большинство библиотек в macOS состоят из «фреймворков», размещенных в специальных каталогах, называемых « пакетами », которые содержат необходимые файлы и метаданные библиотеки. Например, инфраструктура под названием MyFrameworkбудет реализована в пакете под названием MyFramework.framework, который MyFramework.framework/MyFrameworkбудет либо файлом динамически подключаемой библиотеки, либо символической ссылкой на файл динамически подключаемой библиотеки в MyFramework.framework/Versions/Current/MyFramework.

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

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

Библиотека САПР

Библиотека автоматизированного проектирования или библиотека САПР — это облачное хранилище 3D-моделей или деталей для автоматизированного проектирования (САПР), автоматизированного проектирования (CAE), автоматизированного производства (CAM) или информационного моделирования зданий (BIM). ). Примерами библиотек САПР являются GrabCAD , Sketchup 3D Warehouse , McMaster-Carr , TurboSquid и Thingiverse . [18] Модели могут быть бесплатными, с открытым исходным кодом или проприетарными , и для доступа к 3D-моделям библиотеки САПР необходимо оплатить подписку . Библиотеки САПР искусственного интеллекта разрабатываются с использованием связанных открытых данных схем и диаграмм . [19]

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

Примечания

  1. ^ Раньше это было возможно, например, между подпрограммами Ada.

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

  1. ^ Дешпанде, Прасад (2013). Обнаружение метаморфизма с использованием анализа графа вызовов функций (Диссертация). Библиотека государственного университета Сан-Хосе. doi : 10.31979/etd.t9xm-ahsc .
  2. ^ «Статические библиотеки». TLDP. Архивировано из оригинала 3 июля 2013 г. Проверено 3 октября 2013 г.
  3. ^ Бэббидж, HP (12 сентября 1888 г.). «Аналитическая машина». Труды Британской ассоциации . Ванна.
  4. ^ Голдстайн, Герман Х. (31 декабря 2008 г.). Компьютер от Паскаля до фон Неймана. Принстон: Издательство Принстонского университета. дои : 10.1515/9781400820139. ISBN 978-1-4008-2013-9.
  5. ^ Голдстайн, Герман ; фон Нейман, Джон (1947). Планирование и кодирование задач для электронно-вычислительного прибора (Отчет). Институт перспективных исследований. стр. 3, 21–22. OCLC  26239859. Вероятно, будет очень важно разработать обширную «библиотеку» подпрограмм.
  6. ^ Уилкс, М.В. (1951). «Компьютер EDSAC». 1951 Международный семинар по управлению знаниями о требованиях . 1951 Международный семинар по управлению знаниями о требованиях. IEEE. п. 79. дои :10.1109/afips.1951.13.
  7. ^ Кэмпбелл-Келли, Мартин (сентябрь 2011 г.). «Во славу Уилкса, Уиллера и Гилла». Коммуникации АКМ . 54 (9): 25–27. дои : 10.1145/1995376.1995386. S2CID  20261972.
  8. ^ Уилкс, Морис ; Уилер, Дэвид ; Гилл, Стэнли (1951). Подготовка программ для электронной цифровой вычислительной машины. Аддисон-Уэсли. п. 45, 80–91, 100. OCLC  641145988.
  9. ^ Вексельблат, Ричард (1981). История языков программирования. Серия монографий ACM. Нью-Йорк, штат Нью-Йорк: Academic Press (дочерняя компания Harcourt Brace ). п. 274. ИСБН 0-12-745040-8.
  10. ^ Wexelblat, соч. цит. , п. 258
  11. ^ Уилсон, Лесли Б.; Кларк, Роберт Г. (1988). Сравнительные языки программирования . Уокингем, Англия: Аддисон-Уэсли. п. 126. ИСБН 0-201-18483-4.
  12. ^ Уилсон и Кларк, соч. цит. , п. 52
  13. ^ Wexelblat, соч. цит. , п. 716
  14. ^ Каминский, Дэн (2008). «Глава 3. Переносимые исполняемые файлы, а также исполняемые и связывающие форматы». Реверс-инжиниринг кода с помощью IDA Pro . Эльзевир. стр. 37–66. doi : 10.1016/b978-1-59749-237-9.00003-x. ISBN 978-1-59749-237-9. Проверено 27 мая 2021 г.
  15. ^ Коллберг, Кристиан; Хартман, Джон Х.; Бабу, Шридивья; Удупа, Шарат К. (2003). SLINKY: перезагрузка статического связывания. УСЕНИКС '05. Департамент компьютерных наук Университета Аризоны . Архивировано из оригинала 23 марта 2016 г. Проверено 17 марта 2016 г.
  16. ^ «Библиотека генерации кода». Исходная кузница . Архивировано из оригинала 12 января 2010 г. Проверено 3 марта 2010 г. Библиотека генерации байт-кода — это API высокого уровня для генерации и преобразования байт-кода JAVA. Он используется АОП, тестированием и платформами доступа к данным для создания динамических прокси-объектов и перехвата доступа к полям.
  17. ^ Бреснахан, Кристина; Блюм, Ричард (27 апреля 2015 г.). Учебное пособие по сертификации профессионального института Linux LPIC-1: экзамен 101-400 и экзамен 102-400. Джон Уайли и сыновья (опубликовано в 2015 г.). п. 82. ИСБН 9781119021186. Архивировано из оригинала 24 сентября 2015 г. Проверено 3 сентября 2015 г. Общие библиотеки Linux аналогичны библиотекам динамической компоновки (DLL) Windows. Библиотеки Windows DLL обычно идентифицируются по .dllрасширениям имен файлов.
  18. ^ https://all3dp.com/2/best-sites-for-free-3d-cad-models-cad-libraries/
  19. ^ «Сократите время создания моделей САПР с помощью новой методологии создания деталей на основе искусственного интеллекта | GlobalSpec» .

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