Б. Страуструп - Дизайн и Эволюция C++. 2006 (1160775), страница 54
Текст из файла (страница 54)
С++, по нашему мнению, и ток уже достаточно велик и сложен. Кроме того, но нем написаны миллионы строк кодо, которые должны остаться работоспособными. Любые изменения будут проходить очень сложную процедуру согласования. Каждое добавление вызывает тревогу. Мы предпочитаем языковым расширениям специальные приемы программирования и библиотечные функции, где только это возможно. Многие группы программистов хотели бы, чтобы любимая ими конструкция или библиотечный класс стали частью языка. Однако включение средств, полезных той или иной части сообщество пользователей, превратило бы С«» в конгломерат не связанных между собой возможностейж И все же, что можно было бы добавить в С++ с учетом вышесказанного? Лично мне тех средств, которые описаны на страницах данной книги (включая и часть П, где говорится о шаблонах, исключениях, пространствах имев и идентификации типов во время исполн,ения), достаточно.
Я хотел бы включить необязательную сборку мусора, но отношу это, скорее, к качеству компилятора, а не к средствам языка. 9.2З. Основная недоработка языка По моему мнению, только одну недоработку можно было бы назвать величайшей ошибкой С++. Выпуск версии 1.0 и первого издания моей книги [5ггоцзтгвр, Перспективы развития языка С++ ИПИИИИИ$1 1986~ следовало отложить до окончания разработки более полной библиотеки, включающей такие фундаментальные классы, как одпосвязные и двусвязные списки, ассоциативные массивы, массивы с контролем выхода за границы и простые строки. Их отсутствие заставило всех «изобретать велосипед» и породило ненужное разнообразие базовых классов.
Пытаясь самостоятельно построить базовые классы, программисты вынуждены были сразу начать с «продвпнутых» возможностей, еще не освоив основы С++. Кроме того, много усилий было потрачено на разработку методов и инструментов по ходу работы с библиотеками, которые имели серьезный внутренний дефект — отсутствие шаблонов. В некотором смысле я бы мог избежать вышеназванной ошибки. В первоначальном плане книги значилось трп раздела, посвященных библиотеке: о потоковом вводе,'выводе, о контейнерных классах и о поддержке многозадачности.
Приблизительно я знзл, чего хочу, но, к сожалению, слишком устал и не мог реачизовать контейнерные классы, не имея в каком-то виде шаблонов. Идея «подделать» шаблоны с помощью препроцсссора или некоторой временной уловки в компиляторе нс пришла мне тогда в голову. 9.3. Всего лишь мост? Я создал С++ как мост, по которому люди могли бы перейти от традиционного программирования к абстракциям данных и объектно-ориентированному программированию. Есть ли у С++ будущее за этими рамками? Разве С++ — это всего лишь мост и ничего более? Будет ли зтот язык еще представлять интерес и иметь ценность, когда объектно-ориентированное программирование будет применяться повсеместно? И если ответ положителен, то можно ли что-нибудь сделать для тех пользователей С++, которым не важна совместимость с С, не причинив вред тем, для кого она еще, по крайней мере, десять лет будет необходима? Язык существует для того, чтобы помочь при решении задач.
Если язык с самого начала оказался удачным, то будет существовать, пока есть задачи, при решении которых он оказался полезным. И станет пользоваться успехом, если только в каком-то другом языке не будут предложены гораздо лучшие решения для тех же задач.
Позтому возникают следующие вопросы: м останутся ли актуальными задачи, которые помогает решать С»+? ы появятся ли существенно лучшие решения? л сможет ли С++ предложить хорошие решения новых задач? Я отвечаю на вопросы так: «многие останутся», «медленно» и «да». 9.3.1. Мост нужен надолго Пройдет еще достаточно времени, пока большинство пользователей преуспеет в использовании объектно-ориентировашюго программирования, проектирования и т.д. Роль С++ как моста и средства для гибридного проектирования и разработки не исчерпает себя в двадцатом столетии, а его значение как средства сопровождения и обновления старого кода будет актуально еще дольше.
Не стоит забывать, что даже переход от ассемблера к С осуществился не повсеместно. Точно так же и переход от С к С++ может занять длительное время. Всего лишь мост? ИИИИИИИИ Однако в этом и сильная сторона С+э, Тем, кому действительно нужен чистый С, С++ предоставляет все его возможности без потери эффективности.
Полдержка обоих стилей — как на переходный период, так и там, где стиль С действительно наиболее подходит, — одна из фундаментальных целей языка С++. 9.3.2. Если С++ — это ответ, то на какой вопрос? С++ — язык общего назначения или, по крайней мере, многоцелевой.
Отсюда следует, что для каждой конкретной ситуации можно построить язык или систему, которая бы отвечала требованиям данной ситуации лучше, чем С++. Однако сила С++ в том, что он дает достаточно хорошие ответы на многие вопросы, а не наилучший ответ на какой-то один вопрос. Например, С++, как и С, отлично подход»п для низкоуровневого системного программирования, и его производительность в этой области обычно вьцпе, чем у других языков высокого уровня. Однако для большинства машинных архитектур хороший программист па ассемблере смог бы написать код, несколько меньший по размерам и более быстрый, чем тот, который способен сгенерировать хороший кол»пилятор. С трудом представляю себе то приложение, для которого нельзя было бы построить специализированный язык, лучший, чем С++ или любой другой язык об»цего назначения.
Поэтому самое большее, на что может рассчитывать язык общего назначения, — «быть вторымл. Отметив данный факт, я все же остановлюсь на сильных сторонах С++: ш низкоуровневое системное программирование; :з высокоуровневое системное программирование; ю встроенные системы; ы численные и научные расчеты; ь» общее прикладное программирование. Некоторые из этих категорий пересекаются. Ни у одной нет общепринятого определения. Но С++ остается хорошил» выбором в каждой из этих областей.
Более того, любой язык, подходящий для всех этих категорий, очень напоминал бы С++ в плане предоставляемых базовых сервисов, хотя в синтаксическом или семантическом отношении мог бы быть друггим. Упомянуть»е области не исчерпывают всего разнообразия приложений, в которых успешно применялся С++, но именно опи являются ключевыми. 9.3.2.1. Низкоуровневое системное программирование Для низкоуровневого программирования С++ подходит лучше всех существующих языков. В нел» сильные стороны С сочетаются с возможностью простого абстрагирования данных с нулевыми издержками по быстродействию и нами~и, он удобен для создания больших программ.
Никакой новый язык в этой сфере не сможет оказаться настолько лучше С++, чтобы заменить его. Системное программирование, включая разработку низкоуровневых компонентов, всегда будет сильной стороной С++. В этой области он выступает как улучшенный С. Еще много лет единственным конкурентом С++ здесь будет оставаться С, и все же С++— более удачный выбор, поскольку он и есть С, только лучше. Я ожидаю, что низкоуровневое системное программирование будет постепенно утрачивать свою ПИИИИИИИ Перспективы развития языка С++ важность, но останется одной из основных областей применения С++. Поэтому надо быть очень осторожным, чтобы не «улучшить» язык или компиляторы С++ настолько, что он станет языком только высокого уровня.
9.3.2.2. Высокоуровневое системное программирование Размер и сложность традиционных систем растут очень быстро. В качестве примера можно привести ядра ОС, диспетчеры сетей, компиляторы, системы электронной почты, системы для фотоцабора, для манипуляций с изображениями и звуком, системы связи, пользовательские интерфейсы и системы баз данных. Следовательно, традиционный акцент на низкоуровневой эффективности смещается в сторону общей структуры системы. Эффективность по-прежнему остается важным аспектом, но становится вторичной, поскольку никому не нужна, если большую систему не удастся экономно построить и сопровождать. Имеющиеся в С++ средства абстрагирования данных и объектно-ориентированного программирования относятся именно к этой стороне вопроса. Шаблоны, пространства имен и исключения будут значить все больше и больше для программистов, работающих над такими приложениями.
Изолирование необходимых нарушений системы типов в низкоуровневых функциях, подсистемах и библиотеках будет становиться все более критичным. При использовании этой техники основной код приложения станет безопасным с точки зрения типов, а значит, более удобным для сопровождения. Я ожидаю, что значимость высокоуровневого системного программирования с годами возрастет, но тем не менее останется областью, где С++ имеет большие преимущества.
Для высокоуровневого системного программирования хорошо подходят и многие другие языки, например Аг!а9Х, ЕНе! и Мог!ц!а-3. Если не считать поддержки сборки мусора и параллельности, то они приблизительно эквивалентны С++ с точки зрения фундаментальных механизмов. Естественно, о качестве отдельных средств и глубине их интеграции в язык можно спорить бесконечно. Однако при наличии высококачественных реализаций каждый из этих языков может поддержать широкий круг приложений.
Определяющими при разработке станут проблемы, не относящиеся к техническим деталям языка: управляемость, приемы проектирования и обучение программистов. У С++ есть определенные конкурентные преимущества: эффективность, гибкость, доступность и наличие большого числа пользователей. Для некоторых крупных приложений автоматическая сборка мусора — это большое преимущество, для других — дополнительная сложность. Если в компиляторы С++ не будет включен необязательный сборщик мусора, то в определенных областях С++ займет невыгодные позиции, но я уверен, что такие компиляторы скоро появятся повсеместно.