Б. Страуструп - Дизайн и Эволюция C++. 2006 (1160775), страница 35
Текст из файла (страница 35)
провалились. В результате пришлось ждать выхода версии 2.0 в июне 1989 г., и, хотя 2.0 была лучше версии 1.2 почти во всех отношениях, в ней все же не были полностью реализованы возможности, упомянутые в статье «ЮЬаг1эу» (см. раздел 3.15). Частично вследствие этого в версию 2.0 не вошли значительно улучшенные и расширенные библиотеки. Поставка такой библиотеки была вполне возможна, поскольку многое из того, что стало библиотекой Стандартных Компонентов П51.', к тому времени уже использовалось внутри АТЛЕТ.
Однако мое желание иметь прямую поддержку шаблонов заслонило все иные варианты. Кроме того, некоторая часть руководителей отдела разработки почему-то верила, что библиотека может быть стандартом и одновременно значительным источником дохода. Версия 2.0 стала плодом работы группы, в которую входили Эндрю Кениг, Барбара Му, Стэн Липпман, Пэт Филип и я. Барбара занималась координацией, Пат — интеграцией, я и Стэн — кодированием. Мы с Кенигом рассматривали извещения об ошибках и обсуждали детали языка.
Эндрю и Барбара занимались тестированием. В результате удалось реализовать все новые возможности и исправить 80% ошибок. Кроме того, я написал большую часть документации. Как всегда, вопросы проектирования языка и сопровождения справочного руководства лежали на моих плечах. Барбара Му и Стэн Липпман возглавили команду, которая позже выпустила версии 2.1 и 3.0. Версия 2.0 1ВИИИИИКИ Многие из тех, кто оказал влияние на С ш!гЬ С!аззез и на начальный вариант С+«, продолжали разными способамн содействовать его развитию. Фил Браун (РЬ!! Вгошп), Том Каргнлл, Джим Коплнен, Стив Дьюхерст, Кит Горлен (Ке!гЬ бог[еп), Лаура Иве, Боб Келли (ВоЬ Кейсу), Брайан Керниган, Энди Кениг, Арчи Лахнер, Стэн Липпман, Ларри Майка (!.аггу Мау[га), Дуг Макилрой, Пэт Филип (раг РЬ гйр), Дейв Проссер (Паче Ргоззег), Пегги Куин (Реййу г„го!по), Роджер Скотт (койег Бсогг), Джерри Шварц, Джонатан Шапиро и Кэти Старк (КагЬу Бгаг[г)— всех этих людей я с благодарностью упомянул в работе [Бггоцзггцр,1989Ь).
С наибольшим энтузиазмом язык обсуждали Дуг Макнлрой, Энди Кениг, Джонатан Шопиро и я. Стабильность определения языка и его реализации были признаны самыми важными аспектами [Бггоцзггпр, 1987с); «Подчеркнем, что эти модификации языка — лишь расширения. С++ был и остается стабильным языком, на который можно положиться при разработке долгосрочных проектов». Не менее важной считалась роль С++ как языка общего назначения для промышленного применения [81гоцзтгцр, 1987с): «Переносимосп,. некоторых реализаций С++ — важнейшая цель проектирования. Г!о»тому мы избегали расширений, которые могут существенно увеличить время, необходимое для переноса, или предъявить повышенные требования к ресурсам, нужным компилятору С++.
Этот идеал эволюции языка противостоит внешне благовидным предложениям сделать программирование болев удобным: 'ьз за счет потери эффективности или струюурирояанности; О для новичков — за счет потери единого стиля; ьз в конкретных предметных областях путем добавления в язык специализированных возможностей; ьз путем добавления возможностей, облегчающих интеграцию с конкретной средой программирования». В версии 2.0 было много улучшений, но ничего радикально нового.
В то время я, случалось, объяснял, что «все возможности 2.0, включая множественное наследование, — просто снятие ограничений, которые стали нас слишком сильно стеснять». Это одновременно и преувеличение, и сдержанный отпор общей тенденции придавать излишне большое значение каждой новой возможности. С точки зрения проектирования языка, самым важным аспектом версии 2.0 было то, что улучшилась интеграция отдельных особенностей языка С в структуру языка. Думаю, что для пользователя самыми важными аспектами новой версии были более стабильный компилятор и усовершенствованная техническая поддержка.
5.2.у. Обзор возможностей Основные возможности версии 2.0 были впервые представлены в статье [8ггопзггпр, 1987с) и подытожены в пересмотренном варианте этой статьи [Бггопзггцр, 1989Ь), которая вошла в состав документации по 2.0: 1. Множественное наследование (см. раздел 12.1). 2. Безопасное связывание (см, раздел 11.3). 3. Улучшенное разрешение имен перегруженных функций (см. раздел 11.2). Хронология 1985-1993 гг.
ПИИИИИИИ 4. Рекурсивное определение присваивания и инициализации (см. раздел 11АА). 5. Улучшенные средства пользовательского управления памятью (см. разделы 10.2 и 10.4). 6. Абстрактные классы (см. раздел 13.2). 7. Статические функции-члены (см. раздел 13.4). 8. Константные функции-члены (см. раздел 13.3). 9. Зашишенные члены с квалификатором ргосессес1 (впервые появились в версии 1.2, см. раздел 13.9).
10. Обобшенные инициализаторы (см, раздел 3.11А). 11. Инициализаторы членов базовых классов (см. раздел 12.9). 12. Перегрузка оператора -> (см. раздел 11.5.4). 13. Указатели на члены (впервые появились в версии 1.2, см. раздел 13.11). Большая часть этих расширений и улучшений отражала опыт эксплуатации С++ и не могла быть добавлена раньше. Естественно, для интеграции средств пришлось много поработать, и очень печально, что этой работе был отдан больший приоритет, чем завершению построения языка в соответствии с описанием, данным в статье «ЖЬаг)эу» (см. раздел 3.15).
В основном все указанные возможности так или иначе способствовали большей безопасности языка. В Сггопг 2.0 проверялась согласованность типов функций через границы единиц трансляции (типобезопасная компоновка), правила разрешения перегрузки не зависели от порядка и больше вызовов, чем раньше, признавались неоднозначными. Определение понятия константности (сопзс) стало более полным, указатели на члены»закрыли дыру» в системе контроля типов. Были введены операции явного распределения и освобождения памяти на уровне класса, что сделало ненужной технику чприсваивания указателю с1тйэ» (см.
раздел 3.9). Из вышеупомянутых возможностей 1, 3, 4, 5, 9, 10, 11, 12 и 13 уже использовались в Ве!1 1.аЪэ во время моей презентации на конференции 115ЕЪ)1Х в 1987 г. (см. раздел 7.1.2). 5.3. Аннотированное справочное руководство Приблизительно к 1988 г. стало очевидным, что С++ будет стандартизован [51гоцзегпр, 19891 К этому моменту уже появилось несколько независимых реализаций. Настало время составить более точное и полное описание языка. Кроме того, следовало сделать С++ широко доступным. Поначалу о формальной стандартизации никто не думал. Многие из тех, кто непосредственно участвовал в разработке С++, считали, что заниматься стандартизацией до накопления достаточного опыта работы с языком неразумно.
Однако в одиночку написать улучшенное справочное руководство я бы не смог. Необходимы были мнения и отклики пользователей. Поэтому я решил переписать справочное руководство по С++ и распространить его черновой вариант среди наиболее авторитетных и опытных пользователей во всем мире. Примерно в то же время НБЪ вЂ” подразделение АТ4 Т, которое занималось коммерческими продажами С++, — пожелало иметь новое, улучшенное справочное Аннотированное справочное руководство ЯфффффЯЩЩ руководство и поручило написать его одной из своих сотрудниц — Маргарет Эллис (Магяагег Е1! !з).
В этой связи вполне естественным казалось объединить усилия, совместно выпустить руководство и передать его внешним рецензентам. Мне также представлялось очевидным, что публикация такого труда с некоторой дополнительной информацией будет способствовать принятию нового определения и широкому распространению С++ в целом. Вот так появилась книга «ТЬе Аппогагег[ С++ Ке[егепсе Маона]» [АКМ] — «Аннотированное справочное руководство по С++».
Вот несколько строк из нее: «...чтобы заложить твердые основы дпя дальнейшей эволюции С++... [и] стать отправной точкой для его формальной стандартизации... собственно справочное руководство по Се+ н является полным определением языка, но сжатый стиль такого рода документов оставляет многие вопросы без ответа. Обсуждение того, что нв входит в язык, почему те или нные средства определены именно так, а не иначе, и как можно было бы реализовать различныв возможности, остается за ромками справочного руководства, но тем не менее представляет интерес для большинства пользователей. Такив замечания приводятся в аннотациях и комментариях.
Комментарии также помогут читателю разобраться во взаимосвязях между разными частями языка. В них подчеркнуты те моменты и последствия, на которые можно было бы нв обратить внимания при чтении самого руководства. Примеры и сравнения с языком Сделают книгу более легкой для чтения, чем сухое справочное описание». После ряда мелких стычек с людьми, отвечавшими за выпуск книги, было решено, что мы включим в АКМ (так в обиходе называлась «ТЬе Аппогатег] С++ Ке[егепсе Мапца1») полное определение С+«, с шаблонами и обработкой исключений, а не только определение подмножества, реализованного в последней версии АТбгТ. Тем самым постулировалось, что язык как таковой отличается от любой его конкретной реализации.
Об этом заложенном с самого начала принципе приходилось часто напоминать, поскольку пользователи, разработчики компиляторов и продавцы никак не могли его запомнить. На само справочное руководство были получены рецензии примерно от ста человек из двух десятков организаций. Имена большинства из них указаны в разделе благодарностей АКМ. Кроме того, многие внесли свой вклад в содержание АКМ. Особо хочу отметить помощь Брайана Кернигана, Эндрю Кенига и Дуга Макилроя.
Часть АКМ, составляющая собственно справочное руководство, была принята за основу стандарта АХБ! С++ в марте 1990 г. В АКМ не рассказывается о приемах, поддерживаемых языковыми средствами: «эта книга не ставит себе целью научить программированию на С++; в ней объясняется, что такое язык, а не как им пользоваться [АКМ]». Рассказ об использовании С++ был отложен до выхода второго издания книги «Язык программирования С++» [2пг]]. К сожалению, некоторые проигнорировали это предупреждение.
В результате С++ часто воспринимают как набор непонятных и не связанных между собой деталей, а потому и не могут написать на нем красивой и легкой для сопровождения программы (см. раздел 7.2). 5.3Л. Обзор АНМ В АКМ представлены некоторые не очень существенные возможности, которые были реализованы только в версии 2.1 от АТбгТ и в более поздних компиляторах других производителей.
Самая очевидная возможность — вложенные классы. ПИИИИИИИИ Хронология 1985 — 1ЯЯЗ гг. Все описанные в АВМ возможности, кроме исключений, получили широкое распространение вместе с версией С(гоп1 3.0 в октябре 1991 г. Полная реализация возможностей„упомянутых в АКМ, впервые появилась в компиляторах фирм 1)ЕС и 1ВМ в начале 1992 г.