Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791), страница 11
Текст из файла (страница 11)
Но по мере увеличения программы сложности, связанные с ее разработкой и поддержкой, смещаются от чисто языковых в сторону более глобальных проблем инструментальных средств и управления. В части! Ч обсуждаются такого рода вопросы. Книга акцентирует внимание иа методах создания программ общего назначения, полезных типов, библиотек и т.
д, Эти методы будут полезны как программистам, пишугцим небольшие программы, так и создателям больших приложений. Более того, так как все нетривиальные программы состоят из множества почти независимых частей, метолы написания таких частей будут интересны всем программистам. Вы можете заподозрить, что спецификация программы посредством использования более детализированной структуры типов ведет к увеличению размеров исходных текстов.
В С++ зто не так. Программа на С++, в которой объявлены типы аргументов функций, используются классы и т. д., обычно слегка меныпе, чем эквивалентная программа на С, не применяющая эти средства. Если же используются библиотеки, программа на С++ окажется намного короче эквивалента на С вЂ” разумеется в предположении, что работающий эквивалент ца С вообще может быть создан.
1.3.2. ФилосоФские замечания Язык программирования служит двум взаимосвязанным целям: он предоставляет программисту инструмент лля описания подлежащих выполнению действий и набор концепций, которыми оперирует программист, обдумывая, что можно сделать. Первая цель в идеале требует языка, близкого к компьютеру, чтобы все важные элементы компьютера управлялись просто и эффективно способом, достаточно очевидным лля программиста.
Язык С создавался, отталкиваясь именно от этой идеи. Вторая цель в идеале требует языка, близкого к решаемой задаче, чтобы концепции решения могли быть выражены понятно и непосредственно. Эта идея привела к пополнению С свойствами, превратившими его в С+аз Связь между языком, на котором лгы думаем (пишем программы), и задачами (решениями), которые мы можем себе представить, очень тесная. По этой причине огра- 45 1,4. Исторические замечания ничение возможностей языка с целью предотвращения программистских ошибок в лучшем случае опасно. Также как и в случае с естественными языками, огромную пользу приносит знание по крайней мере двух языков. Язык предоставляет программисту набор концептуальных средств.
Если эти средства не адекватны поставленной задаче, они просто игнорируются. Качественное проектирование и отсутствие ошибок не могут быть гарантированы просто присутствием или отсутствием специфических возможностей в языке. Использование типов особенно полезно в нетривиальных задачах. Понятие класса в С-ь+ на практике оказалось мощным концептуальным инструментом. 1.4. Исторические замечания Я придумал С++, записал его первоначальное определение и выполнил первую реализацию. Я выбрал и сформулировад критерии проектирования С++, разработал его основныс возможности и отвечал за сульбу предложений по расширению языка в комитете по стандартизации С++.
Очевидно. что Съ+ многим обязан С [Кегп]ЯЬап, 1978]. Язык С остается подмножеством Сэ + (но в С++ устранены несколько серьезных брс|пей системы типов С; подробнее см. в приложении Б). Я также сохранил средства С, которые являются достаточно низкоуровневыми, чтобы справляться с самыми критичными системными задачами. Язык С, в свою очередь, мпогиьч обязан своему предшественнику, ВСР1. [К1сЬагсЬ, 1980]; кстати, стиль комментариев // был взят в С++ из ВСРЕ. Другим основным источником влохновения был язык 51пш1а67 [РаЬЬ 1970], [РаЬ1, 1972].
Концепция классов (с производными классами и виртуальными функциями) была позаимствовшга из него. Средства перегрузки операторов и возможность помещения объявлений в любом месте, где может быть записана инструкция, напоминает Л]8о]68 [Ъ'оог]чгагй, 1974]. Со времени первого издания этой книги язык интенсивно пересматривался и обновлялся. Вот области, наиболее подвергшиеся изменениям: разрешение перегрузки, компоновка и средства управления памятью.
Кроме того, для улучшения совместимости с С внесено несколько менее значительных изменений. Добавлено несколько обобщений и важных расширений: множественное наследование, статические функции-члены, константные функции-члены, защищенные члены класса, шаблоны, обработка исключений, определение типа во время выполнения, пространства имен. Обшей целью этих изменений и расширений было улучшение средств языка для написания и использования библиотек.
Развитие С++ описано в [81гопзтгпр, 1994]. Шаблоны изначально разрабатывались для реализации контейнеров со статически определенными типами (такими как списки, вектора и ассоциативные массивы) и поддержки элегантного и эффективного использования таких контейнеров (обобщенное программирование). Ключевой целью было сокращение использования макросов и явных преобразований типов.
Идея шаблонов была частично вдохновлена механизмом наследования в языке Лоа (как его достоинствами, так и недостаткал1п) и параметризованными модулями в С]ш Лналогнчно, механизм обработки исключений возник на основе Лг]а [1сЬЬ]ап, 1979], С1п [Ь1з]гоу, 1979] и МЕ [ЪЪ'1Ыгош, 1987] Другие нововведения периода с 1985 по 1995 год, такие как мпоэкествениое наследование, чисто виртуальные функции и пространства имен, являются скорее обобщениями, сделанными на основе опыта использования С++, чем идеями, взятыми из других языков. Глава ц Обращение к читателю 46 Более ранние версии языка, широко известные под названием «С с классами. [81гопзьгпр, 1994[, появлялись с 1980 года.
Изначалъно язык был изобрстен, потому что я хотсл писать управляемые событиями моделирующие программы, для катар>лх 8[пш1а67 была бы идеальным средством, если бы не требования эффективности. «С с классамп» тщательно тестировался на проектах, требовавших минимального объема памяти и времени выполнения. В нем отсутствовали перегрузка операторов, ссылки, виртуальныс функции, шаблоны, исключения и многое другое. Впервые С++ был использован впе исследовательской организации в июле 1983 года. Название «Сч ч-» (произносится «си плюс-плюс»' ) было придумано 1'иком Мас- ' китти (Кгс!с Малс)гй) летом 1983 года.
Имя отражает природу изменений в языке по сравнению с С. «+м» вЂ” это оператор инкремента в С. Чуть более короткое пмя «С«> является синтаксической ошибкой и, кроме то> о, оно уже использовалось в качестве названия друго~о языка. Знатоки семантики С считают, что С++ предпочтительней ++С. Язык нс назван Р («Ди>), потому что является расширением С и нс пытается устранять проблем>ы путем удаления элементов С. Другие интерпретации названия С-и- можно найти в приложении к [Ог>чеИ, 1949[. Первоначальная цель создания С+«состояла в том, чтобы избавить автора и его 'друзей от программирования на ассемблере, С или других современных языках высокого уровня. Главной целью было облегчение программирования и превращение его в более приятное занятие. С++ никогда не проектировался на бумаге: проектирование, документирование н реализация шли парю1лельно.
Не существовало «Сль проекта» или «комитета по С++ . С+«развивался с целью разрешения проблем, с которыми сталкнвалпсь пользователи, а также в результате моих разговоров с друзьями и коллегами. Позднее интенсивный рост С++ вызвал некоторые изменения, Около 1987 года стало очевидно, что нсизбсжно создание формального стандарта С ' +, и что нам необходимо начать готовить почву лля этих усилий [Зтгопзггпр, 19941.
Результатом явилось сознательное распшрение контактов мех<ду создателями компиляторов С++ н основными пользователямп посредством переписки, электронной почты, личных встреч на конференциях, посвященных С++, и в других местах. АТ4 Т Ве1! ЕаЬогагог1ез внесла значительный вклад в этот процесс, позволив мне, делиться предварительными версиями руководства по С++ с разработчиками компиляторов и пользователями. Значение этого вклада не следует недооценивать, потому что многие из этих людей работали в фирмах, являвшихся конкурентами АТс' Т.
Менее просвсп1енная компания могла бы создать серьезные проблемы, которые бы привели к фрагментации языка. Сотни отдельных лиц из десятков организаций прочли и высказали свое мнение по поводу того, что стало руководством по С++ и базовым докумснтом для стандарта АЫЗ! С+»з Их имена можно найти в ТЬе Аппогаге>1 С+ + 1>е[егепсе Мапиа1 (Справочное руководстве по языку С+ + с комментариями) [В[1)э, 1989].
В конце концов, в декабре 1989 года по инициативе Незя!егг-Рве[саге[ был создан комитет ХЗ) 16 при А)«81. В июне 1991 года усилия АН81(Американский Национальный Институт по Стандартизации) по стандартизации См+ стали частью деятельности 150 (Международная Организация по Стандартизации). С 1990 года эти два обьединенпых комитета по стандарту С++ стали основным форумом, содействовавшим развитию С+ +.
Я работал в этих комитетах с самого начала. В качестве ~лавы ' Можно произносить также «си алас плас» (на англпйский манер). — Примеч, рвд. 47 1.5. Использование С++ рабочей группы по расширениям языка я непосредственно отвечал за обработку предложений по изменениям в Сч+ и добавленгпо новых средств. Первоначальный проект стандарта был выпущен для публичного обсуждения в апреле 1995 года.
Международный стандарт 150 (150/1ЕС 14882) по С++ был принят в 1998 году. Техническое соглашение, устраняющее незначительные ошибки и противоречия, было введено в 2003 г. [С+-", 2003]. С++ развивался рука об руку с некоторыми из классов, описанными в этой книге. Например, я разработал классы комплексных чисел, векторов и стека и ввел перегрузку операторов. Те же усилия привели Джонатана Шопиро ([опагЬап 5Ьорйо) и меня к созданию классов строк и списков. Классы Джонатана для строк и списков были первыми активно использовавшимися библиотечными классами.
Класс строк в стандартной библиотеке С++ происходит от этих более ранних классов. Библиотека задач, описанная в [5тгоцзсгпр, 1987] и в 9 12.7[11], была частью первой в мире программы, наппса|пюй па «С с классами». Я написал ее и соответствующие классы для поддержки стиля программирования, прнсуьцего 5[па!а. Библиотека задач была пересмотрена и переписана в значительной степени Джонатаном! Попиро и до сих пор активно используется. Библиотека потоков, как она описана в первом издании этой книги, была разработана и реализована мной. Джерри Шварц (]еггу 5сЬзчагя) преобразовал ее в библиотеку потокового ввода/вывода (глава 21), использовав технику манипуляторов Эндрю Кснига и другие идеи, В дальнейшем библиотека потокового ввела/вывода обновлялась в процессе стандартизации.
Болыпая часть работы была проделана Джерри 1Пварцем, Натаном Майерсом ([з[агЬап Муегз) и Норихиро Кумагайи ([зог1Ь[го Кпшайа[). На развитие шаблонов оказали влияние реализации шаблонов оестог, шар, 11з1 и зог1, выполненные Эндрю Кенигом, Ллексом Степановым (Л!ех 5герапоч), мной и другими. В свою очередь, работа Ллекса Степанова о механизме обобщенного программирования с использованием шаблонов привела к контейнерам и некоторым алгоритмам стандартной библиотеки С++ (9 16гй главы 17, 18, 9 192). Библиотека па1аг ау для численных расчетов (глава 22) изначально была результатом работы Кента Баджа (Кепс Впг[йе).