Бьерн Страуструп о первом компиляторе C++ и будущем языка


Интервью со Страуструпом

Общие сведения

В этом интервью, Бьерн Страуструп, создатель C++, говорит об объектно-ориентированной революции, особенностях реальной разработки программного обеспечения, непрерывном развитиии C и C++, и некоторых добавлениях к стандарту C++, которые он хотел бы увидеть.

Бьерн Страуструп — создатель C++, одного из наиболее широко используемых языков, поддерживающего объектно-ориентированное программирование. Он также автор таких книг как «Язык программирования C++» [Страуструп] и «Дизайн и эволюция C++» [Страуструп2000]. Страуструп, в настоящее время возглавляет отдел программирования иследовательской лаборатории AT&T в штате Нью-Джерси. Его научные интересы включают распределенные системы, операционные системы, моделирование, проектирование программного обеспечения и программирование.

LinuxWorld.com: Объектно-ориентированные языки известны с конца 1960-ых. Однако, объектно-ориентированная революция произошла спустя два десятилетия. Как Вы объясняете эту задержку и какие выводы мы можем сделать из этого?

Бьерн Страуструп: Часть причин в том, что что изменения в сознании и поведении людей всегда занимают гораздо больше времени, мы думаем. Другая причина в том, что некоторые люди имели (и имеють) необоснованные ожидания относительно «революций». В корне неверной является идея, что имеется только один правильный способ, чтобы решить любую проблему для любого пользователя. Я — великий фанатик объектно-ориентированного программирования, а также методов и принципов проектирования (разработки), опирающихся на использование алгоритмического языка Симула 67. Однако, эта техника не являетсяэффективной. Многое в программировании лучше сделать методами, которые не помещаются внутри узкой полоски методов, именуемых «объектно-ориентированными». И если Вы не выходите за границу «объектно-ориентированных» методов, чтобы остаться в рамках «хорошего программирования и проектирования», Вы получаете нечто, что является в основном бессмысленным. См. мою статью, «Почему C++ не только объектно-ориентированный язык программирования».

Другая причина состоит в том, что люди, связывали с понятиями «Истинная объектная ориентированность» или «Чистая объектная ориентированность» такое, что вело к огромным непроизводительным затратам даже при решении простых задач, если сравнить полученный код с кодом на C++ и C.

Вывод, который я сделал (в 1980 или около того), заключался в том, что универсальный язык программирования должен опираться на несколько парадигм и что каждая парадигма должна быть поддержана хорошо: с близкой к оптимальной пространственной и временной эффективностью. Подводя итог, я нахожу, что принятие новых идей было серьезно замедлено консерватизмом, опирающимся на мифы о сложности и непроизводительных затратах.

Другая проблема в том, что многие люди, включая программистов, педагогов, и администраторов, просто не понимают сложности процесса разработки программного обеспечения. Они мечтают о «серебряных пулях» и отклоняют эффективные идеи потому, что они не точны и нетривиальны, чтобы использоваться новичками. Это ведет к реальной работе, сделанной с использованим излишне старых языков, инструментальных средств, и методов, несмотря на то, что эти причуды ведут к непроизводительным затратам. Эта же недооценка проблем также ведет всякий раз к поиску новой «серебряной пули» что является сильным упрощением суровостей реальной разработки программного обеспечения. И если проект, построенный таким образом, приходится адаптировать к новым реальностям, то он становится уязвимым к критическим ошибкам. Это ведет к поиску следующей «серебряной пули».

Вернемся к полутехническому замечанию: я думаю, что любой язык, который стремится к господствующему положению во всех областях, должен обеспечить широкую основу для нескольких методов, включая объектно-ориентированное программирование (на основе иерархии классов) и обобщенное программирование (параметризированные типы и алгоритмы). В частности, необходимо обеспечить хорошие средства для создания программ из отдельных (независимых) частей (возможно, написанных на различных языках). Я также думаю, что для управления сложным процессом обработки ошибок необходимы исключения. Язык, в котором отсутствуют такие средства вынуждает его пользователей моделировать их (что ведет к дополнительным ошибкам и затратам).

LinuxWorld.com: Какие важные тенденции в программировании мы увидим в ближайшем будущем? Какова роль функционального программирования, программирования на основе правил, обобщенного программирования, и других парадигм в мире программирования завтрашнего дня? Может что-либо из них стать господствующей тенденцией или они — простые академические пустышки?

Бьерн Страуструп: я не являюсь хорошим предсказателем будущего, так что я не буду этим заниматься, вместо этого скажу, что обычно будущее в большей степени, чем мы думаем, является вчерашним днем. Заметьте, что КОБОЛ, ФОРТРАН, и C — все еще большие языки. Обобщенное программирование — реальность (господствующая тенденция).

Вы можете также видеть, как изящно и эффективно в стандартной библиотеке шаблонов (STL) замствована техника функционального программирования, используемая при этом в контексте C++. Программирование на основе правил (см. ссылку на ресурсы по R ++) имеет в своем активе список неудач и успехов, который не ведет к выводу о возможном господствующем положении. Это, конечно, печально, но я не хочу называть данную парадигму «академическим пустяком». Многие из идей, которые мы сегодня видим в отдельных языках, проявятся как господствующие тенденции, средства и методы, при внедрении в господствующий язык, типа C++. Будущее увидит много мультипарадигм программирования и различные многоязычные системы.

LinuxWorld.com: С утверждением C99 (нового стандарта C), C / C ++ совместимость кажется менее достижимой чем когда-либо прежде. Является ли совместимость вниз с C все еще одна из целей C++? Если так, то что было сделано, чтобы отвернуть от пропасти, встающей между двумя языками?

Бьерн Страуструп: C99 сосредоточен на распространении низкоуровневых средств C в области численного программирования. Он в своей основе игнорирует средства абстракции и цели общности, воплощенные в C++. Это делает совместимость более трудной, поскольку к C добавлены специфические средства там, где C++ реализует те же самые потребности программиста через библиотеки, используя универсальные средства языка. Например, в C99 используются массивы переменной длины вместо библиотечных векторов, применяемых в C++. Более скоординированное выделения ядра, общего для обеих языков помогло бы избежать этого раскола.

Мой идеал: остающиеся все еще общими части C++ и C99 можно соединить в единый когерентный язык. Я думаю, что такой язык мог бы объединить общие рациональные технические требования. Однако, я не уверен, что политически это будет сделано. Для запуска процесса, требуется слияние комитетов стандартов по C и C++. Невозможно иметь две различных группы людей, развивающих два языка параллельно. Каждый комитет притягивает людей, кто не могут используют идеалы большинства из другой группы, и которые ненавидят возможностей компромисса с этим большинством. В то время как каждый отдельный комитет способствует объединению своего сообщества, оба комитета обеспечивают расходимость языков и игнорирование неудобных предложений и мнений. Лично, я думаю, что комитеты должны выработать соглашение, чтобы соединиться, а затем и слиться, но прежде, чем появится новый стандарт ISO C++. Результатом были бы более хороший язык и намного более сильное сообщество.

LinuxWorld.com: Есть ли элементы или концепции в других языках, например Python или Ada95, которые Вы хотели бы видеть добавленными к C++? Вообще, нуждается ли C++ в любых дополнительных элементах или библиотеках?

Бьерн Страуструп: Я хотел бы видеть, что наступающее изменение стандарта C++ сосредотачивается на библиотеках. Работа над самим языком может быть ограничена коррекцией ошибок, созданием языка более однородным, обеспечением незначительных расширений для поддержки популярных парадигм, и обеспечении поддержки, необходимой для библиотек. Например, я полагаю, что параллелизм лучше всего поддерживать библиотекой и что такая библиотека может быть выполнена без больших расширений языка. Однако, такая библиотека могла бы нуждаться в некоторых дополнительных гарантиях, вписанных в стандарт. Кроме того, я был бы рад, увидеть слияние C и C++.

