straustrup2 (852740), страница 8
Текст из файла (страница 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г. Этот язык возник потому, что автору потребовалось написать программы моделирования,управляемые прерываниями.
Язык SIMULA-67 идеально подходит для этого, если не учитыватьэффективность. Язык "С с классами" использовался для больших задач моделирования. Строгойпроверке подверглись тогда возможности написания на нем программ, для которых критичны ресурсывремени и памяти. В этом языке недоставало перегрузки операций, ссылок, виртуальных функций имногих других возможностей.
Впервые С++ вышел за пределы исследовательской группы, в которойработал автор, в июле 1983 г., однако тогда многие возможности С++ еще не были разработаны.Название С++ (си плюс плюс) , было придумано Риком Маскитти летом 1983 г. Это название отражаетэволюционный характер изменений языка С. Обозначение ++ относится к операции наращивания С.Чуть более короткое имя С+ является синтаксической ошибкой. Кроме того, оно уже было использованокак название совсем другого языка. Знатоки семантики С находят, что С++ хуже, чем ++С.
Язык неполучил названия D, поскольку он является расширением С, и в нем не делается попыток решить какиелибо проблемы за счет отказа от возможностей С. Еще одну интересную интерпретацию названия С++можно найти в приложении к [12].Изначально С++ был задуман для того, чтобы автору и его друзьям не надо было программировать на14Бьерн Страуструп.Язык программирования С++ассемблере, С или других современных языках высокого уровня.
Основное его предназначение упростить и сделать более приятным процесс программирования для отдельного программиста. Донедавнего времени не было плана разработки С++ на бумаге. Проектирование, реализация идокументирование шли параллельно. Никогда не существовало "проекта С++" или "Комитета поразработке С++". Поэтому язык развивался и продолжает развиваться так, чтобы преодолеть всепроблемы, с которыми столкнулись пользователи. Толчками к развитию служат также и обсужденияавтором всех проблем с его друзьями и коллегами.В связи с лавинообразным процессом увеличения числа пользователей С++, пришлось сделатьследующие изменения. Примерно в 1987 г.
стало очевидно, что работа по стандартизации С++неизбежна и что следует незамедлительно приступить к созданию основы для нее [22]. В результатебыли предприняты целенаправленные действия, чтобы установить контакт между разработчиками С++и большинством пользователей.Применялась обычная и электронная почта, а также былонепосредственное общение на конференциях по С++ и других встречах.Фирма AT&T Bell Laboratories внесла основной вклад в эту работу, предоставив автору право изучатьверсии справочного руководства по языку вместе с упоминавшимися разработчиками ипользователями. Не следует недооценивать этот вклад, т.к.
многие из них работают в компаниях,которые можно считать конкурентами фирмы AT&T. Менее просвещенная компания могла бы простоничего не делать, и в результате появилось бы несколько несогласованных версий языка. Около стапредставителей из порядка 20 организаций изучали и комментировали то, что стало современнойверсией справочного руководства и исходными материалами для ANSI по стандартизации С++.
Ихимена можно найти в "Аннотированном справочном руководстве по языку С++" [4]. Справочноеруководство полностью вошло в настоящую книгу. Наконец, по инициативе фирмы Hewlett-Packard вдекабре 1989 г. в составе ANSI был образован комитет X3J16. Ожидается, что работы постандартизации С++ в ANSI (американский стандарт) станут составной частью работ по стандартизациисилами ISO (Международной организации по стандартизации).С++ развивался одновременно с развитием некоторых фундаментальных классов, представленных вданной книге. Например, автор разрабатывал классы complex, vector и stack, создавая одновременновозможность перегрузки операций. В результате этих же усилий и благодаря содействию Д.
Шапиропоявились строковые и списочные классы. Эти классы стали первыми библиотечными классами,которые начали активно использоваться. Библиотека task, описываемая в [19] и в упражнении 13 из$$6.8 стала частью самой первой программы, написанной на языке "С с классами". Эта программа ииспользуемые в ней классы были созданы для моделирования в стиле Симулы.
Библиотека task быласущественно переработана Д. Шапиро и продолжает активно использоваться до настоящего времени.Потоковая библиотека, как указывалось в первом издании книги, была разработана и примененаавтором. Д. Шварц преобразовал ее в потоковую библиотеку ввода-вывода ($$10), используя наряду сдругими приемами метод манипуляторов Э.Кенига ($$10.4.2).
Класс map ($$8.8) был предложенЭ.Кенигом. Он же создал класс Pool ($$13.10), чтобы использовать для библиотеки предложенныйавтором способ распределения памяти для классов ($$5.5.6). На создание остальных шаблоновповлияли шаблоны Vector, Map, Slist и sort, представленные в главе 8.Сравнение языков С++ и СВыбор С в качестве базового языка для С++ объясняется следующими его достоинствами:(1) универсальность, краткость и относительно низкий уровень;(2) адекватность большинству задач системного программирования;(3) он идет в любой системе и на любой машине;(4) полностью подходит для программной среды UNIX.В С существуют свои проблемы, но в языке, разрабатываемом "с нуля" они появились бы тоже, апроблемы С, по крайней мере, хорошо известны.
Более важно то, что ориентация на С позволилаиспользовать язык "С с классами" как полезный (хотя и не очень удобный) инструмент в течение первыхмесяцев раздумий о введении в С классов в стиле Симулы.С++ стал использоваться шире, но по мере роста его возможностей, выходящих за пределы С, вновь ивновь возникала проблема совместимости. Ясно, что отказавшись от части наследства С, можно15Бьерн Страуструп.Язык программирования С++избежать некоторых проблем (см., например, [15]). Это не было сделано по следующим причинам:(1) существуют миллионы строк программ на С, которые можно улучшить с помощью С++, нопри условии, что полной переписи их на язык С++ не потребуется;(2) существуют миллионы строк библиотечных функций и служебных программ на С, которыеможно было бы использовать в С++ при условиях совместимости обоих языков на стадиисвязывания и их большого синтаксического сходства;(3) существуют сотни тысяч программистов, знающих С; им достаточно овладеть только новымисредствами С++ и не надо изучать основ языка;(4) поскольку С и С++ будут использоваться одними и теми же людьми на одних и тех жесистемах многие годы, различия между языками должны быть либо минимальными, либомаксимальными, чтобы свести к минимуму количество ошибок и недоразумений.