Б. Страуструп - Дизайн и Эволюция C++. 2006 (1160775), страница 52
Текст из файла (страница 52)
Обычно в состав вертикальных библиотек входят и те базовые классы, которые включаются в горизонтальные, но акцент делается на классах, в полной мере использующих особенности именно выбранного окружения. Порой преобладают классы для поддержки пользовательских интерфейсов и графики. Частью такой библиотеки могут быть также интерфейсы к конкретным базам данных. Нередко классы из вертикальной библиотеки ориентированы на применение в некотором общем каркасе, поэтому использование отдельной части библиотеки затруднено. Лично я предпочитаю разделять горизонтальные и вертикальные аспекты базовой библиотеки, что упрощает применение и выбор наиболее подходящей из них. С другой стороны, по ряду технических и коммерческих причин разумна интеграция.
Самые значительные из ранних базовых библиотек: созданная Китом Горленом Ы1Н [Оог1еп, 1990[, предлагавшая набор классов в духе Зша1!са!Ь, и 1псегч!есчз Марка Линтона (Маг1с 1зпсоп) [ансон, 1987[, упрощавшая работу с Х ЪИпс!оиз из программ на С++. Компилятор СНУ С++ (О++) поставляется с библиотекой, которую спроектировал Дуг Леа. Ее отличительной особенностью является эффективное использование абстрактных базовых классов [1.еа, 1993]. Библиотека Ц81. Бсапг1агс! Сопсропепсв [Сагто!1, 1993] содержит набор эффективно реализованных конкретных типов для различных структур данных, а также поддержку основных промышленных версий системы 1)Ы1Х. Компания Войне Жаче продает библиотеку Топ!з«+, включаюсцую набор базовых классов, которые с 1987 г.
писали Томас Кеффер (ТЬошаз Ке((ег) и Брюс Эккель [Ке((ег, 19931. Компания С1ос1сепзр!е1 в течение многих лет поставляла коммерческие библиотеки для различных применений [1)еаг!е, 1990[. Компания Вас!опа1 поставляет С++-версию библиотеки ТЬе ВоосЬ Сошропепсз, которую Грейди Буч (Огас!у ВоосЬ) первоначально Библиотеки БИШВИИЮ реализовал на языке Аг[а. На С++ ее переписали сам Буч и Майк Вило (М))ге 'у'(100). Версия на Ада занимает 125 тыс.
строк исходного текста без учета комментариев, тогда как версия на С++ — всего 10 тыс. строк. Как видно, наследование в сочетании с шаблонами может стать мощным механизмом для организации библиотек без потери эффективности или ясности [ВоосЬ, 1993[. 8.4.2. Устойчивость и базы данных Под устойчивостьк) (регя)я(епсе) понимаются разные аспекты. Некоторым пользователям просто нужен пакет для ввода/вывода объектов, который входит в состав многих библиотек. Другие хотят обеспечить прозрачную миграцию объекта из файла в память и обратно. Третьим необходим контроль версий и протоколирование транзакций.
Четвертые не согласны пи на что, кроме распределенной системы с адекватным управлением параллельностью и полной поддержкой переме)цения схем. Поэтому я думаю, что устойчивость следует обеспечивать за счет специальных библиотек, нестандартных расширений, а возможно, и продуктов третьих фирм. Имеющийся в С++ механизм идентификации типов во время исполнения содержит кое-какие «зацепким которые оказались полезны для специалистов по устойчивости (см. раздел 14.2.5). И Х1Н, и библиотека СХ() содержат базовые механизмы для ввода/вывода объектов.
РОЕТ вЂ” пример коммерческой С++-библнотеки для поддержки устойчивости. Существует около дюжины объектно-ориентированных баз данных, к которым можно обращаться из С++ и на С++ же и написанных. В качестве примера назову ОЬ)ес(Итоге, ОХТО5 [СаггеП, 1991) и Чегяапк 8.4.3.
Библиотеки для численных расчетов Компании Копне Жауе [Ке((ег, 1992[ и 1)уас( предлагают много классов, ориентированных прежде всего на научные приложения. Основное назначение таких библиотек — представить нетривиальные математические методы в форме, удобной для специалистов, работающих в разных областях науки или техники. Вот пример непользования поставляемой компанией 5апг((а Ха1юпа! 1лЬя библиотеки ВНА(.Е««лля математической физики: уоЫ Ресопрояе(сопяс ()опЫе с)е1с, Эуптепяога у, Тепяогя К, попас Тепяога Ь) ( Эуптепяог О = эуп(Ь); йпгттепяог Н = йпгт(Ы; уессог я = ояат(у*%; уесяог опта = оиа)(Н) — 2.0*тпнегяе(у-тг(у)*Опе)*я; йпсттепяог ояепа = 0.5*опят(оэепа)) в = тпчегяе(опе-0.5*г)е1с*опеда) * (опе«0.5*г)е1г*отепа)*п; у += г)е с«эу (ь у-у*оведя); ) Согласно [Вцг(йе,1992$ «этот код прозрачен, а лежащие в его основе библиоте-, ки классов весьма многоплановы и удобны для сопровождения.
Физику, знакомому Стандартная библиотека ЯИИИИИИП с алгоритмом полярной декомпозиции, смысл этого кода ясен с первого взгляда, так что не нужна даже дополнительная документация .. 8.4.4. Специализированные библиотеки Вышеупомянутые библиотеки предназначены главным образом для поддержки программирования как такового. Но не менее важны и узкоспециализированные библиотеки. В частности, можно найти общедоступные, коммерческие и разработанные для внутреннего применения библиотеки для таких областей, как гндродинамика, молекулярная биология, анализ сетей связи, пульты телефонных опера~оров и т д. Для многих программистов именно подобные библиотеки являются свидетельством достоинств С++ в плане простоты программирования, уменьшения числа ошибок, сокращения затрат на сопровождение и т.д. Вот пример из области моделирования сетей с коммутацией каналов [Е[с]ь 1991~: $1пс1цбе <яфт11)з.ь> 1пс ггцпхя[] = ( /* ...
*/ )) боц)зге 1оаб[] = ( /* ... */ ); с1авв ЬВА : рц)з11с Ро11су ( /* ... */ ); та1п() ( Б1щ ятщю // планировщик событий яьщ.пегиогх(пем Несиогх(сгцп)ся))) // создать сеть ятщ.ггагсфс(пем тгаг11с(1оаб,3.0)); // матрица трафика яфш.роьфсу(пеы ЬВА); О стратегия маршрутизации ЬВА яцп.гцп(180)/ // моделировать в течение 180 минут соцс«я1щ; // вывести результаты Встречающиеся в этом фрагменте классы — это либо классы из библиотеки 31МЕ1В, либо произведенные от них пользователем. Они определяют сеть, нагрузку и стратегию маршрутизации для одного прогона модели. Многие специализированные библиотеки, например для поддержки графики и визуализации, являются общими, по в этой книге я не ставил своей целью перечислять или классифицировать их. 8.5. Стандартная бибпиотека Коль скоро библиотеки для С++ так разнообразны, возникает вопрос о том, какие из ннх должны быть стандартными, то есть специфицированными в стандарте и включенными в любую реализацию.
Прежде всего необходимо стандартизировать основные библиотеки, используемые повсеместно. Это значит, что нужно специфицировать точный интерфейс между С++ и стандартными библиотеками С, а также библиотеку [озсгеатз. ИИИИИИИВ Библиотеки Кроме того„нужно специфицировать базовую языковую поддержку, например, функции::орегасог пех(ейное г) и яег пех )тапд1ег(), которые поддерживают оператор пех (см.
раздел 10.6), функции сегшйпасе () и ппехрессес) () для поддержки обработки исключений (см. раздел 169) и классы суре Того, )зас) саяе и Ьас) сурейс), необходимые для поддержки идентификации типов во время исполнения (см. раздел 14.2). Далее комитет должен разобраться, может ли удовлетворить желание иметь «более полезные и стандартные классы», например ясгйпд, не занимаясь самостоятельно проектированием и не вступая в конкуренцию с индустрией производства библиотек для С++. Любые библиотеки, кроме библиотек С и !озсгеащз, которые одобряет комитет, должны включать лишь строительные блоки.
Основная роль стандартной библиотеки — облегчить взаимодействие между специализированными, независимо разработанными библиотеками. Принимая во внимание все вышесказанное, комитет одобрил классы ясгйпд и хясгйпд и пытается объединить их в некий шаблон «строки, включающей абсолютно все». Одобрен также класс динамического массива с)упаггау [3са(, 19931, шаблон класса Ыся<с(> для битовых множеств фиксированного размера, класс Ыгясг(пд для битовых множеств с изменяемым размером.
Кроме того, комитет принял классы комплексных чисел (прсдшественник — первоначальный класс сошр1ек, см. Раздел 3.3), обсуждается вопрос, следует ли припять класс вектора для поддержки численных расчетов и научных приложений. О наборе стандартных классов, их спецификациях и даже названиях все еше ведутся оживленные споры. На мой взгляд, в стандартную библиотеку должны были включены шаблоны списка и ассоциативного массива (отображения) — см.
раздел 9.2.3. Однако, как и в случае с версией 1.0, они могут быть принесены в жертву желанию во что бы то ни стало завершить стандартизацию ядра языка вовремя.' ' Я очень рал, что могу взять эти слова обратно! Комитет проникся важностью вопроса и одобрил великолепную библиотеку контейнеров, итераторов и фундалсентальпых алгоритмов, спроектированную Алексом Степановым.
Эта библиотека, которую часто называют 3ТЬ (3сапс(агс( Тещр!асс 1.!Ьгагу), представляет собой изящный, аффективный, формально полный и хорошо протестированный каркас для построения и использования контейнеров (А!ехапс(ег 3серапоч и Меня Ьее: Т!се угапг(ать Т«тр!ше 1(бгагв, НР 1дЬв ТесЬп(са! Керогс НР1.-94-34 (К.1), 1994. М(йе т'(!ос: Т)се С++ )серо»с, 1994). Разумеется, ЭТА содержит классы для отображений и списков и включает в качестве частных случаев вышеупомянутые классы с)упаггау, Ьвся н Ысясгспд. Кроме того, комитет одобрил классы векторов для поддержки численных и научных расчетов, приняв за основу предложение Кена Баджа из 3апс((а 1.аЬк Глава 9. Перспективы развития языка С++ Нельзя дважды войти в одну и ту же реку.
Гераклит 9.1. Введение Данная глава в большей степени основана на личных оценках и обобщениях. Здесь приведены ответы на некоторые общие вопросы и рассмотрены проблемы, которые всегда возникают при обсуждении проектирования С++. Глава состоит из трех взаимосвязанных частей: сз попытка оценить текущее состояние С++ с учетом имеющегося опыта, а также разобраться, каким мог бы стать язык (см. разлел 9.2); сз оценка проблем, которые станут актуальными для разработчиков программ в будущем, с целью понять, как с помощью С++ можно было бы способствовать их решению (см.
раздел 9.3); а взгляд на те области, в которых сам язык и его применение стоило бы значительно усовершенствовать (см. раздел 9А). 9.2. Оценка пройденного пути Часто говорят, что «задним умом всяк крепок». Это неверно. Данное утверждение основано на ложных допущениях о том, будто нам известны все существенные факты прошлого, что мы знаем все о текущем состоянии дел и достаточно беспристрастны.
Обычно ни одно из этих условий не выполняется. Поэтому ретроспективный взгляд на явление, столь сложное и динамичное, как язык программирования и его широкомасштабное применение, не может быть простой констатацией факта. Так или иначе, я попытаюсь дать ответы на некоторые трудные вопросы: ш достигнуты ли основные цели С++? а является ли С++ логически последовательным языколт? а какова основная недоработка языка? Разумеется, ответы на эти вопросы взаимосвязаны; «да», «да» и «отказ от включения более полной библиотеки в версию 1.0».
ПИИИИИИ? Перспективы развития языка С++ 9.2.1. Достигнуты ли основные цели С++? «С++ — это язык программирования общего назначения, цель которого — слелать работу серьезных программистов более приятным занятием» [8ггоцзггцр, 1986Ъ|. Данная задача успешно решена. Точнее, достаточно образованным и оп ытпым программистам язык дал возможность писать программы на более высоком уровне абстракции («точно так же, как в 8!пш!а»), не утратив присущей С эффективности. Это удалось сделать для приложений (внутренне сложных, ограниченных условиями среды выполнения), которым требуется быстродействие и большое потребление памяти. В более широком смысле объектно-орисцтировашюе программирование и абстракции данных стали доступны разработчикам, которые раньше относилнсь к таким метолам и поддерживающим их языкам (8ша! !га)к, С!ц, 8!пш!а, А«1а, 00 1 Ьр н т.д.) пренебрежительно и даже презрительно («лорогие игрушки, непригодные лля решения реальных задач»).