Рассмотрим «основные» средства языка, часто предлагаемые для внесения в C++:

  • Параллелизм: я хотел бы видет библиотеку, поддерживающуюпотоки и связанную с ней библиотеку поддерживающую параллелизм без разделения памяти.
  • Отражение: я хотел бы видеть поддержку через библиотеку определение интерфейса, расширяющего информацию о типе.
  • Сохраняемость: я хотел бы видеть некоторую поддержку в стандартной библиотеке, возможностей по включению расширенной информации о типе, но я, в настоящее время, не имею каких-либо конкретные предложений.
  • Хеш таблицы: Конечно, некоторый вариант популярного hash_map будет включен.
  • Ограничения для аргументов шаблона: Это может быть просто и изящно выражено в C++ и сейчас.
  • Обработчики (Assertions): Многие из наиболее полезных утверждений [способы проверки кода и обработки ошибок] могут быть выражены как шаблоны. Некоторые должны быть добавлен к стандартной библиотеке.
  • Разбор регулярных выражений (Regular expression matching): я бы хотел видеть в стандарте библиотеку с образцами, обеспечивающими разбор.
  • Сборка мусора: я бы хотел видеть, что стандарт C++ явно подтверждает, что это — допустимая методика реализации для C++, точно определяющая, что «потерянные указатели» могут игнорироваться и что случится при вызове деструкторов для собранного мусора. (См. секцию C 4.1 Языка программирования C++ для более детального ознакомления).
  • Графический интерфейс пользователя (GUI): было бы хорошо иметь стандартный GUI-каркас, но я не вижу, как такое может быть политически возможно.
  • Системные средсва, независимые от платформы (Platform-independent system facilities: я бы хотел видеть, что стандартна библиотека обеспечивает более широкий набор стандартных интерфейсов к общим системным ресурсам, например, каталогам и сокетам.

Заметьте, что эти расширения прежде всего являются дополнениями к стандартной библиотеке и могут быть реализованы без новых затрат во время выполнения программы или дополнительных требований к ресурсам. Таким образом, они могут быть добавлены без нарушения принципа «нулевого перекрытия». Между прочим, C++ — хороший язык для программирования аппаратного ядра встроенных систем и должен оставаться таковым. Также, все ресурсы должны быть правильно интегрированы с текущими стандартными библиотечными средствами, такими как строки и контейнеры.

Если бы не графические интерфейсы пользователя, я бы с оптимизмом утверждал, что все эти изменения стандарта могли бы быть сделаны без несоответствующей дискуссии до 2005 года. Конечно, это честолюбиво, но альтернативой честолюбивым целям является застой. Я думаю, что сообщество открытых кодов играет большую роль, чтобы участвовать в этом, потому что ни одна из этих библиотек не будет принята в стандарт, если мы не получим опыт на основе качественных реализаций, являющихся основой стандарта.

LinuxWorld.com: кажется, что C++ потерпел неудачу на одном важном фронте: защите языка. Много людей все еще по ошибке полагают, что C++ по существу медленнее чем C, а среда часто отказывается подтверждать, что C++, наиболее широко используемый универсальный язык программирования, фокусируясь вместо этого на других широко раздутых языках. Где мы шли не так, как надо и что может быть сделано, чтобы зафиксировать все, как надо?

Бьерн Страуструп: C++ не нуждался в эффективной защите, с самого начального момента: его сразу стали использовать миллионы программистов. Удивительно то, что это было достигнуто без специальной организации и использования каких-либо дополнительных ресурсов. Это, возможно, сделало сообщество C++ умиротворенным, что, определенно, приволо к уязвимости со стороны враждебной пропаганды. Я предполагаю, что реальная задача в том, что хороший код является невидимым, даже его пользователям. Рассмотрите программы на C++ типа Netscape и Internet Explorer. Корпорации, которые производят программное обеспечение для решения задач в реальном масштабе времени: управление передачей данных, автоматическое управление, и моделирование, не рекламируют языки, которыми они пользуются. К сожалению, имиджмейкерами программ и инструментальных средств являются продавцы и академики.

C++ никогда не имел поддержку большого производителя. Каждый большой производитель помещает (и всегда помещал) некоторый частный язык над C++. C++ никогда не использовал большого маркетинга, а там, где маркетинг был сделан, он обычно осуществлялся организациями, продающими кое-что еще (типа среды программирования). Это, кое-что, случилось, включало и C++. Кроме того, сообщество C++ страдает от самого успеха C++: Совершенно ясно «надо бить одиночку» и в сегодняшнем, сильно коммерциализированном мире, честная борьба — редкость.

Сообщество C++ никогда не имело четкого центра с финансированием, чтобы участвовать в популяризации C++. Кто агитирует за C++? И как эта агитация достигает программистов, педагогов, и администраторов? Уже на этой неделе, я слышал о профессоре, внушающем его студентам, что не имеется, однако, стандарта C++! Печально слышать такое спустя два года после утверждения стандарта, это — общее неправильное представление.

Так, что же сообщество C++ может сделать теперь? Достигнуты определенные успехи иизвестны успешные методы. Статьи и конференции — это возможные места встречи, но для наиболее занятых программистов, простое описание на Web страницах — более реалистическая возможность. Обеспечение высококачественного кода, открытие сайтов с исходными кодами — возможно наиболее действенный способ показать людям, что может делать C++ (текущие примеры — SGI, STL и Boost.org). Так или иначе, мы должны создать широко известную «портал» к информации, связанной с C++.

Коммерческие организации могли бы улучшить работу по преданию гласности их успехов в использовании C++, особенно, если он обеспечивает возможность сосредоточиться на частных аспектах их изделий. Разнообразные поставщики, стандартизированный характер — большая причина для многих пользователей выбрать C++.

C++ должен изучаться лучше, вместе со стандартной библиотекой и средствами абстракции, играющими центральную роль. Обучении C++ как расширения к C расточительно и запутанно. См. «Изучение Стандартного C++ как нового языка» в Ресурсах.

Комитет стандартов должен делать его работу, обеспечивая стандартные версии доступными для критики, но нестандартными, библиотеками. Это может быть сделано, но сделать это будет не просто.

Язык программирования С++ — Бьерн Страуструп.

Название: Язык программирования С++.

Автор: Бьерн Страуструп.

В данном издании Бьерн Страуструп излагает С++ в форме, еще более доступной для начинающих. В то же время в него включены такие сведения и методики, которые могут оказаться полезными даже для экспертов по С++.

Перед вами — специальное издание самой читаемой и содержащей наиболее достоверные сведения книга по С++. Книга содержит полное описание языка С++, его стандартной библиотеки (STL) и ключевых методов разработки программ. Основанная на стандарте ANSI/ISO, книга является источником самого последнего и полного описания всех возможностей языка С++, включая компоненты стандартной библиотеки, в том числе:

  • абстрактные классы в качестве интерфейсов;
  • иерархию классов при объектно-ориентированном программировании;
  • шаблоны как основу безопасного относительно типов обобщенного программирования;
  • обработку исключений, возникающих в результате типичных ошибок;
  • использование пространств имен (namespaces) для достижения модульности больших проектов
  • определение типа на этапе исполнения (RTTI) для слабо связанных систем;
  • подмножество С языка С++ для совместимости с С и работы на системном уровне;
  • стандартные контейнеры и алгоритмы;
  • стандартные строки, потоки ввода/вывода и числовые данные;
  • совместимость с С, локализацию (интернационализацию) и безопасность при обработке исключений.

Краткое оглавление
Предисловие автора к третьему русскому изданию .25
От редакции русского издания .27
Предисловие .29
Предисловие ко второму изданию.31
Предисловие к первому изданию .33
ВВЕДЕНИЕ.35
1. Обращение к читателю.37
2. Обзор C++.57
3. Обзор стандартной библиотеки.81
Часть I. Основные средства.105
4. Типы и объявления. 107
5. Указатели, массивы и структуры.127
6. Выражения и инструкции.147
7. Функции.185
8. Пространства имен и исключения.209
9. Исходные файлы и программы.241
Часть II. Механизмы абстракции.267
10. Классы.269
11. Перегрузка операторов.309
12. Производные классы.349
13. Шаблоны.377
14. Обработка исключений.407
15. Иерархии классов.443
Часть III. Стандартная библиотека.483
16. Организация библиотеки и контейнеры.485
17. Стандартные контейнеры.519
18. Алгоритмы и объекты-функции.569
19. Итераторы и распределители памяти.613
20. Строки.645
21. Потоки.671
22. Численные методы.725
Часть IV. Проектирование с использованием C++.757
23. Разработка и проектирование.759
24. Проектирование и программирование.797
25. Роли классов.841
Приложения и предметный указатель.869
Приложение А. Грамматика.871
Приложение Б. Совместимость.891
Приложение В. Технические подробности.903
Приложение Г. Локализация.947
Приложение Д. Безопасность исключений
и стандартная библиотека.1017
Предметный указатель.1055

Бесплатно скачать электронную книгу в удобном формате, смотреть и читать:
Скачать книгу Язык программирования С++ — Бьерн Страуструп. — fileskachat.com, быстрое и бесплатное скачивание.

Скачать djvu
Ниже можно купить эту книгу по лучшей цене со скидкой с доставкой по всей России. Купить эту книгу

К тридцатилетию первого C++ компилятора: ищем ошибки в Cfront

Cfront это компилятор для С++, существующий примерно с 1983 года и разработанный Бьёрном Страуструпом. В то время он был известен как «C с классами». Cfront имел полноценный парсер, таблицы символов, строил дерево для каждого класса, функции и т.д. Cfront был основан на CPre. Cfront определял развитие языка приблизительно до 1990г. Многие неясные моменты, имеющие место в С++, связаны с ограничениями реализации Cfront. Причина в том, что Cfront осуществлял трансляцию с C++ в C. Одним словом, Cfront — это священный артефакт для любого C++ программиста. И я просто не мог пройти мимо, не проверив этот проект.

Введение

На идею проверить Cfront меня натолкнула заметка, приуроченная к 30-летию первой Release версии этого компилятора: «30 YEARS OF C++». Мы связались с Бьёрном Страуструпом, чтобы заполучить исходные коды Cfront. Я почему-то думал, что достать их будет целая история. Оказалось, всё просто. Эти исходники лежат в открытом доступе по адресу https://www.softwarepreservation.org/projects/c_plus_plus/ и доступны всем желающим.

Для проверки была выбрана первая коммерческая версия Cfront, выпущенную в октябре 1985 года. Ведь именно ей исполнилось 30 лет.

Бьёрн предупредил нас, что с проверкой может оказаться не всё так просто:

Please remember this is *very* old software designed to run on a 1MB 1MHz machine and also used on original PCs (640KB). It was also done by one person (me) as only part of my full time job.

И действительно. Вот так просто взять и проверить проект оказалось невозможным. Например, в те времена для отделения имени класса от имени функции использовалось не четыре точки (::), а просто точка (.). Пример:

Анализатор PVS-Studio был к этому не готов. Пришлось подключить коллегу студента, который вручную прошелся по исходникам и поправил их. Это помогло, хотя и не до конца. Все равно во многих местах PVS-Studio выпучивает глаза и отказывается анализировать. Тем не менее, кое как нам удалось проверить проект.

Сразу скажу, что я не нашел чего-то грандиозного. Не нашлось серьезных багов, думаю по 3 причинам:

  • Проект имеет небольшой размер. Всего 100 KLOC в 143 файлах.
  • Код качественный.
  • Анализатор PVS-Studio все-таки далеко не всё смог проверить.

«Это все слова. Покажи мне код.» (c) Линус Торвальдс

Однако хватит слов. Наши читатели собрались здесь, чтобы увидеть хоть одну ошибку самого Страуструпа. Давайте смотреть код.

Предупреждение PVS-Studio: V595 The ‘cl’ pointer was utilized before it was verified against nullptr. Check lines: 927, 928. expr.c 927

Указатель ‘cl’ может быть равен NULL. Об этом свидетельствует проверка if (cl == 0). Беда в том, что ещё до этой проверки этот указатель разыменовывается. Это происходит в макросе PERM.

Т.е. если раскрыть макрос, то получаем:

То же самое. Разыменовали указатель, и только потом его проверили:

Предупреждение PVS-Studio: V595 The ‘b’ pointer was utilized before it was verified against nullptr. Check lines: 608, 615. norm.c 608

Предупреждение PVS-Studio: V563 It is possible that this ‘else’ branch must apply to the previous ‘if’ statement. error.c 164

Не знаю, есть здесь ошибка или нет, но код оформлен неправильно. ‘else’ относится к ближайшему ‘if’. Поэтому код работает не так, как выглядит. Если отформатировать его правильно, то получится:

Предупреждение PVS-Studio: V576 Incorrect format. A different number of actual arguments is expected while calling ‘fprintf’ function. Expected: 3. Present: 4. generic.c 8

Обратите внимание на format specifiers: «%s». Будет распечатана строка. А вот переменная ‘n’ осталась не при деле.

К сожалению (или к счастью), больше ничего похожего на настоящие ошибки я показать не могу. Анализатор выдал ряд предупреждений на код, который хотя и заслуживает внимание, но не является опасным. Например, анализатору не нравятся имена следующих глобальных переменных:

Предупреждение PVS-Studio: V707 Giving short names to global variables is considered to be bad practice. It is suggested to rename ‘Nn’ variable. cfront.h 50

Или, например, для распечатки значений указателей функцией fprintf() использует спецификатор «%i». В современной версии языка для этого служит «%p». Но как я понимаю, 30 лет назад никакого «%p» ещё не было, и код совершенно корректен.

Интересные наблюдения

Обратил внимание, что раньше с ‘this’ работали на порядок более смело и грубо. Пара примеров на эту тему:

Как видите, в те времена не считалось чем-то запретным, взять и поменять значение ‘this’. Сейчас запрещается не только менять указатель, но и даже потеряли смысл сравнения this с nullptr.

This is the place for paranoia


Как говорится, ни в чем нельзя быть уверенным. Понравился вот такой фрагмент кода, на который я натолкнулся:

Комментарий Бьёрна Страуструпа

  • Cfront был создан на основе Cpre, но при этом полностью переписан. От Cpre в коде Cfront не осталось ни строчки.
  • В ошибке use-before-test-of-0 (использование до проверки на 0), конечно, нет ничего хорошего, однако, что любопытно, конфигурация, на которой я преимущественно работал (машина DEC и ОС Research Unix), реализовали защиту от записи нулевой страницы (и здесь тоже), так что этот баг не смог бы сработать, не будучи обнаруженным.
  • С багом (если это действительно баг) с if-then-else вышло необычно. Я посмотрел исходный код: это не просто опечатка, а именно ошибка. Однако, что интересно, она никак не влияет на результат: будет лишь небольшая разница в сообщении об ошибке, которое выведется перед завершением. Неудивительно, что я ее не заметил.
  • Да, мне следовало использовать более удобочитаемые имена. Просто изначально я не рассчитывал на то, что программу в течение многих лет будут поддерживать другие люди (и еще я плохо печатаю).
  • Да, спецификаторов %p в те времена еще не было.
  • Да, правила для «this» поменялись.
  • В основном цикле компилятора использовался «параноидальный тест». Я исходил из соображений, что, случись что-то с ПО или железом, один из этих тестов будет провален. Как минимум однажды он выявил последствия одного бага в генераторе кода, который использовался для сборки Cfront. Я считаю, что все серьезные приложения должны использовать такой «параноидальный тест» для отлова «невозможных» ошибок.

Выводы

Значение Cfront сложно переоценить. Он оказал влияние на развитие целой отрасли программирования и подарил миру вечно живой и развивающийся язык C++. Выражаю Бьёрну благодарность за всю проделанную им работу в создании С++. Спасибо. Мне в свою очередь было приятно хотя бы «постоять рядом» с Cfront.

Спасибо всем читателям, и хочу пожелать поменьше багов.

Найдите ошибки в своем C, C++, C# и Java коде

Предлагаем попробовать проверить код вашего проекта с помощью анализатора кода PVS-Studio. Одна найденная в нём ошибка скажет вам о пользе методологии статического анализа кода больше, чем десяток статей.

Бьёрн Страуструп. Лучшие книги

ISBN: 978-5-7989-0425-9, 0-201-70073-5
Год издания: 2012
Издательство: Бином
Язык: Русский

Книга написана Бьерном Страуструпом — автором языка программирования С++ — и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре С++, так и современный объектно-ориентированный подход к созданию программных продуктов.

Книга адресована программистам, использующим в своей повседневной работе С++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».

Книга написана Бьерном Страуструпом — автором языка программирования С++ — и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно…

ISBN: 5-469-01217-4, 0-201-54330-3
Год издания: 2006
Издательство: Питер, ДМК пресс
Серия: Классика Computer Science
Язык: Русский

В книге, написанной создателем языка C++ Бьерном Страуструпом, представлено описание процесса проектирования и разработки языка программирования C++.

Здесь изложены цели, принципы и практические ограничения, наложившие отпечаток на структуру и облик C++, обсужден дизайн недавно добавленных в язык средств: шаблонов, исключений, идентификации типа во время исполнения и пространств имен. Автор анализирует решения, принятые в ходе работы над языком, и демонстрирует, как правильно применять «реальный объектно-ориентированный язык программирования».

Книга удобно организована, поучительна, написана с юмором. Описание ключевых идей даст начинающему пользователю ту основу, на которой позже он выстроит свое понимание всех деталей языка. Опытный программист найдет здесь обсуждение принципиальных вопросов проектирования, что позволит ему лучше понять язык, с которым он работает.

В книге, написанной создателем языка C++ Бьерном Страуструпом, представлено описание процесса проектирования и разработки языка программирования C++.

Мастер Йода рекомендует:  Интерфейсы в PHP контракты для классов

Здесь изложены цели,…

ISBN: 978-5-8459-1621-1
Год издания: 2010
Издательство: Вильямс
Язык: Русский

— Подготовка к созданию реальных программ.
Автор книги полагает, что читатели в конце концов начнут писать нетривиальные программы либо в качестве профессиональных разработчиков программного обеспечения, либо в качестве программистов, работающих в других областях науки и техники.

— Упор на основные концепции и методы.
Основные концепции и методы программирования в книге излагаются глубже, чем это принято в традиционных вводных курсах. Это позволит читателям разрабатывать полезные, правильные, понятные и эффективные программы.
— Программирование на современном языке. С++
Книга представляет собой введение в программирование вообще, включая объектно-ориентированное и обобщенное программирование. Она также представляет собой прекрасное введение в язык С++, один из наиболее популярных языков программирования в современном мире. В книге описаны современные методы программирования на С++, включая стандартную библиотеку, позволяющую упростить программирование.
— Для начинающих программистов и всех, кто хочет научиться программировать. Книга предназначена в основном для людей, никогда ранее не программировавших. Она опробована более чем тысячей студентов университета. Однако опытные программисты и студенты, уже изучившие основы программирования, также найдут в книге много полезной информации, которая позволит им перейти на более высокий уровень мастерства.
— Широкий охват тем.
Первая половина книги охватывает широкий спектр основных понятий, методов проектирования и программирования, свойств языка С++ и его библиотек. Это позволит читателям писать программы, выполняющие ввод и вывод данных, вычисления и построение простых графических изображений. Во второй половине рассматриваются более специализированные темы, такие как обработка текста и тестирование. В ней содержится много справочного материала. Исходные коды и другие приложения читатели могут найти на веб-сайте автора.

— Подготовка к созданию реальных программ.
Автор книги полагает, что читатели в конце концов начнут писать нетривиальные программы либо в качестве профессиональных…

ISBN: 978-0321958310
Год издания: 2013
Издательство: Addison-Wesley
ISBN: 5-256-00454-9
Год издания: 1991
Издательство: Радио и связь
Язык: Русский

Книга известного американского специалиста посвящена описанию разработанного им языка программирования СИ + +, представляющего собой результат дальнейшего развития языка программирования Си в направлении объектной ориентированности и включения в него механизмов контроля типов, абстракции данных и совмещения операций. Изложение материала построено на решении реальных задач и сопровождается большим числом номеров программ и их фрагментов.

Перевод с английского М. Г. Пиголкина, В. А. Яницкого
Для программистов

Книга известного американского специалиста посвящена описанию разработанного им языка программирования СИ + +, представляющего собой результат дальнейшего развития языка…

ISBN: 978-0321563842
Год издания: 2013
Издательство: Addison Wesley
Язык: Английский

C++11 has arrived: thoroughly master it, with the definitive new guide from C++ creator Bjarne Stroustrup, C++ Programming Language, Fourth Edition! The brand-new edition of the world’s most trusted and widely read guide to C++, it has been comprehensively updated for the long-awaited C++11 standard. Extensively rewritten to present the C++11 language, standard library, and key design techniques as an integrated whole, Stroustrup thoroughly addresses changes that make C++11 feel like a whole new language, offering definitive guidance for leveraging its improvements in performance, reliability, and clarity. C++ programmers around the world recognize Bjarne Stoustrup as the go-to expert for the absolutely authoritative and exceptionally useful information they need to write outstanding C++ programs. Now, as C++11 compilers arrive and development organizations migrate to the new standard, they know exactly where to turn once more: Stoustrup’s C++ Programming Language, Fourth Edition.

ISBN: 978-5-9518-0699-4
Год издания: 2020
Издательство: Бином. Лаборатория знаний
Язык: Русский

Предлагаемое компактное руководство — блестящий пример краткого и одновременно глубокого изложения языка C++ в современном стандарте С++11. Помимо языка, в таком же стиле излагаются основные средства стандартной библиотеки. Автор фокусируется на изложении центральных идей C++ и свойственных ему стилей программирования. Приводятся наглядные примеры, помогающие на лету схватить основную суть излагаемого материала.
При этом охват материала энциклопедический — от самых основ до новейших черт языка в стандарте С++11, включая перемещающую семантику, однородную инициализацию, лямбда-выражения, улучшенные контейнеры, API для случайных чисел, а также поддержку параллелизма. Обзор завершается обсуждением развития проекта C++ вплоть до стандарта C++11.
В своей новой книге Б.Страуструп в очередной раз продемонстрировал умение ответить на чаяния самых разных групп программистов и руководителей IT-департаментов — каждый сможет найти в данной книге ответы на собственные специфические вопросы. Настоящее краткое руководство никоим образом не заменяет фундаментальный труд автора — «Программирование на C++», 4-е издание (на русском языке выйдет в 2020 году), содержащий более 1300 страниц, а позволяет оперативно проникнуть в самую суть предмета, не обременяя себя работой с огромным фолиантом.

Предлагаемое компактное руководство — блестящий пример краткого и одновременно глубокого изложения языка C++ в современном стандарте С++11. Помимо языка, в таком же стиле…

ISBN: 978-5-8459-1949-6
Год издания: 2015
Издательство: Вильямс
Язык: Русский

Эта книга не является учебником по языку C++, это учебник по программированию. Несмотря на то что ее автор — автор языка С++, книга не посвящена этому языку программирования; он играет в книге сугубо иллюстративную роль. Автор задумал данную книгу как вводный курс по программированию. Поскольку теория без практики совершенно бессмысленна, такой учебник должен изобиловать примерами программных решений, и неудивительно, что автор языка C++ использовал в книге свое детище.
В книге в первую очередь описан широкий круг понятий и приемов программирования, необходимых для того, чтобы стать профессиональным программистом, и в гораздо меньшей степени — возможности языка программирования C++.

В первую очередь, книга адресована начинающим программистам и студентам компьютерных специальностей, которые найдут в ней много новой информации, и смогут узнать точку зрения создателя языка С++ на современные методы программирования.
Если вы решили стать программистом, и уже знакомы с азами C++ — эта книга для вас, в первую очередь потому, что программирование — это не только, и не столько знание инструмента (языка программирования C++), сколько понимание самого процесса. Автор недаром не ограничился своим первоклассным (но ни в коей мере не являющимся учебником для программистов без большого практического опыта) трудом Язык программирования C++.
Проводя грубую аналогию — виртуозное владение топором никого не делало настоящим плотником. Бьярне Страуструп в очередной раз приходит на помощь программистам — создав уникальный язык программирования, он не ограничивается им и рассказывает о том, как правильно им воспользоваться, даже не зная все его тонкости и возможности.
Основные темы книги:
— Подготовка к созданию реальных программ. Автор книги предполагает, что читатели в конце концов начнут писать нетривиальные программы либо в качестве профессиональных разработчиков программного обеспечения, либо в качестве программистов, работающих в других областях науки и техники.
— Упор на основные концепции и методы. Основные концепции и методы программирования в книге излагаются глубже, чем это принято в традиционных вводных курсах. Этот подход дает основательный фундамент для разработки полезных, правильных, понятных и эффективных программ.
— Программирование на современном языке С++ (C++11 и C++14). Книга представляет собой введение в программирование, включая объектно-ориентированное и обобщенное программирование. Одновременно она представляет собой введение в язык С++, один из широко применяющихся языков программирования в современном мире. В книге описаны современные методы программирования на С++, включая стандартную библиотеку и возможности C++11 и C++14, позволяющие упростить программирование.

— Для начинающих программистов и всех, кто хочет научиться программировать. Книга предназначена в основном для людей, никогда ранее не программировавших, и опробована на более чем тысяче студентов университета. Однако и опытные программисты, и студенты, уже изучившие основы программирования, найдут в книге много полезной информации, которая позволит им перейти на еще более высокий уровень мастерства.
— Широкий охват тем. Первая половина книги охватывает широкий спектр основных понятий, методов проектирования и программирования, свойств языка С++ и его библиотек. Это позволит читателям писать программы, выполняющие ввод и вывод данных, вычисления и построение простых графических изображений. Во второй половине рассматриваются более специализированные темы (такие как обработка текста, тестирование и язык C). В книге содержится много справочного материала. Исходные тексты программ и иные материалы читатели могут найти на веб-сайте автора.

Эта книга не является учебником по языку C++, это учебник по программированию. Несмотря на то что ее автор — автор языка С++, книга не посвящена этому языку программирования; он…

ISBN: 978-5-907144-12-5
Год издания: 2020
Издательство: Вильямс

В этой книге создатель языка C++ Бьярне Страуструп описывает, что собой представляет современный C++. Это краткое самодостаточное руководство охватывает основные функциональные возможности языка и основные компоненты стандартной библиотеки — пусть и не с полной глубиной изложения материала, однако на высоком профессиональном уровне. Книга включает множество конкретных примеров, которые облегчают изучение данного языка программирования.Страуструп представляет функциональные возможности C++ в контексте поддерживаемых ими стилей программирования, таких как объектно-ориентированное и обобщенное программирование. Его книга на удивление всеобъемлюща — она начинается с основ языка программирования C++ и постепенно переходит к таким сложным темам, как многие новые и уже устоявшиеся функциональные возможности C++17, включая семантику перемещения, однородную инициализацию, лямбда-выражения, усовершенствованные контейнеры, случайные числа и параллелизм. Сюда входят и некоторые расширения C++20, например концепты и модули. Заканчивается книга обсуждением дизайна и эволюции C++.Это руководство не ставит целью научить читателя программировать (для этого служит другая книга того же автора — Программирование. Принципы и практика с использованием C++. Второе издание). Не является она и исчерпывающим учебником, который приведет вас на вершины мастерства C++ (здесь можно порекомендовать книгу Страуструпа Язык программирования C++. Четвертое издание и множество источников информации в Интернете). Однако если вы являетесь программистом на C или C++, желающим получше ознакомиться с текущим состоянием языка программирования C++, или программистом на другом языке программирования, желающим увидеть точную картину и преимущества современного C++, то более короткого и простого введения в C++, чем эта книга, вам не найти.Доктор Бьярне Страуструп — изобретатель и первый разработчик языка программирования С++, перу которого принадлежат книги Программирование. Принципы и практика с использованием C++. Второе издание, Язык программирования C++. Четвертое издание и многие другие. Ранее Страуструп работал в Bell Labs, AT&T Labs и Texas A&M University, а в настоящее время является управляющим директором в отделе технологий Morgan Stanley в Нью-Йорке и приглашенным профессором в Колумбийском университете. Он — лауреат многочисленных наград, в том числе премии 2020 года Национальной инженерной академии «за концептуализацию и разработку языка программирования C++». Кроме того, доктор Страуструп является членом Национальной Инженерной Академии, а также сотрудником IEEE и АСМ.Программисты на C++ — от стершего пальцы о клавиатуру профессионала до только начинающего учиться этому замечательному языку школьника — всегда с нетерпением ждут выхода в свет новых книг серии «C++ In-Depth». С еще большим нетерпением они ждут выхода книг Бьярне Страуструпа, который известен как автор не только замечательного языка программирования, но и замечательных книг.Что же тогда говорить о книге Бьярне Страуструпа, вышедшей в серии «C++ In-Depth»?Эта книга не ставит целью научить читателя программировать (для этого есть другая книга того же автора — Программирование. Принципы и практика с использованием C++. Второе издание). Не является она и исчерпывающим учебником, который приведет вас на вершины мастерства C++ (для этого автор написал Язык программирования C++. Четвертое издание). Но если вы — программист на C или C++, желающий получше ознакомиться с текущим состоянием языка программирования C++, или программистом на другом языке программирования, желающим увидеть точную картину и преимущества современного C++, то более короткого, простого и при этом строгого и точного введения в C++, чем эта книга, вам не найти.В очень небольшой объем Страуструп сумел не только поместить описание языка C++ в его современном виде (включая возможности, которые должны появиться в стандарте C++20), и основных компонентов стандартной библиотеки C++, но и сопроводить этот материал массой советов о том, ка

В этой книге создатель языка C++ Бьярне Страуструп описывает, что собой представляет современный C++. Это краткое самодостаточное руководство охватывает основные функциональные…

C++ – 20 лет победного несовершенства

Поделитесь в соцсетях:

Сегодня трудно даже поверить в то, что юбиляру – языку программирования C++, гибель предрекали мало того что неоднократно, так еще и очень убедительно. Последний раз юбиляра уверенно отправляли «на покой» 10 лет назад, когда многообещающий преемник – Java – как будто устранил все неисчислимые недостатки C++ и вроде как без потерь в производительности.

В краткой преамбуле к статье есть лежащий на поверхности один из верных ответов на вопрос о причинах живучести и неснижающейся популярности обладающих массой известных недостатков языков C и C++. Да, C++ и очень близкий к нему C критикуют много и заслуженно. Но все альтернативы, увы, до сих предлагали «как будто» устранение всех их недостатков «вроде как» без потерь в производительности созданных программ. Можно до хрипоты спорить об этих «как будто» и «вроде как», можно бросаться цифрами, проводить тестирования – и все это будет впустую. Потому как C++ исполнилось 20 лет, и вместе со своим предшественником C эти языки образуют инструментальную базу для громадной индустрии программного обеспечения: по некоторым оценкам, до 38% сегодняшних программных проектов реализуются на языке C++, а уж C буквально царит в мире ПО для неисчислимого количества встраиваемых компьютеров.

C 7 по 10 ноября в Лас-Вегасе, городе, который никогда не спит, прошли празднования 20-й годовщины языка С++. Бьярн Страуструп, Стенли Липпман, Андрей Александреску, Скотт Мейерс и многие другие гуру С++ произнесли спичи в честь юбиляра.

И хоть о юбилярах положено говорить много хорошего, мы откажемся от этого правила и для начала покажем самую малую долю того «ужасного обаяния C++», за которое этот язык (равно как и его предшественника C) одновременно и любят, и уважают, и ненавидят. Если вы не знаете C или C++, не отчаивайтесь – пример будет крохотным, и мы его разберем по косточкам, так, чтобы самое ценное в нем – натуральный ужас, стало понятным даже тем, кто не знает, чего надо бояться. Для начала маленькое отступление. В языках программирования высокого уровня обычно используют блочную структуру программы. Блоки позволяют, например, локализовать переменные, перекладывая заботы об управлении памятью на компилятор. Так, память, выделенная под переменные, объявленные в начале блока, обычно автоматически освобождается перед завершением блока. Естественно, в основе такого принципа лежит простой механизм стека – в начале блока ссылка на каждую объявленную в нем переменную записывается на вершину специального стека (обычно невидимого для прикладного программиста), а в конце блока ссылки автоматически снимаются со стека, и адресуемые ими участки памяти помечаются как свободные. Естественно, для того чтобы такая блочная структура могла вообще работать, необходимо строгое соблюдение требования вложенности блоков. Только в этом случае после выхода из вложенного блока на стеке управления памятью автоматических переменных останутся адреса наружного (по отношению ко вложенному) блока, и все будет работать в соответствии с описанной логикой.

Практически во всех языках программирования высокого уровня это правило свято соблюдается. Для многих языковых конструкций есть правила, требующие строго определенной их иерархической блочной структуры. И в C++, и в C в том числе. В этих языках для обозначения начала и конца блока используются символы «itc_drupal_» и «» соответственно. А теперь – обещанный ужас:

Для понимания, что это – натуральный ужас, вам вовсе не надо знать C++ или С. Просто следите за соблюдением правила вложенности блоков. Видите? Блоки, которые, по логике вещей, должны быть на одном уровне иерархии (они начинаются со слова case), почему-то на одном уровне не находятся. И между тем это совершенно законный работающий код на С++. Более того, в C++ законность работоспособности данного кода унаследована от C. Именно на C этот великолепный кошмар был изобретен 9 ноября 1983 г. (кстати, еще один юбилей!) программистом Томом Даффом. Для подтверждения законности этого кода в свое время потребовалось личное участие Ларри Рослера, председателя подкомитета ANSI по стандартизации языка C. А в оригинальном электронном письме Тома Даффа более чем двадцатилетней давности, где он сообщает об изобретении данного кода, можно найти слова, которые дают еще один ответ на поставленный в начале статьи вопрос: «Я поражен – после 10 лет программирования на C в этом языке еще остаются неразведанные мною уголки».

C++ : вчера и сегодня

Созданный там же, где и предшественник, язык C, – в Исследовательском центре компьютерных наук Bell Labs, С++ в полной мере повторил и приумножил успех С. Причем сразу следует заметить, что успехи и C, и C++, основывались исключительно на свойствах этих языков как инструментов. Ведь по сути никакой коммерческой «раскруткой» языков программирования компания AT&T, в состав которой входила Bell Labs, не занималась. C распространялся как бы «в нагрузку» к ОС UNIX, C++ вообще фактически не имел «товарного» характера. Более того, AT&T своевременно поддержала политику стандартизации открытых спецификаций этих языков. Благодаря этой модели распространения разработок в области языков программирования, принятой AT&T, сегодня доступны не только высококлассные коммерческие компиляторы С и С++, но и великолепный GCC, ставший главным инструментом в мире Open Source.

Впрочем, достоинства модели распространения ПО – это вещь весьма абстрактная. А у языка C++ все-таки есть вполне конкретный автор, которого замечательная во всем модель свободного распространения открытых стандартных спецификаций в какой-то мере обделила. Американец датского происхождения, получивший образование в Дании и Англии, Бьярн Страуструп никаких отчислений за спецификации C++ не получает. Благо специфика любого языка программирования – сложность (даже самый «простой» язык в действительности очень сложен, что отлично демонстрируется хоррор-программой Тома Даффа). Ну а там, где люди вынужденно сталкиваются со сложностью, всегда есть потребность в единственном универсальном средстве борьбы с нею – в документации. Изданные во множестве стран мира суммарным легальным тиражом свыше миллиона экземпляров сложные книги Бьярна Страуструпа о сложном языке C++ – лучшее тому подтверждение.

Основатель Netscape Марк Андрессен на примере Java охарактеризовал результаты попыток создать сверхоснащенный язык программирования на все случаи жизни: «Java была намного более дружелюбным по отношению к программисту языком, чем С или С++ была несколько лет назад, до тех пор, пока ее не сделали такой сложной. Скоро, вероятно, ее будет еще труднее изучить, чем С++».

В технологическом аспекте создание C++, в принципе, довольно обычная история. Бьярн Страуструп для создания первого компилятора использовал распространенный прием, известный под названием «метода раскрутки». На языке C Страуструп написал препроцессор, преобразующий подмножество нового языка в обычный язык C. На подмножестве C++ и был разработан первый транслятор с C++ и затем «раскручен» в C-код, пригодный к компиляции в исполняемую программу. Целевой машиной для первого C++ транслятора была… любая машина, способная выполнять любой C-компилятор, потому что результатом трансляции был C-код.

Самым интересным в C++, пожалуй, является замысел Страуструпа создать одновременно высокоуровневый язык, несоизмеримо более высокоуровневый по сравнению с C, и в то же время как максимально приближенный по низкоуровневым возможностям к C, так и в разумной степени совместимый с C. Возможно, именно благодаря такой затее современный C++ – вовсе не «C с классами» и даже не «объектно-ориентированный язык». C++ – это так называемый «полипарадигменный язык». Сам Бьярн Страуструп слово «парадигма» в отношении своего детища употреблять не любит и предпочитает говорить о различных стилях программирования, допустимых при использовании С++. Структурное программирование, программирование с применением абстрактных типов данных, обобщенное и функциональное программирование – в принципе, в умелых руках C++ позволяет использовать как каждый из стилей (или парадигм), так и комбинировать их в одном программном проекте. Естественно, такая гибкость дается немалой ценой. Особенно если учитывать, что основные затраты на язык программирования – это вовсе не стоимость приобретения лицензионного компилятора, а время на изучение собственно языка. А вот сколько времени нужно на то, чтобы виртуозно овладеть С++, сказать очень трудно. Если несоизмеримо более простой C в свое время поразил Тома Даффа, C-программиста с десятилетним стажем, обилием «неразведанных уголков», то что тогда можно говорить о С++, отдельным техникам которого посвящены такие непростые книги, как 550-страничное руководство по шаблонам «C++ Templates: The Complete Guide»? И между тем, даже при этом уровне сложности на юбилейной конференции, посвященной 20-летию С++, Бьярн Страуструп отметил, что С++ уже начал утрачивать, как бы это лучше сказать, «крутизну»: «C++ стал мощным, отработанным инструментом, но использовать его уже не круто (no cool)». Возможно, лишение С++ ореолов «крутизны» и «ковбойства» пойдет только на пользу. И на пользу не столько языку, сколько использующим его программистам и организациям. По крайней мере, период, когда С++ выбирался языком реализации исключительно потому, что это было «круто», безвозвратно прошел. А ведь такой период в истории языка был, и именно благодаря ему столь убедительно звучали голоса предрекающих скорый уход C++ с арены популярных инструментальных средств.

С++ завтра, или 0х уж этот С++0x

Сегодняшний С++ многим кажется языком, пик развития которого уже в прошлом. И, по большому счету, это мнение верно. 20 лет – срок, достаточный для достижения зрелости даже такой сложной разработкой. И все-таки говорить о том, что развитие языка после стандартизации ISO в 1998 г. полностью прекратилось, нельзя. В будущем более чем трехмиллионная армия С++-программистов получит обновленный инструмент, отвечающий формирующемуся стандарту C++0x. Говорить о точной дате появления нового стандарта и, тем более, о времени выхода компиляторов, понимающих C++0x C++, пока очень трудно. Дело в том, что C++ используется в самых разнообразных областях применения, и, соответственно, от разнообразия желанных улучшений просто рябит в глазах. Однако разработчики стандартных спецификаций строго следуют важнейшему правилу, заложенному в идеологию C++ его создателем Бьярном Страуструпом: «C++ – это универсальный язык, пригодный к использованию во многих прикладных областях благодаря удачному компактному набору общеупотребимых средств». Если вспомнить судьбу языков, в которые включались специализированные средства (например, языковая поддержка потокового программирования), можно уверенно говорить о безошибочности выбора Страуструпа.

Вторая сложность в формировании С++0x кроется в специфике типизации, принятой в нынешнем С++. С одной стороны, требование к повышению надежности разрабатываемых программ вынуждает создателей спецификаций языка как можно строже относиться к системе типов и к контролю за ними. В идеале, конечно, язык со строгой типизацией был бы просто замечательным. Но это в идеале. В реальной жизни программистам необходимы одновременно и возможность создания абстрактных типов, и возможность, например, доступа к ячейкам памяти или регистрам, расположенным в адресном пространстве по известным адресам. В реальной жизни программисты стараются использовать как можно большую часть ранее написанного кода повторно, и строгая типизация в С++0x привела бы к тому, что все исходные тексты, где используются массивы, указатели, объединения, явные и неявные приведения типов, пришлось бы отправить в мусорную корзину.

И наконец, к несовершенству реальной жизни следует отнести и жесткие требования к высокой производительности полученного с помощью компиляции кода. Неважно, что сейчас эпоха «дешевых гигагерцев» – далеко не во всех областях применения эти гигагерцы нужны, далеко не везде компьютерам разрешена работа «обогревателем по совместительству». Иными словами, требование к минимальности среды времени исполнения C++0x остаются в силе. С++0x сохраняет минимальной дистанцию между программистом и «железом», отображая один в один целевую машину языковыми средствами. Машинные слова, байты, регистры – все это в C++0x остается.

Наряду с принципами, по которым формируется C++0x, уже известно и о некоторых конкретных нововведениях. Так, в стандартной библиотеке появится поддержка кортежей – tuples. Кортежи – это коллекции определенного количества (до десяти) объектов разных типов. Обычно они поддерживаются в интерпретируемых языках и позволяют эффективно возвращать множества значений из функций, проводить множественные сравнения или присваивания и прочие групповые операции над гетерогенными наборами данных. Перечень базовых операций с кортежами включает механизмы их создания, определения числа элементов и типа каждого элемента, а также доступа как к кортежу в целом, так и к каждому его элементу. Реализацию кортежей в C++0x можно считать очень удачной, так как она фактически не потребовала модификаций ядра языка.

К полезным модификациям также следует отнести «облатку» над ссылками С++. В текущих спецификациях языка объекты типа «ссылка» не являются равноправными с прочими объектами базовых типов. Так, например, ссылки нельзя использовать в качестве параметров в шаблонных конструкциях. В некоторых случаях такое неравноправие ссылок, например с указателями, вынуждало программистов заниматься различными ухищрениями. В С++0x от несправедливости решили избавляться малой кровью и ввели специальный класс-«облатку» (reference_wrapper), позволяющий скрыть в объекте класса ссылку так, чтобы одновременно сохранить ее свойства и устранить ограничения. Реализация «облатки» такова, что из ссылок на объекты разных типов в С++0x можно, к примеру, формировать кортежи.

Мастер Йода рекомендует:  Курс «Продвинутый Python»


Еще одно нововведение С++0x – возвращение в язык старого ключевого слова auto, но в совершенно новом качестве. Идея нового auto очень проста и заключается в ответе на вопрос: какова степень избыточности следующего выражения:

Если немного подумать, то почти вся левая часть, касающаяся объявления переменной, избыточна. Потому как информация о типе совершенно явно указывается в правой части, в значении, используемом для инициализации переменной. Соответственно, в С++0x можно будет полениться и доверить компилятору дописать очевидное, заменив его словом auto:

В примерах, где в правой части инициализаций использовались данные в явной форме, ценность auto невелика. Но если вместо явных данных использовать вызовы функций, объявление переменной с auto-определением типа может помочь избежать тонких ошибок, особенно в случаях, когда могут сработать механизмы приведения типов по умолчанию, а они-то как раз и нежелательны.

В общем, возвращаясь к оценкам перспектив развития языка, можно уверенно говорить, что революции с появлением C++0x не произойдет. Что-то будет удобнее, что-то – лучше, все сделанное ранее останется работоспособным. И это не может не радовать.

Страуструп , какую книгу выбрать? [дубликат]

На данный вопрос уже ответили:

Прочитал, разобрал и понял половину Шилдта «С++ базовый курс» а теперь появилось желание перейти на Страуструпа, только у него 2 книги «Принципы и практика использования С++» а также «Язык программирования С++«

P.S. у Шилдта ООП еще не трогал, как раз до него дошел

Дополненение исходя из ответов: Есть 2 варианта:

1) Шилдта бросаю и начинаю «Принципы и практика», а потом «Язык программирования».

