Б. Страуструп - Дизайн и Эволюция C++. 2006 (1160775), страница 49
Текст из файла (страница 49)
Ее формулируют люди, и согласие достигается именно между ними. Стратегия развития С++ идет от преобладавших в Ве1! ЕаЬз и других подразделениях АТЛЕТ идей. 5! зык никогда бы не стал популярным, если бы концепция общедоступного программного обеспечения не нашла поддержки. Конечно, согласие достигалось не всегда просто, иногда не достигалось и вовсе. Мне рассказывали, как однажды некий менеджер высказал идею засекретить С+в как конкурентное преимушество ЛТЬ1'. Его разубедил другой менеджер, добавив: . В любом случае идея абсурдна, поскольку Бьерн уже раздал 700 копий справочного руководства».
Разумеется, все экземпляры были отправлены после получения надлежащего разрешения и одобрения моим начальством. Важным фактором, свидетельствуннцим одновременно и за, и против С+~-, было согласие сообщества принимать язык со всеми его недостатками. Такая открытость заставляла нас быть честными, работать над улучшением языка и его инструментальных средств и не лавала пользователям питать нереалистичные надежды. Некоторые уливляются, почему, говоря о «коммерческой конкуренции >, я пе называю конкретных языковых средств, инструментов, дат выхода версий, не упоминаю маркетинговых стратегий, обзоров нли коммерческих организаций. Отчасти потому, что я уже не раз обжигался в спорах с фанатичными поборниками разных языков и на маркетинговых кампаниях, где главенствуют циники. С другой стороны, мой подход к выбору языка основан на вере в то, что конкретные языковые средства и инструменты в широком смысле не так уж важны и являются лишь мишенью псевдонаучных перепалок.
Тут действует некий вариант закона больших чисел. На любом из упоминавшихся выше языков, в том числе на С, можно реализовать легкую часть проекта. На любом из ннх зту же часть проекта можно рсавизовать более изящно, чем на С. Однако гораздо важнее, можно ли на языке реализова~ь весь проект, или удастся ли все проекты, с которыми сталкивается организация — будь то компания или факультет университета, — удачно выполнить с помощью данного языка. Настоящая конкуренция — это состязание между сообществами пользователей.
Хорошо организованное сообщество, объелп пенное некоей обшей идеей, имеет локальное преимушество, но в длительной перспективе и с более широкой точки зрения оказывается в проигрыше. Широкий диапазон возможностей С++, разнообразие круга пользователей, способность справляться с практическими проблемами, высокая эффективность— вот что составляет истинную силу языка. Глава 8. Библиотеки Понять жизнь можно, вишь оглядываясь назад, но жить-то приходится, смотря вперед.
Серен Кьеркегор 8.1. Введение Проекгирование библиотеки оказывается лучше включения нового средства в язык гораздо чаше, чем можно предположить. С помощью классов можно прел- ставить почти все необходимые концепции. Использоваштс библиотек обычно не помогает при решении синтаксических проблем, но иногда выручают конструкторы и перегрузка операторов. При необходимости специальную семантику пли особо высокую производительность можно реализовать на других языках.
Примером служат библиотеки для высокопроизводительных векторных операций, которые реализуются с помощью встраиваемых операторных функций и компилируются в код, оптимизированный для специального оборудования. Размышляя о библиотеках, сначала следует рассматривать возможность их применения. Проектирование библиотек — почти всегда самый конструктивный способ приложения энергии для энтузиастов, жаждугпих нововведений.
Только если не удается достичь результата на этом пути, следует лумап о расширении языка. 82. Проектирование библиотеки С++ Библиотека Рогггап — это набор подпрограмм, библиотека С вЂ” набор функций и ассоциированных с ними структур данных, библиотека БщаПга1к — иерархия классов с корнем в определенном месте стандартной иерархии Б1па!1га1к, А что такое библиотека С++? Ясно, что она может походить на библиотеку Рогггап, С или Бтайгайт.
Но также она может быть набором абстрактных типов с несколькими реализациями (см. Раздел 13.2.2), набором шаблонов (см. главу 15)... Допустимы и другие варианты. Проектировщик библиотеки С++ может выбирать пз нескольких базовых структур или даже предложить несколько вариантов интерфейса к одной библиотеке. Например, библиотеку, организованную как набор абстрактных типов, удастся представить и как набор функций для программы на С. А библиотека, устроенная в виде иерархии классов, может внешне выглялеть как набор описателей (Ьапс1!еэ). Вариативность подходов отражает разнообразие потребностей сообщества пользователей С++.
К библиотеке, поддерживающей высокопроизводительные вычисления, предъявляются иные требования, чем к библиотске интерактивной БИИИВИ16, Библиотеки графики. И обе они сильно отличаются от библиотеки, предоставляющей низкоуровневые структуры данных для создания других библиотек. С++ развивался в направлении поддержки различных структур библиотек, а некоторые нз последних нововведений спепнально спроектированы для того, чтобы разные библиотеки можно было использовать совместно. В.2Л. Альтернативы при проектировании библиотеки При создании первых библиотек Сьь часто слепо копировались приемы из других языков.
Например, первоначальный вариант моей библиотеки для поддержки многозадачности [Бггопзггпр, 1980Ь1, [81гопзГгпр, 198?Ь[ — самой первой библиотеки для С++ — предоставлял средства, аналогичные механизмам моделирования из Бппп1а. Библиотека для работы с комплексными числами [Козе, 1984~ содержала функции, похожие на функция для арифметики с плавающей точкой из стандартной математической библиотеки С. Библиотека Х1Н Кита Горлена [Оог1еп, 1990) представляла собой аналог библиотеки БшаПга1[г.
По мере того как пользователи, работавшие раньше на других языках, переключаются на С++, появляются и новые библиотеки в стиле «раннего С++». Программисты еше пе до конца освоили методы проектирования на нем; создавая такие библиотеки, они одновременно знакомятся с возможностями, которые предоставляет С++. О каких альтернативах идет речь? Отвечая на этот вопрос, часто акцентируют внимание на языковых средствах. Следует ли пользоваться встраиваемыми функциями, виртуальными функциями, множественным наследованием, иерархиями с одним корнем, абстрактными классами, перегруженными операторами? Все это второстепенно. Перечисленные и другие средства существуют для поддержки фундаментальных возможностей.
Должно ли проектирование: о ставить во главу угла эффективность во время исполнения? о минимизировать время перекомпиляции после изменений? л максимально облегчать перенос на другую платформу? з разрешать пользователям расширять базовую библиотеку? л допускать использование без исходных текстов? з сочетаться с существующими нотациями и стилями? л обеспечивать использование из программ, написанных не на С++? э быть пригодным для неопытных пользователей? Только после ответа ца вопросы такого рода можно переходить к техническим деталям. Современные библиотеки часто предоставляют самые разнообразные классы, чтобы помочь пользователю сделать правильный выбор. Например, библиотека может располагать очень простым и эффективным классом для работы со строками.
Кроме того, для той же цели в ней может быть размещен высокоуровневый класс с большим числом средств и возможностей настройки пользователем (см. раздел 8.3). В.2.2. Языковые средства и построение библиотеки Концепция классов и система типов С++ — основа проектирования любой библиотеки. Сильные и слабые стороны данных аспектов определяют структуру Проектирование библиотеки С++ '6ИИИИИИН библиотек С++. Главная рекомендация авторам библиотек — не пытайтесь сражаться с системой типов. Над базовыми механизмами языка пользователь может одержать лишь пиррову победу.
Изящества, простоты использования и эффективности можно достичь, только оставаясь в рамках базовой структуры языка. Если эти рамки вас стесняют, стоит подумать о смене языка. Базовая структура С++ поошряет программирование с сильной типизацией. В С++ класс — это тип. Сочетание правил наследования, механизма абстрактных классов и механизма шаблонов подталкивают пользователя к тому, чтобы манипулировать объектами в точном соответствии с предоставляемыми интерфейсами.
Можно говорить и более определенно: не обходите систему контроля путем приведения типов. Приведения необходимы для многих низкоуровневых операций, иногда для отображения высокоуровневых интерфейсов на низкоуровневые, но библиотека, при работе с которой приходится постоянно прибегать к приведениям типов, возлагает на пользователя непомерный, а чаше всего и ненужный труд.
Семейство функций рг(осй из библиотеки С, указатели типа чо(с1*, объединения и другие низкоуровневые средства лучше всего изъять из интерфейсов библиотеки, поскольку из-за них возникают «дырыь в системе контроля библиотечных типов. 8.2.3. Как работать е разнообразными библиотеками Нельзя ожидать, что две произвольно взятые библиотеки смогут работать вместе. Многие библиотеки оказываются совместимыми, но в обычно это является предметом особой заботы и программиста, и разработчика библиотеки, и проектировшика языка. По мере развития С++ удалось обеспечить достаточные средства для решения фундаментальных проблем, с которыми сталкивается пользователь при попытке применить независимо разработанные библиотеки.
Стоит лобавить, что и разработчики теперь задумываются о том, что их библиотеку, возможно, будут применять вместе с другими. Проблема использования одного и того же имени в разных библиотеках решается с помощью пространства имен (см. раздел 17.2). В основе общей модели обработки ошибок лежит обработка исключений (см. главу 16). Шаблоны (см. главу 15) дают механизм определения контейнеров и алгоритмов, не зависящих от типа данных; конкретные типы пользователь указывает при вызове библиотеки. Конструкторы и деструкторы обеспечивают единый способ инициализации и уничтожения объектов (см. раздел 2.11). Абстрактные классы — зто механизм определения интерфейсов независимо от реализации (см.