И.А. Волкова, И.Г. Головин, Л.Е. Карпов - Системы программирования (1114897), страница 18
Текст из файла (страница 18)
Наиболее нагляднымпримером может быть пример реализации операций, связанных с вводом и выводоминформации. В каждом языке программирования имеются операторы ввода/вывода,которые не могут быть реализованы никаким образом, кроме обращений к системнымпрограммам, собранным в библиотеку, представляющую собой коллекцию объектныхмодулей, сформированных заранее при разработке самого компилятора. Естественно,что нет никакой необходимости в том. чтобы программы, входящие в такиебиблиотеки, были написаны на том же языке программирования, с которого ведетсятрансляция. Однако необходимо, чтобы компоненты библиотеки были написаны сучетом того, что к ним могут делаться обращения из программ, написанных наопределенном языке и транслируемых конкретным транслятором.Библиотеки связаны не только с целевой машиной и целевой вычислительнойсистемой, но даже с конкретным компилятором, которым выполнялось ихформирование.
Однако некоторые языки программирования имеют настолько близкую66семантику вызовов процедур и представления данных, что компиляторы для них могутсоздавать программы, которые можно вызывать из программ, написанных на другихязыках.Необходимость оказания системной поддержки программам, проходящимобработку в системах программирования, повлияло на первоначальное наименованиебиблиотек, которые сначала назывались библиотеками системных программ илибиблиотеками стандартных программ.Параллельно с разработкой системных библиотек началась работа по разработкебиблиотек прикладных программ, которые со временем превратились в пакетыприкладных программ, то есть в совокупности программ, позволяющих выполнить веськомплекс операций по обработке информации. Потребность создания прикладныхпакетов существует для каждой прикладной области.
Например, в областиматематических расчетов созданы многочисленные пакеты программ, лидером средикоторых является пакет, принадлежащий международной Группе ЧисленныхАлгоритмов (The Numerical Algorithms Group). Прикладные программы, входящие вэтот пакет, предназначены для подключения к программам пользователей, написаннымна языке Си и разных вариантах языка Фортран (Фортран 77, Фортран 90, Фортран 95),причем для разных вычислительных систем (Intel x86-32, Intel x86-64, Compaq AlphaTru64, IBM RS/6000), операционных систем (Microsoft Windows, Linux, Sun Solaris,Silicon Graphics IRIX) и трансляторов (Intel Linux pgf77, Intel Linux g77).В Научно-исследовательском Вычислительном центре МГУ создана библиотекачисленного анализа для использования с трансляторами pgf77 и pgcc с языков Фортран77 и Си, разработанными Portland Group/STM.Созданы пакеты прикладных программ для автоматизации бухгалтерского учетаи обработки финансовой информации (многие из них используются для работы спрограммами, написанными на языке Кобол).
Широко известны пакеты прикладныхпрограмм для управления базами данных (СУБД) и издательских систем.В библиотеки могут включаться не только объектные модули системныхпрограмм, но и макроопределения. Поддержка, которая оказывается ими,осуществляется не на стадии выполнения программ, а на стадии их компиляции,поскольку макроопределения и соответствующие им макровызовы вставляютсянепосредственно в тексты компилируемых программ.Современные библиотеки содержат также интерфейсную информацию,предназначенную для чтения автоматизированными системами программирования.Такая информация может использоваться при передаче компилятору сведений осоставе входящих в библиотеку процедур и функций. Обрабатывая эти файлы,компилятор автоматически получает всю необходимую информацию о компонентахбиблиотеки, причем эта информация поставляется в терминах входного языкакомпилятора. Тем самым автор компилируемой программы избавляется отнеобходимости вставлять в свои тексты описания библиотечных компонентов –функций, процедур, а также констант и переменных.3.6.3.2.
Библиотеки классовСледующим шагом в развитии библиотек оказалось создание библиотек классовдля систем программирования, основанных на объектно-ориентированных языкахпрограммирования (Си++, Java). Библиотеки классов могут представлять собой•совокупности независимых классов,67••иерархии классов,иерархии шаблонов классов.Простые наборы описаний классов встречаются в системах программированиявсе реже и реже. Такие наборы могут оказаться полезными, но пользоваться иминелегко, так как они обычно плохо структурированы.Иерархические библиотеки оказывают своим пользователям лучшуюподдержку.
Часто в основу иерархий закладывается один наиболее общий класс(Object), а остальные классы строятся как производные от него. Однако такой подходможет привести к возникновению проблемы “жирного интерфейса”. На более верхнихуровнях иерархии должна собираться более общая функциональность.
Таким образом,либо исходный базовый класс оказывается пустым (то есть присущей абсолютно всемэлементам иерархии общей функциональности выделить не удается), либо строитсяабстрактный класс с огромным набором виртуальных функций.Пустой базовый класс просто имитирует связь нижних уровней иерархии междусобой, фактически же такая связь в данном случае отсутствует. Наличие виртуальныхфункций (иногда семантически далеких друг от друга) заставляет при формированиинижних уровней иерархии реализовывать их все, даже в тех случаях, когда длянекоторого конкретного производного класса конкретные функции не могут бытьреализованы сколько-нибудь эффективно в виду невозможности придать им полезнуюинтерпретацию. Отсутствие реализации хотя бы одной виртуальной функциипревращает класс в абстрактный, что ограничивает его использование.Решают подобные проблемы созданием систем иерархий, то есть построениемнаборов иерархических деревьев (“леса”), которые между собой не связываютсяникакими отношениями (по такому принципу построены библиотека STL истандартная библиотека языка Си++).Библиотеки шаблонов построены на основе параметрического полиморфизма, тоесть параметризации типов, использования типовых параметров.
Библиотека STL истандартная библиотека языка Си++ представляют собой наборы иерархий шаблоновклассов.3.6.3.3. Библиотеки компонентовБиблиотеки компонентов представляют собой развитие понятия библиотекязыков программирования на основе развития концепции классов. Компонентами такихбиблиотек обычно являются законченные программные модули, из которых достаточнолегко строить наиболее типичные приложения, относящиеся к самым произвольнымприкладным областям. Библиотеки компонентов могут включать в себя генераторыотчетов, компоненты для построения сводных таблиц, компоненты для построенияграфиков и диаграмм, компоненты для создания графических интерфейсов.Библиотечные компоненты имеют общее программное ядро и проектируются на базеединых архитектурных принципов, что облегчает их совместное использование,сокращает время обучения для разработчика.Компоненты, включаемые в библиотеки, подчиняются правилам инкапсуляции,то есть имеют открытые реализованные интерфейсы, а детали реализации скрываютсявнутри библиотек и не видны пользователям.
Часто компоненты поставляются в видедвоичных модулей, что позволяет сделать их более независимыми от конкретныхсистем программирования и использовать в распределенном системном окружении, нопротиворечит стремлению сделать эти компоненты настраиваемыми (гибкими). Для68удобства использования над компонентами позволяется проводить операциюконтейнеризации, то есть помещения в контейнеры, допускающие внешнее визуальноепредставление. Такие контейнеры поддерживают развивающуюся технологиювизуального программирования (в стиле “drag & drop”).Примерами библиотек компонентов являются распространяемые компаниейMicrosoft библиотеки COM (Component Object Module) и DCOM (Distributed COM),библиотеки различных компаний, построенные на основе стандарта CORBA (CommonObject Request Broker Architecture), библиотеки, входящие в состав серверовприложений J2EE и .NET.Суммируя, можно говорить о том, что все современные библиотеки делятся надве категории:••библиотеки, связанные с конкретными системами программирования, ибиблиотеки, связанные с конкретными задачами, решаемыми с помощьювычислительных машин.Такое деление никак не связано с технической реализацией библиотечныхсредств.
Как системные (включая стандартные), так и прикладные библиотеки могутбыть и статическими и динамическими.3.6.3.4. Критерии проектирования стандартных библиотекСтандартная библиотека языка программирования является в настоящее времяобязательнойчастьюсистемнойбиблиотеки.Всесовременныеязыкипрограммирования нуждаются в поддержке имеющихся в них средств, причемподдержка им необходима именно в период выполнения программ, полученных путемкомпиляции с этих языков. При проектировании любой стандартной библиотекинеобходимо принимать во внимание ее основное назначение: быть именно стандартнойбиблиотекой, то есть библиотекой средств, необходимых для каждой реализацииданного языка программирования.
Чтобы библиотека могла оказывать поддержку всемпользователям этого языка, она должна (требования по составу):••••••обеспечивать поддержку свойств языка, например, управление памятью ипредоставление информации об объектах во время выполнения программ;предоставлять информацию о зависящих от реализации аспектах языка,например, о максимальных размерах целых значений;предоставлять функции, которые не могут быть написаны оптимально длявсех вычислительных систем на данном языке программирования, например,функции вычисления квадратного корня sqrt() или пересылок блоковпамяти memmove();предоставлять программисту нетривиальные средства, на которые он можетрассчитывать, заботясь о переносимости программ, например, средстваработы со списками, функции сортировки, потоки ввода/вывода;предоставлять основу для расширения собственных возможностей, вчастности, соглашения и средства поддержки, позволяющие обеспечитьоперации для данных, имеющих определяемые пользователями типы, в томже стиле, в котором обеспечиваются операции для встроенных типов(например, ввод/вывод);служить основой и теоретическим базисом других библиотек.69При проектировании стандартных библиотек следует учитывать и ограниченияна включение в ее состав некоторых (может быть полезных) элементов.