2) Дочитываю Шилдта и сразу начинаю «Язык программирования».

Скажите какой выбрать а то мнения разнятся.

Интервью с Бьерном Страуструпом о языке C++

Считанные часы остались до Нового 2014-го года, в котором в числе прочего всем нам был обещан новый стандарт C++14. Однако он будет не большим самостоятельным обновлением, а лишь доработкой C++11, багфиксом, который придаст текущей версии языка завершенный вид. На этом фоне Уильям Вонг (англ. William Wong) от ресурса electronicdesign.com взял интервью у Бьерна Страуструпа (дат. Bjarne Stroustrup), создателя C++. Беседа затронула несколько тем: от истории разработки C++ и особенностей стандарта C++11 до проблемы обучения этому языку программирования.

Некоторые термины и понятия мне раньше встречались исключительно в английском варианте (например, словечко embedded в контексте IT), и мне не всегда удавалось найти общепринятый перевод, в котором я не был бы уверен сам. В таких и других неоднозначных случаях я указывал английский вариант термина в скобках либо вовсе оставлял его непереведенным.

В конце статьи приведены ссылки и мои примечания. Владельцы указанного ресурса любезно разрешили мне перевести это интервью и опубликовать перевод на Хабре, однако настояли, чтобы я указал первоисточник определенным способом. Не обессудьте. Сразу после ссылки идет собственно перевод.

