Б. Страуструп - Язык программирования С++ (1119446), страница 8
Текст из файла (страница 8)
Язык 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) поскольку С и С++ будут использоваться одними и теми же людьми на одних и тех жесистемах многие годы, различия между языками должны быть либо минимальными, либомаксимальными, чтобы свести к минимуму количество ошибок и недоразумений.
Описание С++было переработано так, чтобы гарантировать, что любая допустимая в обоих языкахконструкция означала в них одно и то же.Язык С сам развивался в последние несколько лет, что отчасти было связано с разработкой С++ [14].Стандарт ANSI для С [27] содержит, например, синтаксис описания функций, позаимствованный изязыка "С с классами". Происходит взаимное заимствование, например, тип указателя void* былпридуман для ANSI С, а впервые реализован в С++. Как было обещано в первом издании этой книги,описание С++ было доработано, чтобы исключить неоправданные расхождения. Теперь С++ болеесовместим с языком С, чем это было вначале ($$R.18). В идеале С++ должен максимальноприближаться к ANSI C, но не более [9].
Стопроцентной совместимости никогда не было и не будет,поскольку это нарушит надежность типов и согласованность использования встроенных ипользовательских типов, а эти свойства всегда были одними из главных для С++.Для изучения С++ не обязательно знать С. Программирование на С способствует усвоению приемов идаже трюков, которые при программировании на С++ становятся просто ненужными. Например, явноепреобразование типа (приведение) , в С++ нужно гораздо реже, чем в С (см. "Замечания дляпрограммистов на С" ниже). Тем не менее, хорошие программы на языке С по сути являютсяпрограммами на С++. Например, все программы из классического описания С [8] являютсяпрограммами на С++.
В процессе изучения С++ будет полезен опыт работы с любым языком состатическими типами.Эффективность и структураРазвитие языка С++ происходило на базе языка С, и, за небольшим исключением, С был сохранен вкачестве подмножества C++. Базовый язык С был спроектирован таким образом, что имеется оченьтесная связь между типами, операциями, операторами и объектами, с которыми непосредственноработает машина, т.е. числами, символами и адресами.
За исключением операций new, delete и throw, атакже проверяемого блока, для выполнения операторов и выражений С++ не требуется скрытойдинамической аппаратной или программной поддержки.В С++ используется та же (или даже более эффективная) последовательность команд для вызовафункций и возврата из них, что и в С.