Б. Страуструп - Язык программирования С++ (1119446), страница 7
Текст из файла (страница 7)
Особенно следуетупомянуть Тома Карджила, Джима Копли, Стью Фельдмана, Сэнди Фрэзера, Стива Джонсона, БрайанаКернигана, Барта Локанти, Дага Макилроя, Дэнниса Ритчи, Лэрри Рослера, Джерри Шварца и ДжонаШапиро, которые внесли важные для развития языка идеи. Дэйв Пресотто реализовал текущую версиюбиблиотеки потокового ввода/вывода.Свой вклад в развитие С++ и создание транслятора внесли сотни людей, которые присылали мнепредложения по совершенствованию языка, описания трудностей, с которыми они сталкивались, иошибки транслятора.
Здесь я могу упомянуть лишь некоторых из них: Гари Бишопа, Эндрю Хьюма,Тома Карцеса, Виктора Миленковича, Роба Мюррэя, Леони Росс, Брайана Шмальта и Гарри Уокера.Многие участвовали в подготовке книги к изданию, особенно Джон Бентли, Лаура Ивс, Брайан Керниган,Тэд Ковальски, Стив Махани, Джон Шапиро и участники семинара по языку С++, который проводилсяфирмой Bell Labs в Колумбии, Огайо, 26-27 июня 1985 г.Мюррей-Хилл, шт.Нью-ДжерсиБьерн Страуструп11Бьерн Страуструп.Язык программирования С++ПРЕДВАРИТЕЛЬНЫЕ ЗАМЕЧАНИЯ"О многом - молвил Морж,- пришла пора поговорить ".Л.
КэрроллДанная глава содержит краткий обзор книги, список литературы и некоторые дополнительныезамечания о языке С++. Замечания касаются истории создания С++, идей, которые оказалисущественное влияние на разработку языка, и некоторых мыслей по поводу программирования на С++.Эта глава не является введением; приведенные замечания не являются необходимыми для пониманияпоследующих глав.
Некоторые из них предполагают знакомство читателя с С++.Структура книгиКнига состоит из трех частей. Главы с 1 по 10 являются учебником по языку. В главах с 11 по 13обсуждаются вопросы проектирования и развития программного обеспечения с учетом возможностейС++. В конце книги приведено полное справочное руководство по языку. Исчерпывающее описаниеконструкций С++ содержится только там. Учебная часть книги содержит примеры, советы,предостережения и упражнения, для которых не нашлось места в руководстве.Книга в основном посвящена вопросу, как с помощью языка C++ структурировать программу, а невопросу, как записать на нем алгоритм. Следовательно, там, где можно было выбирать, предпочтениеотдавалось не профессиональным, но сложным для понимания, а тривиальным алгоритмам.
Так водном из примеров используется пузырьковая сортировка, хотя алгоритм быстрой сортировки большеподходит для настоящей программы. Часто написать ту же программу, но с более эффективнымалгоритмом, предлагается в виде упражнения.Глава 1 содержит краткий обзор основных концепций и конструкций С++. Она позволяет познакомитьсяс языком в общих чертах. Подробные объяснения конструкций языка и способов их применениясодержатся в последующих главах. Обсуждаются в первую очередь средства, обеспечивающиеабстракцию данных и объектно-ориентированное программирование. Основные средства процедурногопрограммирования упоминаются кратко.В главах 2, 3 и 4 описываются средства С++, которые не используются для определения новых типов:основные типы, выражения и структуры управления. Другими словами, эти главы содержат описаниетой части языка, которая по сути представляет С. Изложение в указанных главах идет в углубленномвиде.Главы 5 - 8 посвящены средствам построения новых типов, которые не имеют аналогов в С.
В главе 5вводится основное понятие - класс. В ней показано, как можно определять пользовательские типы(классы), инициализировать их, обращаться к ним, и, наконец, как уничтожать их. Глава 6 посвященапонятию производных классов, которое позволяет строить из простых классов более сложные. Оно даеттакже возможность эффективной и безопасной (в смысле типа) работы в тех ситуациях, когда типыобъектов на стадии трансляции неизвестны. В главе 7 объясняется, как можно определить унарные ибинарные операции для пользовательских типов, как задавать преобразования таких типов, и какимобразом можно создавать, копировать и удалять объекты, представляющие пользовательские типы.Глава 8 посвящена шаблонам типа, т.е.
такому средству С++, которое позволяет определить семействотипов и функций.В главе 9 обсуждается обработка особых ситуаций, рассматриваются возможные реакции на ошибки иметоды построения устойчивых к ошибкам систем. В главе 10 определяются классы ostream и istream,предоставляемые стандартной библиотекой для потокового ввода-вывода.Главы 11 - 13 посвящены вопросам, связанным с применением С++ для проектирования и реализациибольших программных систем. В главе 11 в основном рассматриваются вопросы проектирования иуправления программными проектами.
В главе 12 обсуждается взаимосвязь между языком С++ ипроблемами проектирования. В главе 13 показаны способы создания библиотек.Завершается книга справочным руководством по С++.Ссылки на различные части книги даются в виде $$2.3.4, что означает раздел 3.4 главы 2. Для12Бьерн Страуструп.Язык программирования С++обозначения справочного руководства применяется буква R, например, $$R.8.5.5.Замечания по реализацииСуществует несколько распространяемых независимых реализаций С++. Появилось большое числосервисных программ, библиотек и интегрированных систем программирования. Имеется масса книг,руководств, журналов, статей, сообщений по электронной почте, технических бюллетеней, отчетов оконференциях и курсов, из которых можно получить все необходимые сведения о последнихизменениях в С++, его использовании, сервисных программах, библиотеках, новых трансляторах и т.д.Если вы серьезно рассчитываете на С++, стоит получить доступ хотя бы к двум источникаминформации, поскольку у каждого источника может быть своя позиция.Большинство программных фрагментов, приведенных в книге, взяты непосредственно из текстовпрограмм, которые были транслированы на машине DEC VAX 11/8550 под управлением 10-й версиисистемы UNIX [25].
Использовался транслятор, являющийся прямым потомком транслятора С++,созданного автором. Здесь описывается "чистый С++", т.е. не используются никакие зависящие отреализации расширения. Следовательно, примеры должны идти при любой реализации языка. Однако,шаблоны типа и обработка особых ситуаций относятся к самым последним расширениям языка, ивозможно, что ваш транслятор их не содержит.УпражненияУпражнения даются в конце каждой главы.
Чаще всего они предлагают написать программу. Решениемможет считаться программа, которая транслируется и правильно работает хотя бы на несколькихтестах. Упражнения могут значительно различаться по сложности, поэтому дается приблизительнаяоценка степени их сложности. Рост сложности экспоненциальный, так что, если на упражнение (*1) у васуйдет пять минут, то (*2) может занять час, а (*3) - целый день. Однако время написания и отладкипрограммы больше зависит от опыта читателя, чем от самого упражнения. На упражнение (*1) можетпотребоваться целый день, если перед запуском программы читателю придется ознакомиться с новойвычислительной системой.
С другой стороны, тот, у кого под рукой окажется нужный набор программ,может сделать упражнение (*5) за один час.Любую книгу по программированию на языке С можно использовать как источник дополнительныхупражнений при изучении глав 2 - 4. В книге Ахо ([1]) приведено много общих структур данных иалгоритмов в терминах абстрактных типов данных. Эту книгу также можно использовать как источникупражнений при изучении глав 5 - 8. Однако, использованному в ней языку не достает функций-членов ипроизводных классов. Поэтому определяемые пользователем типы на С++ можно написать болееэлегантно.Замечания по проекту языкаПри разработке языка С++ одним из важнейших критериев выбора была простота.
Когда возникалвопрос, что упростить: руководство по языку и другую документацию или транслятор, - то выбор делалив пользу первого. Огромное значение придавалось совместимости с языком С, что помешало удалитьего синтаксис.В С++ нет типов данных и элементарных операций высокого уровня. Например, не существует типаматрица с операцией обращения или типа строка с операцией конкатенации. Если пользователюпонадобятся подобные типы, он может определить их в самом языке. Программирование на С++ посути сводится к определению универсальных или зависящих от области приложения типов.
Хорошопродуманный пользовательский тип отличается от встроенного типа только способом определения, ноне способом применения.Из языка исключались возможности, которые могут привести к накладным расходам памяти иливремени выполнения, даже если они непосредственно не используются в программе.
Например, былоотвергнуто предложение хранить в каждом объекте некоторую служебную информацию. Еслипользователь описал структуру, содержащую две величины, занимающие по 16 разрядов, тогарантируется, что она поместится в 32-х разрядный регистр.13Бьерн Страуструп.Язык программирования С++Язык С++ проектировался для использования в довольно традиционной среде, а именно: в системепрограммирования С операционной системы UNIX. Но есть вполне обоснованные доводы в пользуиспользования С++ в более богатой программной среде. Такие возможности, как динамическаязагрузка, развитые системы трансляции и базы данных для хранения определений типов, можноуспешно использовать без ущерба для языка.Типы С++ и механизмы упрятывания данных рассчитаны на определенный синтаксический анализ,проводимый транслятором для обнаружения случайной порчи данных. Они не обеспечиваютсекретности данных и защиты от умышленного нарушения правил доступа к ним.
Однако, эти средстваможно свободно использовать, не боясь накладных расходов памяти и времени выполненияпрограммы. Учтено, что конструкция языка активно используется тогда, когда она не только изящнозаписывается на нем, но и вполне по средствам обычным программам.Историческая справкаБезусловно С++ многим обязан языку С [8], который сохраняется как его подмножество. Сохранены ивсе свойственные С средства низкого уровня, предназначенные для решения самых насущных задачсистемного программирования.
С, в свою очередь, многим обязан своему предшественнику языку BCPL[13]. Комментарий языка BCPL был восстановлен в С++. Если читатель знаком с языком BCPL, томожет заметить, что в С++ по-прежнему нет блока VALOF. Еще одним источником вдохновения былязык SIMULA-67 [2,3]; именно из него была заимствована концепция классов (вместе c производнымиклассами и виртуальными функциями). Оператор inspect из SIMULA-67 намеренно не был включен вС++. Причина – желание способствовать модульности за счет использования виртуальных функций.Возможность в С++ перегрузки операций и свобода размещения описаний всюду, где можетвстречаться оператор, напоминают язык Алгол-68 [24].С момента выхода в свет первого издания этой книги язык С++ подвергся существенным изменениям иуточнениям.
В основном это касается разрешения неоднозначности при перегрузке, связывании иуправлении памятью. Вместе с тем, были внесены незначительные изменения с целью увеличитьсовместимость с языком С. Были также введены некоторые обобщения и существенные расширения,как то: множественное наследование, функции-члены со спецификациями static и const, защищенныечлены (protected), шаблоны типа и обработка особых ситуаций. Все эти расширения и доработки былинацелены на то, чтобы С++ стал языком, на котором можно создавать и использовать библиотеки. Всеизменения описываются в [10,18,20,21 и 23].Шаблоны типов появились частично из-за желания формализовать макросредства, а частично былиинспирированы описанием генерических объектов в языке Ада (с учетом их достоинств и недостатков) ипараметризированными модулями языка CLU.
Механизм обработки особых ситуаций появился отчастипод влиянием языков Ада и CLU [11], а отчасти под влиянием ML [26]. Другие расширения, введенныеза период между 1985 и 1991 г.г. (такие как множественное наследование, статические функции-членыи чистые виртуальные функции), скорее появились в результате обобщения опыта программированияна С++, чем были почерпнуты из других языков.Более ранние версии языка, получившие название "С с классами" [16], использовались, начиная с 1980г. Этот язык возник потому, что автору потребовалось написать программы моделирования,управляемые прерываниями.