На сегодняшний день языки программирования C и C++ являются самыми востребованными в области встраиваемых (embedded) систем, а также в задачах построения платформ для сторонних приложений. Автором C++ является Бьерн Страуструп. Он и поныне принимает активное участие в разработке стандартов этого языка программирования, в том числе последнего — C++11. Многое об этом языке он писал в своих книгах, например, в “Programming: Principles and Practice using C++” . Бьерн Страуструп любезно согласился ответить на несколько вопросов о самом языке C++ и о его разработке.

Как вы пришли к разработке C++?

Я работал над проектом, который позволил бы разделить ядро Unix на несколько частей, исполняемых мультипроцессором или высокопроизводительной локальной сетью. И мне потребовался инструмент, который позволил бы работать с аппаратной частью, обеспечивал бы хорошую производительность для задач системного программирования, а также мог бы использоваться для работы над системой со сложной архитектурой. Однако на тот момент (1979-1980 гг.) ни один из существующих языков программирования не удовлетворял всем трем условиям сразу. Поэтому я решил добавить к C концепцию классов — наподобие той, что была в Simula. Вначале я реализовал проверки и преобразования аргументов функций (впоследствии они стали прототипами функций), конструкторы, деструкторы, а также простейшее наследование. Первая версия языка C++ называлась «C with Classes». Кстати, любопытно, что для простейшей поддержки обобщенного программирования (generic programming) в ней использовались макросы. В дальнейшем я понял, что такой подход не обеспечивает должной масштабируемости, и вместо макросов добавил шаблоны.

