Бьерн Страуструп — автор языка C++. Варианты имени: Бьярне, Бьёрн.
1136 страниц. Бином, 2017
Bjarne Stroustrup. The C++ Programming Language. Special Edition. Addison-Wesley, 2000
Описан стандарт C++98. Автор время от времени отвлекается на эссе о том, как проектировался язык. Один небольшой раздел так и называется — «Философские замечания». Изложение весьма непростое, нелинейное. К концу первой главы, не самой короткой, автор так и не приступает к системному описанию языка, но уже даёт конкретные советы:
Обзорные главы о ядре языка и стандартной библиотеке сложные: вот яркий пример (стиль кода тоже вызывает нарекания).
class complex
{
double re, im;
public:
complex(double r, double i) { re = r; im = i; } // создать complex из двух скаляров
complex(double r) { re = r; im = 0; } // создать complex из скаляра
complex() { re = im = 0; } // по умолчанию: (0, 0)
friend complex operator+(complex, complex);
friend complex operator-(complex, complex); // бинарная операция
friend complex operator-(complex); // унарная операция
friend complex operator*(complex, complex);
friend complex operator/(complex, complex);
friend bool operator==(complex, complex); // проверка на равенство
friend bool operator!=(complex, complex); // проверка на неравенство
};
А уже через пять страниц — таблицы виртуальных функций.
После типов, указателей, массивов и структур идёт обсуждение выражений и операторов. И обсуждение на достойном примере — калькуляторе выражений. Если новичков не отпугнули долгие пространные предисловия и обзоры, то оставшиеся, пожалуй, срежутся на формальной грамматике и её разборе:
program:
END // END это конец ввода
expr_list END
expr_list:
expression PRINT // PRINT это точка с запятой
expression PRINT expr_list
...
Ядро языка и стандартная библиотека описаны досконально и обстоятельно. Но через язык пробираться трудно. Целая часть книги посвящена проектированию программ на C++. Полезно, но снова — не для начинающих.
Давайте просто посмотрим на пример. Глава 13. Шаблоны. Эпиграф вполне подходит к теме: «Здесь — ваша цитата. Б. Страуструп». А дальше довольно простая в своей основе концепция описывается очень туманно.
«Независимые концепции должны представляться независимо и комбинироваться лишь при необходимости. Когда этот принцип нарушается, вы либо связываете воедино разнородные концепции, либо создаёте ненужные зависимости. В любом случае вы порождаете негибкие конструкции для построения программных систем. Шаблоны обеспечивают простой способ представления широкого набора общих концепций и простые способы их комбинирования. Получающиеся результирующие классы и функции не уступают ручным специализированным вариантам по эффективности и потребляемой памяти.
Шаблоны обеспечивают непосредственную поддержку обобщённого программирования (generic programming), то есть программирования с использованием типов в качестве параметров. Механизм шаблонов языка C++ позволяет использовать типы в качестве параметров определений классов и функций. Шаблон зависит лишь от тех свойств параметров-типов, которые он использует явно, и не требует никаких дополнительных зависимостей между ними. В частности, не требуя, чтобы разные параметры-типы шаблона принадлежали к одной иерархии наследования».
Приложения:
1328 страниц. Вильямс, 2016
Bjarne Stroustrup. Programming. Principles and Practice Using C++. Addison-Wesley, 2014
Гораздо более человечная книга, хотя и более толстая. Структура прямая и понятная: основы (первым идёт «Hello, world!», а не эссе о том, как нужно проектировать языки), ввод и вывод, данные и алгоритмы, дополнительные темы (где, правда, не обойдётся без историй про принципы, идеалы, профессионализм и философию языка). И снова — разбор грамматики.
Набор приложений тоже показательный:
Хотя на обложке красуются C++11 и C++14, им уделяется не очень много места. Впервые о C++11 говорится в разделе «Безопасность типов» на примере нового типа инициализации (double x {2.7}).
Интересная находка — разработать набор графических классов. Проектирование матрицы — практически университетская классика. Контейнеры хорошо объясняются, как и умные указатели, итераторы и алгоритмы. Плохо лишь то, что автор потом снова возвращается к своим эссе о языках Algol и Simula.
Отдельные любопытные главы — о программировании встроенных (embedded) систем и тестировании.
320 страниц. Диалектика, 2019
Bjarne Stroustrup. A Tour of C++. Addison-Wesley, 2018
Практически конспект по сравнению с предыдущими фолиантами. Всё исключительно коротко и по делу: от основ к проектированию классов, обработке исключений и шаблонам. Но всё равно стоит предупредить, что новичков начало книги может немного ввести в ступор. В книгу попали вещи из C++20, например, концепты. Затем — строки, регулярные выражения (относительно новая вещь в языке), контейнеры, алгоритмы, умные указатели, параллельные вычисления и асинхронность, то есть такие вещи, для которых ещё нет устоявшегося перевода: future и promise.
Книгу завершает глава о истории языка, но в данном случае это больше рассказ о разнице в стандартах.
448 страниц. ДМК Пресс, Питер, 2006
Bjarne Stroustrup. The Design and Evolution of C++. Addison-Wesley, 1994
Очень подробное, хоть и косноязычное, описание того, как C++ развивался ещё с тех времён, когда он назывался C with Classes. От дремучей древности — компилятора Cfront до перспектив развития. Практической ценности книга не имеет, но представляет интересный взгляд на язык от первого лица.
Интересно почитать, как и почему C++ завоёвывал популярность. Пожалуй, «отсутствие маркетинга» — это лишь отговорка: деньги в рекламу никто не вливал, но расчёт был вполне чёткий.
Отрывок о ссылках для примера.
«Ссылки были введены в основном для поддержки перегрузки операторов. Дуг Макилрой вспоминает, что однажды я объяснял ему некоторые проблемы, касавшиеся схемы перегрузки операторов. Он употребил слово „ссылка“, после чего я, пробормотав „спасибо“, выбежал из его кабинета, чтобы на следующий день появиться с практически готовым решением, которое и вошло в язык. Просто Дуг тогда напомнил мне об Algol68.
В языке C аргументы всегда передаются функции по значению, а в случаях, когда передача объекта по значению не годится или слишком неэффективна, программист может передать указатель на объект. При этом нотация должна быть удобной, поскольку нельзя ожидать, что пользователь всегда будет вставлять оператор взятия адреса для больших объектов. Так, a = b - c; — это общепринятая нотация, в то время как a = &b - &c; нет. Как бы то ни было, &b - &c уже имело в C определённую семантику, и менять её я не хотел.
После инициализации ссылка уже не может ссылаться ни на что другое. Иными словами, коль скоро она инициализирована, нельзя заставить её ссылаться на другой объект, то есть изменять привязку. В прошлом меня неприятно удивил тот факт, что в Algol68 предложение r1 = r2 может означать либо присваивание объекту, на который ссылается r1, либо изменение значения самой ссылки r1 (повторная привязка) в зависимости от типа r2. Я хотел уйти от таких проблем в C++».
Основная часть книги посвящена отдельным аспектам языка: управлению памятью, перегрузке, наследованию, классам вообще, шаблонам, их синтаксису, обработке исключений, пространствам имён и даже препроцессору C. Автор рассказывает и о том, что не вошло в язык, например, об именованных аргументах функций, о том, как мог бы выглядеть сборщик мусора.