Л.Е. Карпов - Системы программирования (1119429), страница 18
Текст из файла (страница 18)
Компоненты, к которым завершены всеобращения, могут удаляться операционной системой из памяти машины. Вновь онипопадают в память только после очередного реального обращения к ним.Динамические библиотеки имеют множество преимуществ перед статическими.Их составляющие не должны включаться в состав исполняемых файлов программ, чтозначительно сокращает их размеры. Этого преимущества удается добиться за счетразработки специального механизма операционной системы, который выполняетподключение фрагментов одних программ к другим в момент их выполнения.Известным недостатком динамических библиотек является зависимостьпрограммного обеспечения от библиотечных объектов, непосредственно не связанныхс этим обеспечением, то есть зависимость программ пользователей от неизвестных имдинамических библиотек.
Для выполнения программ, основанных на динамическомподключении библиотек, необходимо принимать специальные меры, гарантирующиеналичие всех необходимых библиотечных компонентов в составе той вычислительнойсистемы, где предполагается исполнять эти программы. Одновременно возникаетзависимость самой логики работы программ от подключаемых к ней библиотек.Изменения в библиотеках осуществляются системными средствами, не зависящими отразработчиков прикладного обеспечения, а эти изменения могут влиять на работупрограмм, которые сами не менялись перед этим продолжительное время.Это означает, что использование динамических библиотек налагаетобязательства, как на их разработчиков, так и на их пользователей. Разработчикприкладной программы должен тщательно придерживаться правил, предложенныхразработчиками библиотек.
В свою очередь, разработчики библиотек, внося вбиблиотеки изменения, должны предпринимать меры, чтобы эти измененияминимальным образом сказывались на прикладных программах, основанных напредыдущих версиях библиотеки. Одним из результатов таких мер является то, что всовременных библиотеках имеются специальные библиотечные компоненты, которыепозволяют точно определить версию данного библиотечного набора компонентов.Описанное повышение эффективности использования памяти вычислительнойсистемы происходит за счет увеличения времени выполнения программ, поскольку надинамическую загрузку приходится тратить дополнительное время.3.6.3. Основные типы библиотекНикакая современная система программирования не может обойтись безвстроенных в нее библиотечных средств. Для широкого распространениябиблиотечных средств в программировании имеются, по крайней мере, две причины:••необходимость оказывать поддержку программам во время их исполнения навычислительной машине,потребность накапливать полезные программы и передавать их другимпользователям,нераскрываядеталейреализацииалгоритмов,запрограммированных в них.По функциональному наполнению все используемые в составе современныхсистем программирования библиотеки можно классифицировать следующим образом:•••библиотеки функций, процедур и макроопределений,библиотеки классов,библиотеки компонентов.663.6.3.1.
Библиотеки функций, процедур и макроопределенийМногие программы, прошедшие компиляцию, нуждаются в поддержке во времявыполнения. Почти все языки программирования включают в себя некоторыеэлементы, реализация которых подразумевает, что во время выполнения программыдолжна обеспечиваться связь с операционной системой. Наиболее нагляднымпримером может быть пример реализации операций, связанных с вводом и выводоминформации.
В каждом языке программирования имеются операторы ввода/вывода,которые не могут быть реализованы никаким образом, кроме обращений к системнымпрограммам, собранным в библиотеку, представляющую собой коллекцию объектныхмодулей, сформированных заранее при разработке самого компилятора. Естественно,что нет никакой необходимости в том. чтобы программы, входящие в такиебиблиотеки, были написаны на том же языке программирования, с которого ведетсякомпиляция. Однако необходимо, чтобы компоненты библиотеки были написаны сучетом того, что к ним могут делаться обращения из программ, написанных наопределенном языке и компилируемых конкретным компилятором.Библиотеки связаны не только с целевой машиной и целевой вычислительнойсистемой, но даже с конкретным компилятором, которым выполнялось ихформирование.
Однако некоторые языки программирования имеют настолько близкуюсемантику вызовов процедур и представления данных, что компиляторы для них могутсоздавать программы, которые можно вызывать из программ, написанных на другихязыках.Необходимость оказания системной поддержки программам, проходящимобработку в системах программирования, повлияло на первоначальное наименованиебиблиотек, которые сначала назывались библиотеками системных программ илибиблиотеками стандартных программ.Параллельно с разработкой системных библиотек началась работа по разработкебиблиотек прикладных программ, которые со временем превратились в пакетыприкладных программ, то есть в совокупности программ, позволяющих выполнить веськомплекс операций по обработке информации.
Потребность создания прикладныхпакетов существует для каждой прикладной области. Например, в областиматематических расчетов созданы многочисленные пакеты программ, лидером средикоторых является пакет, принадлежащий международной Группе ЧисленныхАлгоритмов (The Numerical Algorithms Group). Прикладные программы, входящие вэтот пакет, предназначены для подключения к программам пользователей, написаннымна языке Си и разных вариантах языка Фортран (Фортран 77, Фортран 90, Фортран 95),причем для разных операционных систем и трансляторов (Compaq Alpha Tru64, IBMRS/6000, Intel Linux pgf77, Intel Linux g77, Silicon Graphics IRIX).
В дополнение кобычным расчетным программам в пакет входит набор из 76 статистическихрасширений для проведения моделирования и применения мультивариативных методовнепараметрической статистики для электронных таблиц Microsoft Excel дляоперационных систем Windows 95/98/NT/2000/XP.В Научно-исследовательском Вычислительном центре МГУ создана библиотекачисленного анализа для использования с трансляторами pgf77 и pgcc с языков Фортран77 и Си, разработанными Portland Group/STM.Созданы пакеты прикладных программ для автоматизации бухгалтерского учетаи обработки финансовой информации (многие из них используются для работы с67программами, написанными на языке Кобол).
Широко известны пакеты прикладныхпрограмм для управления базами данных (СУБД) и издательских систем.В библиотеки могут включаться не только объектные модули системныхпрограмм, но и макроопределения. Поддержка, которая оказывается ими,осуществляется не на стадии выполнения программ, а на стадии их компиляции,поскольку макроопределения и соответствующие им макровызовы вставляютсянепосредственно в тексты компилируемых программ.Современные библиотеки содержат также интерфейсную информацию,предназначенную для чтения автоматизированными системами программирования.Такая информация может использоваться при передаче компилятору сведений осоставе входящих в библиотеку процедур и функций.
Обрабатывая эти файлы,компилятор автоматически получает всю необходимую информацию о компонентахбиблиотеки, причем эта информация поставляется в терминах входного языкакомпилятора. Тем самым автор компилируемой программы избавляется отнеобходимости вставлять в свои тексты описания библиотечных компонентов –функций, процедур, а также констант и переменных.3.6.3.2. Библиотеки классовСледующим шагом в развитии библиотек оказалось создание библиотек классовдля систем программирования, основанных на объектно-ориентированных языкахпрограммирования (Си++, Java). Библиотеки классов могут представлять собой•••совокупности независимых классов,иерархии классов,иерархии шаблонов классов.Простые наборы описаний классов встречаются в системах программированиявсе реже и реже.
Такие наборы могут оказаться полезными, но пользоваться иминелегко, так как они обычно плохо структурированы.Иерархические библиотеки оказывают своим пользователям лучшуюподдержку. Часто в основу иерархий закладывается один наиболее общий класс(Object), а остальные классы строятся как производные от него. Однако такой подходможет привести к возникновению проблемы “жирного интерфейса”.
На более верхнихуровнях иерархии должна собираться более общая функциональность. Таким образом,либо исходный базовый класс оказывается пустым (то есть присущей абсолютно всемэлементам иерархии общей функциональности выделить не удается), либо строитсяабстрактный класс с огромным набором виртуальных функций.Пустой базовый класс просто имитирует связь нижних уровней иерархии междусобой, фактически же такая связь в данном случае отсутствует.
Наличие виртуальныхфункций (иногда семантически далеких друг от друга) заставляет при формированиинижних уровней иерархии реализовывать их все, даже в тех случаях, когда длянекоторого конкретного производного класса конкретные функции не могут бытьреализованы сколько-нибудь эффективно в виду невозможности придать им полезнуюинтерпретацию. Отсутствие реализации хотя бы одной виртуальной функциипревращает класс в абстрактный, что ограничивает его использование.Решают подобные проблемы созданием систем иерархий, то есть построениемнаборов иерархических деревьев (“леса”), которые между собой не связываются68никакими отношениями (по такому принципу построены библиотека STL истандартная библиотека языка Си++).Библиотеки шаблонов построены на основе параметрического полиморфизма, тоесть параметризации типов, использования типовых параметров.
Библиотека STL истандартная библиотека языка Си++ представляют собой наборы иерархий шаблоновклассов.3.6.3.3. Библиотеки компонентовБиблиотеки компонентов представляют собой развитие понятия библиотекязыков программирования на основе развития концепции классов. Компонентами такихбиблиотек обычно являются законченные программные модули, из которых достаточнолегко строить наиболее типичные приложения, относящиеся к самым произвольнымприкладным областям. Библиотеки компонентов могут включать в себя генераторыотчетов, компоненты для построения сводных таблиц, компоненты для построенияграфиков и диаграмм, компоненты для создания графических интерфейсов.Библиотечные компоненты имеют общее программное ядро и проектируются на базеединых архитектурных принципов, что облегчает их совместное использование,сокращает время обучения для разработчика.Компоненты, включаемые в библиотеки, подчиняются правилам инкапсуляции,то есть имеют открытые реализованные интерфейсы, а детали реализации скрываютсявнутри библиотек и не видны пользователям.
Часто компоненты поставляются в видедвоичных модулей, что позволяет сделать их более независимыми от конкретныхсистем программирования и использовать в распределенном системном окружении, нопротиворечит стремлению сделать эти компоненты настраиваемыми (гибкими). Дляудобства использования над компонентами позволяется проводить операциюконтейнеризации, то есть помещения в контейнеры, допускающие внешнее визуальноепредставление.