Я совершенствовал архитектуру и реализацию языка C++ следующие несколько лет, вплоть до его коммерческого релиза в 1985 году. В то время производительность и скорость обращения к аппаратной части были очень важными характеристиками, впрочем, как и сегодня. Я счел необходимым реализовать в C++ все возможности языка C, причем сделать их не менее эффективными. Например, на ранних этапах я обнаружил, что структуры, используемые для реализации конструктора копирования, занимали на 3% больше памяти, чем в C. Я решил, что так быть не должно, и к концу недели все исправил. Чтобы программистам не пришлось отказываться от классов без какой-либо потери процессорного времени, были также добавлены встраиваемые (inline) функции. Я вообще был уверен в том, что используемые средства должны быть не только выразительными, но и достаточно эффективными, чтобы их можно было использовать в приложениях с самыми высокими требованиями.

К чему вы стремились при разработке языка C++?

К тому, чтобы C++ мог работать с аппаратной частью как минимум настолько же эффективно, как это делал C. Кроме того, мне показалась весьма важной концепция абстракций, которая позволила бы программистам выражать свои самые смелые идеи без каких-либо временных затрат или утечек памяти, с которыми они скорее всего столкнулись бы в самостоятельной реализации.

Это требование влечет за собой использование строгой статической типизации, в отличие от слабой типизации в C.

Язык C++ разрабатывался для людей, занимающихся программированием всерьез, то есть, для профессионалов своего дела. Он может использоваться — и используется — новичками, но часто это приводит к разным недоразумениям и жалобам на то, что не каждому дано научиться программировать на C++ и что есть вещи, которые очень сложно реализовать на этом языке. Разумеется, не существует универсального языка программирования для всего и вся, C++ и не создавался таким. Однако этот язык весьма эффективен в тех областях, для которых он был разработан, как то системное программирование или программирование программ с серьезными ограничениями на ресурсы компьютера. C++ нет равных там, где его мощь действительно нужна, и меня не сильно заботит, что вместо этого можно написать простенькое веб-приложение на JavaScript или Ruby. C++ по своей сути не предназначен для решения задач средней сложности, с нестрогими требованиями к производительности и надежности программы, равно как он не предназначен для использования не очень опытными программистами со средненькими навыками разработки. Безусловно, он может использоваться в таких условиях и сегодня это широко практикуется, но существует множество других языков программирования, которые подошли бы намного лучше.

О ключевых принципах, которых я придерживался при разработке C++, я рассказал в своей книге«The Design and Implementation of C++» и в двух статьях, написанных для конференции «History Of Programming Languages». Если вкратце, то я ставил такие цели:

  • эффективная поддержка абстракции данных. Код, использующий абстракции, не должен допускать никаких накладных расходов по сравнению кодом без ее использования,
  • принципы взаимодействия языка C++ и его компилятора с компьютером должны быть максимально похожими на те, что были у C,
  • существенная гибкость кода, которую можно достичь при помощи абстракций, а также
  • надежность кода, которая достигается при помощи строгой статической типизации.

Если в общем, C++ призван помочь в написании качественного программного кода. Профессиональные программисты в реальной жизни сталкиваются со сложными задачами, и этот язык программирования во многом упрощает их жизнь.

Хотя, конечно, не получится достигнуть все эти цели сразу, и C++ не идеален. Однако, несмотря на бесчисленные попытки создать язык вместо него, C++ со своим строгим дизайном остается лучшим решением для самых разных практических задач.

Вы принимали участие в разработке стандарта языка C++ с самого начала. Сильно ли он изменился со временем? Кто занимается разработкой новых стандартов?

Сложно сказать. Разработка формального стандарта — это очень непростое и, как правило, муторное дело. Им занимаются люди с большим опытом, однако все они — специалисты по совершенно разным областям программирования, и каждый имеет свое видение стандарта. Так что прийти к единому мнению может быть сложно и накладно по времени, но это необходимо: удовлетворить всем требованиям сразу не получится, а принуждать программистов пользоваться принципиально новыми инструментами нельзя. Прогресс происходит только когда в стандарт включаются дополнения, важность которых общепризнана. Нельзя принимать участие в комитете и при этом постоянно зацикливаться на мелочах. Нужно уметь видеть всю картину в целом и приходить к общему мнению с остальными. По моим подсчетам, в комитет входит около сотни организаций и, может, больше трехсот собственно разработчиков. Это в два-три раза больше, чем было раньше. Только на последних собраниях присутствовало около ста человек.

В 2014 году мы планируем выпустить новый стандарт, C++14. В нем будут минимальные нововведения, а также несколько исправлений, за их необходимость уже проголосовало большинство комитета. Я рассчитываю, что в 2014 году все уже будут использовать C++14, а после этого мы планируем выпустить C++17 в 2020 году. Но это обновление будет уже намного существенней, так что тут сложно судить о сроках.

Комитет по разработке стандартов ISO C++ сам по себе не располагает какими-либо ресурсами, будь то деньги или штатные разработчики. Он полностью основан на средствах его участников. Например, чтобы входить в состав комитета, они платят 1200 долларов ежегодно. Всякий может заявить, что, мол, в C++ нет нормальной библиотеки для создания графических интерфейсов или нормальной поддержки параллелизма задач. Да, мы в курсе. Чем жаловаться, лучше бы помогли довести эти задачи до ума. У нас очень мало прикладных программистов, и часто получается так, что нововведения создаются в угоду интересов одного конкретного разработчика.

Многие программисты при разработке встроенных систем предпочитают использовать C, потому что он проще, чем C++, и больше подходит для разработки под аппаратное обеспечение. Действительно ли сложность C++ должна быть камнем преткновения для разработки встроенных систем?

Вовсе нет. Если вы придерживаетесь C-стиля программирования, то C++ окажется ничуть не сложнее C, причем он тоже подходит для разработки под аппаратное обеспечение. И уж точно C++ намного эффективнее, чем C. Я никогда не видел такой программы на C++, которую можно было бы так переписать на C, что у нее будет меньший объем кода, она будет производительней, она будет лучше сопровождаться — в общем, будет эффективнее. Не верю, что такое возможно.

Миф о том, что «C лучше C++», сбивает с толку очень многих начинающих программистов. Так, например, когда они сталкиваются с проблемами, они постоянно пытаются что-то выдумывать и применять совершенно нетривиальные вещи, а не использовать простые и мощные инструменты. В конце концов, у них получается очень сложный и запутанный код, который они в силу своих заблуждений принимают за эталон. Вся эта ситуация меня просто поражает. Если человек берется за что-то, а ему постоянно твердят, что это очень сложно и бесполезно, то у него в итоге ничего и не получится. Единственная вразумительная причина, из-за которой, как я знаю, используют чистый C, а не C++, — это ограниченные возможности конкретной платформы.

Однако студентов и вообще новичков в изучении C++ нельзя винить, потому что их ошибки часто зарождаются в процессе освоения университетского курса программирования. Однажды, лет десять назад, мне довелось вести его у первокурсников. Я заглянул в учебники — и просто поразился: вместо понятных и простых в использовании конструкций C++ в книгах в начале рассматривалась куча разных неочевидных мелочей языка C, а инструменты С++ преподносились как нечто очень сложное. Это не отпугивало только тех, кто хотел серьезно заниматься программированием.

Вот серьезно, скажите: неужели вектора из стандартной библиотеки сложнее массивов из C? Или, например, почему студентов приучают к функции qsort() , хотя sort() и эффективнее, и универсальнее? У C++ более строгая типизация, чем у C, за счет этого объектный код обрабатывается быстрее.

