среда, 20 мая 2020 г.

[prog.c++] Собственные ощущения от выбора C++17 в 2018, 2019 и 2020 годах

Интересно, как меняется собственное ощущение от применимости C++17 с течением времени.

Два года назад, в 2018-ом, когда мы начинали делать демо-проект Shrimp, то выбор в пользу C++17 был достаточно рискованным. Типа, ну это же изначально эксперимент, не для продакшена, да и C++17 в условиях, максимально приближенных к боевым, надо осваивать.

Год назад, в 2019-ом, когда принималось решение делать SObjectizer-5.6 уже исключительно с расчетом на C++17, было ощущение, что это не самое лучше решение и часть потенциальных пользователей от SObjectizer-а это отвернет. Но зато оно оправдано с точки зрения перспективы. Все равно популяризация SObjectizer-а идет медленно, поэтому когда информация о SObjectizer-е разойдется более-менее широко, то C++17 уже не будет проблемой. Т.е. уже в 2019-ом выбор C++17 был не то, чтобы однозначно хорошим решением, но уж точно не рискованным.

Сейчас, в 2020-ом, мы начинаем делать прототип для нового решения сразу на C++17. И это уже воспринимается как само собой разумеющийся выбор. Благо у заказчика всего одна целевая платформа и на ней по дефолту доступен gcc-8.

Ну и еще раз повторю сказанное раньше неоднократно: попрограммировав немного на C++14 уже сложно возвращаться на C++11, хотя 14-е плюсы от 11-ых не сильно отличаются. Тоже самое ощущение и после программирования на C++17: на 14-й стандарт уже некоторая ломка :)

Какой из этого вывод?

Наверное, их два.

Во-первых, пора уже переставать считать C++11 современным C++ ;)

Во-вторых, времена меняются, сидеть по 10-15 лет на древних компиляторах C++, наверное, можно. Но тут нужно отдавать себе трезвый ответ на вопрос "А зачем мне это все нужно и оправдано ли это?"

6 комментариев:

Alex комментирует...

Я не знаю С++ (ну, т.е. что-то простенькое может и сделаю, но толково им не занимался). Пишу на java. В связи с этим вопрос для саморазвития: а насколько критичны различия между версией 11 и версией 17? В java, например, 5-я версия - это революция (generics, concurrent). Все, что до нее - уже палеонтологические отложения. 6 и 7 версия - улучшения, но не слишком критичные. В 8-й версии опять рывок (lambda, streams). Версии после 8-ки пока слабо распространены. Но там нет ничего принципиально такого, чтобы сползать с 8-ки, которой уже 6 лет. Модули? Пока и простых пакетов хватает.
И да, еще: какую/какие книги по C++ посоветуете опытному (но не в С++) программисту, желающему, наконец, въехать в С++ дальше чем HelloWorld? Спасибо

eao197 комментирует...

@Alex

Тут фокус в том, что ни C++14, ни C++17 не добавляют к C++11 чего-то принципиально важного, как это сделал C++11 в сравнении с C++03. Но тем не менее куча мелких изменений приводит (в моем случае) к ощущению совсем другого качества.

Из того, чем я пользуюсь, можно сходу вспомнить (здесь смешаны C++14/17):

* возможность писать просто auto в качестве типа возвращаемого значения для функции/метода, без необходимости затем явно уточнять тип. Очень крутая штука, когда колдуешь с какой-нибудь шаблонной магией (например);
* атрибут [[nodiscard]];
* типы std::optional, std::string_view, std::variant в стандартной библиотеке, без необходимости подключать внешние зависимости;
* structured binding;
* if constexpr;
* возможность объявить переменную прямо внутри условия if с последующим логическим выражением.

По поводу книг мне сложно сказать. Могу лишь вспомнить какие книги мне помогли в прошлом: "Язык программирования C++" Страуструпа, старая книга по C++ным шаблонам от Вандервуда и Джосаттиса, книги Мейерса (хотя я их читал фрагментами), книга Саттера и Александреску со 101 рекомендацией. Остальная информация как-то годами накапливалась из совершенно разных источников.

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

goncharenko комментирует...

Завидую белой завистью всем тем, кто может взять стандарт старше 11-го. Мы вот спустя года 3-4 только-только начали заниматься миграцией огроменного проекта на свежий gcc и gradle (с ant-a). Закончим, конечно не скоро, но зато потом будет возможность модернизировать собственно старый код на новый.

eao197 комментирует...

@goncharenko

Ну да, старые огромные проекты живут в своём ритме. К счастью не все проекты такие.

Alex комментирует...

А что Вы скажете по поводу вот такого мнения: https://www.quora.com/Why-is-C-still-in-use-even-though-we-have-C++-Is-there-anything-that-C-can-do-but-C++-cant-or-maybe-something-that-is-easier-to-do-in-C-rather-than-C++
Насколько оно справедливо?

eao197 комментирует...

Там не одно мнение, а множество и в каждом, как полагает автор мнения, есть какие-то рациональные зерна.

С++ -- это инструмент и, как у любого другого инструмента, при выборе сказываются и объективные, и субъективные факторы. Возьмите для примера обычный молоток. Для простоты слесарный. Если вы отберете 100 слесарей, разного опыта, разной квалификации, с разным образованием (т.е. учившихся в разных местах), с разной специализацией, с разными антропометрическими параметрами, и дадите им на выбор 200 более-менее обычных слесарных молотков (отличающихся размерами, материалами и длиной рукоятки), то увидите, что разные слесари будут выбирать разные молотки. Даже если им нужно сделать одну и ту же работу. Потому что у каждого руки разные, один и тот же предмет сидит в руке по-разному, привычки разные и т.д., и т.п.

Я стараюсь держаться от чистого C подальше. Потому что такого убогого инструмента с такой высокой вероятностью отстрелить себе ногу, и с такими тяжелыми последствиями отстрела я больше не видел. Но если для кого-то С -- это то, что нужно, то пожалуйста.

Сам я топлю за C++ не столько потому, что это лучший язык на свете (нет). А потому, что слишком уж много небылиц про него рассказывают.