Еще в учебниках часто описывают C++ как провалившуюся попытку создания чистого объектно-ориентированного языка программирования. Такое утверждение как правило иллюстрируется целой простыней кода, в которой практически вся архитектура разбита на запутанную иерархию классов, унаследованных друг от друга. В итоге получается совершенно не характерная для C++ связанность. Такой код напоминает скорее программу на Java, и, что самое печальное, работает он обычно медленно.

Мне тоже не нравится C++ таким, каким его представляют авторы тех учебников. В ответ я написал свою книгу для студентов и самоучек — «Programming: Principles and Practice using C++». Для ее изучения опыт программирования не обязателен, однако она вызвала интерес и среди опытных разработчиков.

Только если вам нужен просто обзор C++11, то эта книга будет довольно большой. Для этой цели я порекомендовал бы книгу «A Tour of C++». В ней описаны все ключевые моменты ISO C++ и стандартной библиотеки всего на 180 страницах. Стандарт C++11 полностью поддерживается компиляторами Clang и GCC, частично — Microsoft C++ и многими другими, правда, боюсь, на менее популярных платформах он может выполняться некорректно.

В C++ 11 было много нововведений, в том числе лямбда-выражения и поддержка многопоточного программирования. Как вы считаете, оказались ли они востребованными?

Для работы с потоками мне постоянно приходилось пользоваться сторонними библиотеками. Они были хороши, но последние пятнадцать лет я хотел добавить поддержку потоков именно в стандарт, чего мы наконец и достигли. С точки зрения параллельного программирования ключевые новшества C++11 состоят в организации памяти (которую, к слову, заимствовали и для языка C), а также портируемости многопоточных программ. Однако если вы программируете на уровне потоков и барьеров, то самым главным для вас может оказаться безопасное преобразование типов (type safety): для разделения и передачи данных между потоками больше не требуется никаких макросов или void** . Впрочем, для кого-то также важны инструменты и для lock-free программирования.

Что касается лямбда-выражений, то я примерно лет десять работал над такой их реализацией в языке C++, от которой было бы больше пользы, чем вреда. У сторонних библиотек как правило страдает производительность. Нам же удалось добиться для лямбда-выражений производительности, сравнимой с циклом for . Приведу пример:

Эти три участка кода делают одно и то же и работают с одинаковой производительностью. Между ними можно выбирать исходя из соображений стиля программирования, поддерживаемости и так далее.

Я бы применял лямбда-выражения всего в нескольких случаях. В таком, например:

Лямбда-выражения — новый и довольно мощный инструмент. Подвох в том, что такие вещи программисты любят использовать буквально повсюду, пока не понимают, чем это обернется в дальнейшем. Мне, например, кажется, что функцию и функциональные объекты лучше объявлять отдельно. У нужной операции тогда будет свое собственное имя, которое можно легко вызвать из разных участков программы.

Также лямбда-выражения открывают большой простор для практики написания кода. Здесь, наверное, не место учить вас C++11, но позвольте мне привести один пример:

В этом коде я применил несколько новых для C++ вещей. Цикл for , например, здесь читается как «для всех x из cont » и упрощает перебор контейнера cont . Объявление auto& x показывает, что x должна быть ссылкой на тип элементов инициализирующего контейнера, в данном случае — на тип элементов cont . Данный цикл собирает адреса всех вхождений v в cont и складывает их в вектор указателей res . Так что эти конструкции — не больше чем синтаксический сахар, хотя они весьма удобны.

Существенное же нововведение заключено в return : обратите внимание, что я по вернул вектор по значению. В C++98 этот оператор возврата создал бы копию res , а ведь на деле он может оказаться большим и состоять из тысяч элементов. С точки зрения производительности это было бы весьма опрометчиво. А в C++11 у векторов есть так называемый конструктор перемещения (move constructor), который вместо копирования «заимствует» представление res (в сущности, всего три указателя) для использования на месте вызова функции find_all() , а сам вектор оставляет пустым. После выполнения return мы больше никогда не сможем использовать res . Таким образом, возврат вектора по значению обойдется максимум в шесть присваиваний, вне зависимости от размера вектора.

Конструкторы перемещения — довольно простой инструмент. Он доступен каждому программисту, и, кроме того, реализован в каждом контейнерном классе стандартной библиотеки. Это позволяет без труда возвращать из функций большие объекты и не ломать лишний раз голову над управлением памятью.

Протестировать функцию find_all() можно следующим образом:

Попробуйте написать тот же код без применения шаблонов и нововведений C++11 и сравните результаты.

На эту тему рекомендую прочесть «A Tour of C++», за деталями же обратитесь к четвертому изданию книги «The C++ Programming Language».

Какие часто встречаемые у современных C++-программистов ошибки вы можете отметить?

Они почему-то часто думают, что должны выбирать между эффективным и изящным кодом. Они либо ограничивают себя низкоуровневыми возможностями языка (ради «эффективности»), либо выстраивают огромную архитектуру «на все случаи жизни» (полагая такой код весьма элегантным). На мой же взгляд, идеал состоит в сочетании максимальной эффективности и наиболее оптимальной архитектуры. Так происходит, когда решение программиста самым оптимальным образом удовлетворяет условиям задачи, но это, разумеется, не всегда возможно. Редко получается добиться этого с первой попытки, но так случается довольно часто, насколько это возможно для идеала.

Прежде чем отказываться от возможностей C++, вроде классов или шаблонов, попробуйте сперва рассмотреть их базовое применение и попрактиковаться. Обоснованный выбор приведет вас намного дальше, чем шаги, предпринятые наугад. Не обязывайте себя сооружать огромные иерархии классов или писать запутанный мета-код с помощью шаблонов: некоторые из самых мощных возможностей C++ очень просты. Лучший путь к написанию эффективного кода — не усложнять его без необходимости.

Чем вы любите заниматься в свободное время?

Мне интересно путешествовать по разным местам. Еще я люблю выходить на пробежки. Также я увлекаюсь фотографией, мне нравится слушать музыку и читать — художественную и историческую литературу. Время стараюсь проводить с родными и близкими. Само собой, программирование мне тоже порой доставляет немало удовольствия, но вопрос, должно быть, не о работе. Мне нравится заниматься исследованиями, собирать сложные программные системы. Как кто-то сказал, «не могу поверить, что мне за это еще и платят!»

Бьерн Страуструп: и физик, и лирик

В середине октября в Москву первый раз в жизни прилетит Бьерн Страуструп (Bjarne Stroustrup), создатель языка программирования C++. На конференции “ Разработка ПО 2010 ” он прочитает доклад, а также проведет четырехчасовой мастер-класс. В преддверии визита в Россию Бьерн дал небольшое интервью 3DNews, причем мы вполне осознанно не стали задавать ему зубодробительных вопросов об особенностях нового языка C++0x, о котором наш собеседник будет рассказывать по прибытии. В конце концов, об этом можно почитать во многих других источниках (осторожно, английский). Мы же попробовали выйти за пределы C, чтобы показать вам не только эксперта-изобретателя, но и человека. И все же начали мы именно с C++.

3DNews: Вам, наверное, задавали этот вопрос уже сотни раз, и все же, по внутреннему ощущению, какие особенности C++ позволили этому языку выделиться на фоне собратьев и уже четвертое десятилетие подряд оставаться живой классикой?

Примерно так выглядел Бьерн Страуструп во времена первого коммерческого релиза C++

Bjarnem Stroustrup: C++ имел и имеет по сей день те преимущества, которые предоставляет C в низкоуровневом программировании при работе с аппаратной частью (проще говоря, «железом»), и в то же время обеспечивает возможность создавать собственные уровни абстракции без потери производительности и без излишней избыточности в плане использования ресурсов. Ведь конструкторы и деструкторы стали в свое время настоящим прорывом. По сравнению с традиционным С (Кернигана и Ритчи), С++ предлагает улучшенную систему безопасности типов. По сравнению с Simula, С++ существенную гибкость и эффективность.

Важно и то, что C++ не переставал развиваться после его первого коммерческого релиза в октябре 1985-го. За прошедшие годы он постепенно стал гораздо более эффективным и гибким инструментом для разработки ПО. Его характерные сильные черты, например, выстраивание программной инфраструктуры и разработка ресурсо-эффективного ПО, основывались на моих изначальных целях для С++. А именно простой и эффективной связке с железом в сочетании с гибкими механизмами абстракции без использования runtime.

3DNews: Верите ли вы в то, что необходимость в языках программирования однажды отпадет, и компьютеры начнут понимать простой человеческий английский?

Bjarnem Stroustrup: Я сомневаюсь в этом. Точнее, сомневаюсь в том, что это вообще нужно. Когда я задаю некое действие, которое должно быть выполнено на компьютере, хочется гораздо большей «экономии» слов и гораздо же более точного определения смысла, чем может предложить разговорный английский. Например, “a = b+c” и лаконичнее, и четче, нежели “Добавить C к В и поместить результат в А”. Языки программирования гораздо ближе к сугубо техническим и специализированным сокращениям, используемым профессионалами (к примеру, математиками и врачами), чем к повседневной речи. На самом деле, я не удивлюсь, если программирование станет еще более формализованным и отодвинется от обычной человеческой речи еще дальше.

Естественно, я сейчас говорю о разработке ПО. Наши обычные взаимодействия с компьютерами, вероятно, будут все больше похожи на разговор людей между собой. Например, фраза “дайте мне сосиску в французской булочке с горчицей, без кетчупа и положите немножко лука” может быть совершенно понятной автоматизированному лотку, торгующему хот-догами. Однако сами программы, распознающие голос, равно как и операционные системы, на которых они будут работать, продолжат писать на специализированных языках программирования.

3DNews: Одной из основных проблем, с которой сегодня сталкиваются разработчики программного обеспечения, является обеспечение эффективной поддержки многоядерных процессоров в ПО для конечных пользователей. Многие приложения по-прежнему умеют использовать только одно ядро из двух-четырех-шести. Есть ли способ устранить эту дисгармонию?

Bjarnem Stroustrup: Нам нужна усовершенствованная модель разработки алгоритмов параллельных (многопоточных) вычислений на высоком уровне абстракции. С++0х, о котором я буду рассказывать в Москве, закладывает основу для этого в виде набора потокобезопасных средств для работы с традиционной моделью блокировки и синхронизации потоков. Нельзя сказать, что эта модель (а так же lock-free синхронизация, предлагаемая C++0x) идеально подходит для многопоточных приложений. Она просто лучше, нежели то, что предлагают большинство других языков на сегодняшний день. Но всё же язык C++0x позволяет создавать продвинутые, относительно простые и специализированные модели в виде библиотек, созданных стандартными средствами языка.

Нам надо больше работать над упрощением спецификаций параллельных систем – даже спустя полвека исследований в этом направлении.


На рабочем столе Бьерна царит идеальный рабочий беспорядок

3DNews: В России каждый второй студент, готовящийся стать программистом, однажды создает свой собственный язык. Вы верите в успех гениальных одиночек? И вообще, есть ли спрос на совершенно новые языки программирования?

Bjarnem Stroustrup: Придумать новый язык и даже что-то написать нем относительно просто. Гораздо труднее убедить серьезных разработчиков интересных продуктов использовать такое изобретение. Чтобы быть полезным, новый язык должен быть лучшим решением проблемы, нежели существующие (и известные) инструменты и языки. Но лично я бы советовал приступать к разработке чего-то совсем нового только в том случае, если вы хорошо знакомы с проблемной областью, и уверены, что можете обеспечить лучшее решение именно в виде языка. Ведь очень часто инструмент или библиотека для существующего языка оказывается более полезным. Кстати, это одна из причин, по которой многие языки умирают молодыми: «старики» быстро наверстывают упущенное.

Нет, я хотел бы видеть все новые и новые языки, и знаю, что возможно создать гораздо лучшие варианты, нежели те, что мы имеем сегодня. Было бы очень печально, если языки программирования перестали рождаться. Ведь их создание является своего рода окном, отдушиной для новых идей и подходов к пониманию проблем и их решению.

Не думаю, что рынок ждет новые языки с распростертыми объятиями, но как раз изобретение таковых позволяет избежать риска излишнего консерватизма и склонности к использованию только общепринятых языков. Это хорошо и интересно!

И еще одно. Думаю, что разработчики-одиночки крайне важны, поскольку коллектив обычно не может сосредоточиться и выдать согласованный набор целей для языка программирования. Много мнений, много деталей, и в них немудрено заблудиться. В то же время язык не может быть разработан в изоляции, дизайнер должен получать фидбэк и вдохновение, что может предложить только развитое техническое сообщество. Когда рождался C, мне повезло работать в AT & T Bell Labs, а там техническая среда была настолько разнообразна и требовательна, что это поставило передо мной немало сложнейших задач. И их решение, в свою очередь, помогло C++ выжить и стать таким, каким он стал. Я до сих пор чувствую себя в долгу перед коллегами.

Мастер Йода рекомендует:  Встречаем Java 10 и разбираемся в главных нововведениях

3DNews: В России сейчас объявлена программа модернизации, развития собственных высоких технологий. Однако наши соотечественники почему-то чаще добиваются успеха за рубежом, нежели в своей стране. Есть ли у вас мнение об этом феномене?

Bjarnem Stroustrup: Может быть дело в том, что люди, уезжающие за рубеж, изначально более инициативны, любопытны и самими условиями мотивированы сделать что-то новое? Может, они больше других готовы идти на риск и, переехав на новое место, люди особенно сильно стремятся преуспеть?

Подозреваю, что успешность за границей – это общеиммигрантский феномен, не только русский. Я и сам вообще-то иммигрант (напомним, Бьерн родился и закончил университет в Дании, но живет и работает в США – прим. редакции).

3DNews: Какие из цифровых технологий или устройств, изготовленных в последние десять лет, произвели на вас наибольшее впечатление?

Bjarnem Stroustrup: Я люблю фотографировать, причем мне все это очень интересно и с технической, и с, если так можно выразиться, эстетической точки зрения. Проще говоря, я и физик, и лирик. Так вот, прогресс в области цифровых изображений просто поражает. Очевидно, в этом есть и немалая заслуга программного обеспечения, используемого в камерах.

Также я вряд ли сегодня мог бы заниматься своей работой или общаться с друзьями без поистине удивительной инфраструктуры связи, которая соединяет меня со всем миром через один небольшой ноутбук.

На выступлениях Бьерна Страуструпа не заскучают даже те, кто программировал только на Бейсике на школьных уроках информатики (автор фото Chris Cowdery-Corvan)

3DNews: Последний вопрос – зачем вы собираетесь в Россию и каковы планы на поездку?

Bjarnem Stroustrup: С одной стороны, я хочу приехать, потому что никогда не был в вашей стране. С другой – потому что на конференции у меня будет возможность поговорить с российскими разработчиками программного обеспечения, это очень интересно. К великому сожалению, я не смог выделить достаточно времени на традиционные туристические развлечения, потому что октябрь – это середина семестра в университете (г-н Страуструп профессор в Texas A&M University – прим. редакции), и я не могу быть далеко от своих студентов слишком долго. Надеюсь, организаторы конференции организуют и мое свободное время, так что получится посмотреть Красную площадь и Большой театр. Есть ощущение, что от созерцания достопримечательностей и выступлений я вернусь обратно в США довольно усталым, но все же с большим нетерпением жду визита в Москву.

Бьерн Страуструп: и физик, и лирик

Сергей Вильянов

05 октября 2010

В середине октября в Москву первый раз в жизни прилетит Бьерн Страуструп (Bjarne Stroustrup), создатель языка программирования C++. На конференции «Разработка ПО 2010» он прочитает доклад, а также проведет четырехчасовой мастер-класс. В преддверии визита в Россию Бьерн дал небольшое интервью 3DNews, причем мы вполне осознанно не стали задавать ему зубодробительных вопросов об особенностях нового языка C++0x, о котором наш собеседник будет рассказывать по прибытии. В конце концов, об этом можно почитать во многих других источниках (осторожно, английский). Мы же попробовали выйти за пределы C, чтобы показать вам не только эксперта-изобретателя, но и человека. И все же начали мы именно с C++.

3DNews: Вам, наверное, задавали этот вопрос уже сотни раз, и все же, по внутреннему ощущению, какие особенности C++ позволили этому языку выделиться на фоне собратьев и уже четвертое десятилетие подряд оставаться живой классикой?

Примерно так выглядел Бьерн Страуструп во времена первого коммерческого релиза C++

Bjarnem Stroustrup: C++ имел и имеет по сей день те преимущества, которые предоставляет C в низкоуровневом программировании при работе с аппаратной частью (проще говоря, «железом»), и в то же время обеспечивает возможность создавать собственные уровни абстракции без потери производительности и без излишней избыточности в плане использования ресурсов. Ведь конструкторы и деструкторы стали в свое время настоящим прорывом. По сравнению с традиционным С (Кернигана и Ритчи), С++ предлагает улучшенную систему безопасности типов. По сравнению с Simula, С++ существенную гибкость и эффективность.

Важно и то, что C++ не переставал развиваться после его первого коммерческого релиза в октябре 1985-го. За прошедшие годы он постепенно стал гораздо более эффективным и гибким инструментом для разработки ПО. Его характерные сильные черты, например, выстраивание программной инфраструктуры и разработка ресурсо-эффективного ПО, основывались на моих изначальных целях для С++. А именно простой и эффективной связке с железом в сочетании с гибкими механизмами абстракции без использования runtime.

3DNews: Верите ли вы в то, что необходимость в языках программирования однажды отпадет, и компьютеры начнут понимать простой человеческий английский?

Bjarnem Stroustrup: Я сомневаюсь в этом. Точнее, сомневаюсь в том, что это вообще нужно. Когда я задаю некое действие, которое должно быть выполнено на компьютере, хочется гораздо большей «экономии» слов и гораздо же более точного определения смысла, чем может предложить разговорный английский. Например, “a = b+c” и лаконичнее, и четче, нежели «Добавить C к В и поместить результат в А». Языки программирования гораздо ближе к сугубо техническим и специализированным сокращениям, используемым профессионалами (к примеру, математиками и врачами), чем к повседневной речи. На самом деле, я не удивлюсь, если программирование станет еще более формализованным и отодвинется от обычной человеческой речи еще дальше.

Естественно, я сейчас говорю о разработке ПО. Наши обычные взаимодействия с компьютерами, вероятно, будут все больше похожи на разговор людей между собой. Например, фраза «дайте мне сосиску в французской булочке с горчицей, без кетчупа и положите немножко лука» может быть совершенно понятной автоматизированному лотку, торгующему хот-догами. Однако сами программы, распознающие голос, равно как и операционные системы, на которых они будут работать, продолжат писать на специализированных языках программирования.

3DNews: Одной из основных проблем, с которой сегодня сталкиваются разработчики программного обеспечения, является обеспечение эффективной поддержки многоядерных процессоров в ПО для конечных пользователей. Многие приложения по-прежнему умеют использовать только одно ядро из двух-четырех-шести. Есть ли способ устранить эту дисгармонию?

Bjarnem Stroustrup: Нам нужна усовершенствованная модель разработки алгоритмов параллельных (многопоточных) вычислений на высоком уровне абстракции. С++0х, о котором я буду рассказывать в Москве, закладывает основу для этого в виде набора потокобезопасных средств для работы с традиционной моделью блокировки и синхронизации потоков. Нельзя сказать, что эта модель (а так же lock-free синхронизация, предлагаемая C++0x) идеально подходит для многопоточных приложений. Она просто лучше, нежели то, что предлагают большинство других языков на сегодняшний день. Но всё же язык C++0x позволяет создавать продвинутые, относительно простые и специализированные модели в виде библиотек, созданных стандартными средствами языка.

Нам надо больше работать над упрощением спецификаций параллельных систем – даже спустя полвека исследований в этом направлении.

На рабочем столе Бьерна царит идеальный рабочий беспорядок

3DNews: В России каждый второй студент, готовящийся стать программистом, однажды создает свой собственный язык. Вы верите в успех гениальных одиночек? И вообще, есть ли спрос на совершенно новые языки программирования?

Bjarnem Stroustrup: Придумать новый язык и даже что-то написать нем относительно просто. Гораздо труднее убедить серьезных разработчиков интересных продуктов использовать такое изобретение. Чтобы быть полезным, новый язык должен быть лучшим решением проблемы, нежели существующие (и известные) инструменты и языки. Но лично я бы советовал приступать к разработке чего-то совсем нового только в том случае, если вы хорошо знакомы с проблемной областью, и уверены, что можете обеспечить лучшее решение именно в виде языка. Ведь очень часто инструмент или библиотека для существующего языка оказывается более полезным. Кстати, это одна из причин, по которой многие языки умирают молодыми: «старики» быстро наверстывают упущенное.

Нет, я хотел бы видеть все новые и новые языки, и знаю, что возможно создать гораздо лучшие варианты, нежели те, что мы имеем сегодня. Было бы очень печально, если языки программирования перестали рождаться. Ведь их создание является своего рода окном, отдушиной для новых идей и подходов к пониманию проблем и их решению.

Не думаю, что рынок ждет новые языки с распростертыми объятиями, но как раз изобретение таковых позволяет избежать риска излишнего консерватизма и склонности к использованию только общепринятых языков. Это хорошо и интересно!

И еще одно. Думаю, что разработчики-одиночки крайне важны, поскольку коллектив обычно не может сосредоточиться и выдать согласованный набор целей для языка программирования. Много мнений, много деталей, и в них немудрено заблудиться. В то же время язык не может быть разработан в изоляции, дизайнер должен получать фидбэк и вдохновение, что может предложить только развитое техническое сообщество. Когда рождался C, мне повезло работать в AT & T Bell Labs, а там техническая среда была настолько разнообразна и требовательна, что это поставило передо мной немало сложнейших задач. И их решение, в свою очередь, помогло C++ выжить и стать таким, каким он стал. Я до сих пор чувствую себя в долгу перед коллегами.

3DNews: В России сейчас объявлена программа модернизации, развития собственных высоких технологий. Однако наши соотечественники почему-то чаще добиваются успеха за рубежом, нежели в своей стране. Есть ли у вас мнение об этом феномене?

Bjarnem Stroustrup: Может быть дело в том, что люди, уезжающие за рубеж, изначально более инициативны, любопытны и самими условиями мотивированы сделать что-то новое? Может, они больше других готовы идти на риск и, переехав на новое место, люди особенно сильно стремятся преуспеть?

Подозреваю, что успешность за границей – это общеиммигрантский феномен, не только русский. Я и сам вообще-то иммигрант (напомним, Бьерн родился и закончил университет в Дании, но живет и работает в США – прим. редакции).

3DNews: Какие из цифровых технологий или устройств, изготовленных в последние десять лет, произвели на вас наибольшее впечатление?

Bjarnem Stroustrup:

Я люблю фотографировать, причем мне все это очень интересно и с технической, и с, если так можно выразиться, эстетической точки зрения. Проще говоря, я и физик, и лирик. Так вот, прогресс в области цифровых изображений просто поражает. Очевидно, в этом есть и немалая заслуга программного обеспечения, используемого в камерах.

Также я вряд ли сегодня мог бы заниматься своей работой или общаться с друзьями без поистине удивительной инфраструктуры связи, которая соединяет меня со всем миром через один небольшой ноутбук.

На выступлениях Бьерна Страуструпа не заскучают даже те, кто программировал только на Бейсике на школьных уроках информатики (автор фото Chris Cowdery-Corvan)

3DNews: Последний вопрос – зачем вы собираетесь в Россию и каковы планы на поездку?

Bjarnem Stroustrup: С одной стороны, я хочу приехать, потому что никогда не был в вашей стране. С другой – потому что на конференции у меня будет возможность поговорить с российскими разработчиками программного обеспечения, это очень интересно. К великому сожалению, я не смог выделить достаточно времени на традиционные туристические развлечения, потому что октябрь – это середина семестра в университете (г-н Страуструп профессор в Texas A&M University – прим. редакции), и я не могу быть далеко от своих студентов слишком долго. Надеюсь, организаторы конференции организуют и мое свободное время, так что получится посмотреть Красную площадь и Большой театр. Есть ощущение, что от созерцания достопримечательностей и выступлений я вернусь обратно в США довольно усталым, но все же с большим нетерпением жду визита в Москву.

Интервью с Бьерном Страуструпом о языке C

В конце статьи приведены ссылки и мои примечания. Обладатели указанного источника вежливо позволили мне перевести это интервью и опубликовать перевод на Прогре, впрочем настояли, Дабы я указал первоисточник определенным методом. Не обессудьте. Сразу позже ссылки идет собственно перевод.

На сегодняшний день языки программирования C и C являются самыми актуальными в области встраиваемых (embedded) систем, а также в задачах построения платформ для сторонних приложений. Автором C является Бьерн Страуструп. Он и доныне принимает энергичное участие в разработке эталонов этого языка программирования, в том числе последнего — C 11. Многое об этом языке он писал в своих книгах, скажем, в“Programming: Principles and Practice using C ” . Бьерн Страуструп вежливо согласился ответить на несколько вопросов о самом языке C и о его разработке.

Как вы пришли к разработке C ?

Я работал над планом, тот, что дозволил бы поделить ядро Unix на несколько частей, исполняемых мультипроцессором либо высокопроизводительной локальной сетью. И мне понадобился инструмент, тот, что дозволил бы трудиться с аппаратной частью, обеспечивал бы отменную продуктивность для задач системного программирования, а также мог бы применяться для работы над системой со трудной архитектурой. Впрочем на тот момент (1979-1980 гг.) ни один из существующих языков программирования не удовлетворял каждому трем условиям сразу. Следственно я решил добавить к C доктрину классов — подобно той, что была в Simula. Сначала я реализовал проверки и реформирования доводов функций (позднее они стали прототипами функций), конструкторы, деструкторы, а также простейшее наследование. Первая версия языка C именовалась «C with Classes». Кстати, любознательно, что для примитивной поддержки обобщенного программирования (generic programming) в ней применялись макросы. В последующем я осознал, что такой подход не обеспечивает надлежащей масштабируемости, и взамен макросов добавил образцы.

Я совершенствовал архитектуру и реализацию языка C следующие несколько лет, вплотную до его торгового релиза в 1985 году. В то время продуктивность и скорость обращения к аппаратной части были дюже главными колляциями, однако, как и сегодня. Я счел нужным реализовать в C все вероятности языка C, причем сделать их не менее результативными. Скажем, на ранних этапах я нашел, что конструкции, используемые для реализации конструктора копирования, занимали на 3% огромнее памяти, чем в C. Я решил, что так быть не должно, и к концу недели все поправил. Дабы программистам не пришлось отказываться от классов без какой-либо потери процессорного времени, были также добавлены встраиваемые (inline) функции. Я вообще был уверен в том, что используемые средства обязаны быть не только колоритными, но и довольно результативными, Дабы их дозволено было применять в приложениях с самыми высокими требованиями.

К чему вы тяготились при разработке языка C ?

К тому, Дабы C мог трудиться с аппаратной частью как минимум настоль же результативно, как это делал C. Кроме того, мне показалась крайне главной доктрина абстракций, которая дозволила бы программистам выражать свои самые храбрые идеи без каких-либо временных расходов либо утрат памяти, с которыми они скорее каждого столкнулись бы в независимой реализации.

Это требование влечет за собой применение суровой статической типизации, в различие от слабой типизации в C.

Язык C разрабатывался для людей, занимающихся программированием серьезно, то есть, для специалистов своего дела. Он может применяться — и применяется — новичками, но Зачастую это приводит к различным недоразумениям и претензиям на то, что не всякому дано обучиться программировать на C и что есть вещи, которые дюже трудно реализовать на этом языке. Разумеется, не существует универсального языка программирования для каждого и каждая, C и не создавался таким. Впрочем данный язык крайне результативен в тех областях, для которых он был разработан, как то системное программирование либо программирование программ с серьезными ограничениями на источники компьютера. C нет равных там, где его мощь подлинно необходима, и меня не крепко заботит, что взамен этого дозволено написать простенькое веб-приложение на JavaScript либо Ruby. C по своей сути не предуготовлен для решения задач средней трудности, с нестрогими требованиями к продуктивности и безопасности программы, равно как он не предуготовлен для применения не дюже опытными программистами со средненькими навыками разработки. Безоговорочно, он может применяться в таких условиях и сегодня это обширно практикуется, но существует уйма других языков программирования, которые подошли бы для этого гораздо отменнее.

О ключевых тезисах, которых я придерживался при разработке C , я рассказал в своей книге«The Design and Implementation of C » и в 2-х статьях, написанных для конференции «History Of Programming Languages». Если лаконично, то я ставил такие цели:

  • результативная помощь абстракции данных. Код, использующий абстракции, не должен допускать никаких убыточных затрат по сопоставлению кодом без ее применения,
  • тезисы взаимодействия языка C и его компилятора с компьютером обязаны быть максимально схожими на те, что были у C,
  • значительная эластичность кода, которую дозволено достичь при помощи абстракций, а также
  • безопасность кода, которая достигается при помощи суровой статической типизации.

Если в всеобщем, C призван подмогнуть в написании добротного программного кода. Высокопрофессиональные программисты в реальной жизни сталкиваются со трудными задачами, и данный язык программирования во многом упрощает их жизнь.

Правда, безусловно, не получится добиться все эти цели сразу, и C не безупречен. Впрочем, невзирая на бесчисленные попытки сделать язык взамен него, C со своим суровым дизайном остается лучшим решением для самых различных утилитарных задач.

Вы принимали участие в разработке эталона языка C с самого начала. Крепко ли он изменился со временем? Кто занимается разработкой новых эталонов?

Трудно сказать. Разработка формального эталона — это дюже непростое и, как правило, муторное дело. Им занимаются люди с огромным навыком, впрочем все они — эксперты по абсолютно различным областям программирования, и всякий имеет свое видение эталона. Так что прийти к цельному суждению может быть трудно и убыточно по времени, но это нужно: удовлетворить каждому требованиям сразу не получится, а принуждать программистов пользоваться твердо новыми инструментами невозможно. Прогресс происходит только когда в эталон включаются дополнения, значимость которых общепризнана. Невозможно принимать участие в комитете и при этом непрерывно зацикливаться на мелочах. Необходимо уметь видеть всю картину в целом и приходить к всеобщему суждению с остальными. По моим подсчетам, в комитет входит около сотни организаций и, может, огромнее трехсот собственно разработчиков. Это в два-три раза огромнее, чем было прежде. Только на последних собраниях присутствовало около ста человек.

В 2014 году мы планируем выпустить новейший эталон, C 14. В нем будут минимальные нововведения, а также несколько исправлений, за их надобность теснее проголосовало множество комитета. Я рассчитываю, что в 2014 году все теснее будут применять C 14, а позже этого мы планируем выпустить C 17 в 2020 году. Но это обновление будет теснее гораздо существенней, так что здесь трудно судить о сроках.

Комитет по разработке эталонов ISO C сам по себе не распредполагает какими-либо источниками, будь то деньги либо штатные разработчики. Он всецело основан на средствах его участников. Скажем, Дабы входить в состав комитета, они платят 1200 баксов годично. Каждый может заявить, что, мол, в C нет типичной библиотеки для создания графических интерфейсов либо типичной поддержки параллелизма задач. Да, мы в курсе. Чем жалиться, отменнее бы помогли довести эти задачи до ума. У нас дюже немного прикладных программистов, и Зачастую получается так, что нововведения создаются в угоду интересов одного определенного разработчика.

Многие программисты при разработке встроенных систем выбирают применять C, потому что он проще, чем C , и огромнее подходит для разработки под аппаратное обеспечение. Подлинно ли трудность C должна быть камнем преткновения для разработки встроенных систем?

Совсем нет. Если вы придерживаетесь C-жанра программирования, то C окажется нисколько не труднее C, причем он тоже подходит для разработки под аппаратное обеспечение. И уж верно C гораздо результативнее, чем C. Я никогда не видел такой программы на C , которую дозволено было бы так переписать на C, что у нее будет меньший объем кода, она будет продуктивней, она будет отменнее сопровождаться — в всеобщем, будет результативнее. Не верю, что такое допустимо.

Миф о том, что «C отменнее C », сбивает с толку дюже многих начинающих программистов. Так, скажем, когда они сталкиваются с задачами, они непрерывно пытаются что-то придумывать и использовать абсолютно нетривиальные вещи, а не применять примитивные и сильные инструменты. В конце концов, у них получается дюже трудный и замороченный код, тот, что они в силу своих заблуждений принимают за стандарт. Каждая эта обстановка меня легко удивляет. Если человек берется за что-то, а ему непрерывно твердят, что это дюже трудно и напрасно, то у него в результате ничего и не получится. Исключительная вразумительная повод, из-за которой, как я знаю, применяют чистый C, а не C , — это ограниченные вероятности определенной платформы.

Впрочем студентов и вообще новичков в постижении C невозможно винить, потому что их ошибки Зачастую зарождаются в процессе освоения университетского курса программирования. Некогда, лет десять назад, мне довелось вести его у первокурсников. Я заглянул в учебники — и легко поразился: взамен внятных и примитивных в применении конструкций C в книгах в начале рассматривалась куча различных неочевидных мелочей языка C, а инструменты С преподносились как что-то дюже трудное. Это не отпугивало только тех, кто хотел серьезно заниматься программированием.

Вот серьезно, скажите: неужто вектора из стандартной библиотеки труднее массивов из C? Либо, скажем, отчего студентов приучают к функции qsort() , правда sort() и результативнее, и универсальнее? У C больше суровая типизация, чем у C, за счет этого объектный код обрабатывается стремительней.

Еще в учебниках Зачастую описывают C как провалившуюся попытку создания чистого объектно-ориентированного языка программирования. Такое заявление как правило иллюстрируется целой простыней кода, в которой фактически каждая зодчество разбита на запутанную иерархию классов, унаследованных друг от друга. В результате получается абсолютно не характерная для C связанность. Такой код напоминает скорее программу на Java, и, что самое грустное, работает он традиционно медлительно.

Мне тоже не нравится C таким, каким его представляют авторы тех учебников. В результат я написал свою книгу для студентов и самоучек — «Programming: Principles and Practice using C ». Для ее постижения навык программирования не непременен, впрочем она вызвала интерес и среди опытных разработчиков. Только если вам необходим легко обзор C 11, то эта книга будет достаточно огромный. Для этой цели я порекомендовал бы книгу «A Tour of C ». В ней описаны все ключевые моменты ISO C и стандартной библиотеки каждого на 180 страницах. Эталон C 11 всецело поддерживается компиляторами Clang и GCC, Отчасти — Microsoft C и многими другими, правда, опасаюсь, на менее знаменитых платформах он может выполняться некорректно.

В C 11 было много новшеств, в том числе лямбда-выражения и помощь многопоточного программирования. Как вы считаете, оказались ли они актуальными?

Для работы с потоками мне непрерывно доводилось пользоваться сторонними библиотеками. Они были отменны, но последние 15 лет я хотел добавить поддержку потоков именно в эталон, чего мы наконец и достигли. С точки зрения параллельного программирования ключевые новшества C 11 состоят в организации памяти (которую, к сл!

Испробуйте написать тот же код без использования образцов и новшеств C 11 и сравните итоги.

На эту тему рекомендую прочесть «A Tour of C », за деталями же обратитесь к четвертому изданию книги«The C Programming Language».

Какие Зачастую встречаемые у современных C -программистов ошибки вы можете подметить?

Они отчего-то Зачастую думают, что обязаны выбирать между результативным и изысканным кодом. Они либо ограничивают себя низкоуровневыми вероятностями языка (ради «результативности»), либо выстраивают большую архитектуру «на все случаи жизни» (предполагая такой код крайне изящным). На мой же взор, идеал состоит в сочетании максимальной результативности и особенно оптимальной архитектуры. Так происходит, когда решение программиста самым оптимальным образом удовлетворяет условиям задачи, но это, разумеется, не неизменно допустимо. Редко получается добиться этого с первой попытки, но так случается достаточно Зачастую, насколько это допустимо для идеала.

Раньше чем отказываться от вероятностей C , как бы классов либо образцов, испробуйте сперва разглядеть их базовое использование и попрактиковаться. Обоснованный выбор приведет вас гораздо дальше, чем шаги, предпринятые наугад. Не обязывайте себя сооружать большие иерархии классов либо писать замороченный мета-код с поддержкой образцов: некоторые из самых сильных вероятностей C дюже примитивны. Наилучший путь к написанию результативного кода — не усложнять его без необходимости.

Чем вы любите заниматься в свободное время?

Мне увлекательно путешествовать по различным местам. Еще я люблю выходить на пробежки. Также я увлекаюсь фотографией, мне нравится слушать музыку и читать — художественную и историческую литературу. Время усердствую проводить с родными и близкими. Само собой, программирование мне тоже порой доставляет много удовольствия, но вопрос, должно быть, не о работе. Мне нравится заниматься изысканиями, собирать трудные программные системы. Как кто-то сказал, «не могу уверовать, что мне за это еще и платят!»

Добавить комментарий