Этот хабрапост объединяет десять лучших докладов от таких спикеров, как Nicolai Josuttis, Timur Doumler, Андрей Давыдов и многих других.
C++17/20/23, concepts, immutable data structures, concurrency, parallelism, metaprogramming — всё это темы конференции C++ Russia 2019, прошедшей этой весной в Москве. Более шести сотен участников, известные международные спикеры, глубокие доклады. Обратите внимание — доклады такие, что устареют очень нескоро, а применить полученные знания можно хоть сейчас.
Формат таков:
- Обязательное видео на YouTube
- Подробное описание доклада на русском языке (со слайдами, если они есть)
- Краткая биография докладчика
Не стесняйтесь писать комментарии! Кстати, в плейлисте, опубликованном под катом, есть не только топ-10. И мы выключили рекламу на YouTube, так что никто не будет мешать.
Все доклады идут от «младшего» к «старшему» по рейтингу, но различия между местами лучшей десятки минимальны и сильно зависят от методики оценки. Незначительно изменив методику, можно сильно поменять места. Поэтому смотрите все!
Полный плейлист конференции находится по ссылке.
10. The hitchhiker's guide to faster builds
Viktor Kirilov
C++ известен за свою производительность, быстродействие, отсутствие стандартной системы сборки и менеджера пакетов, сложность и продолжительность компиляции. Невозможность быстрой итеративной разработки — один из величайших убийц продуктивности разработчика. Этот доклад предназначен для всех, кто хочет улучшить последние три пункта: вначале некоторые идеи, почему компиляция и линковка занимают столько времени, потом — список техник и инструментов для решения проблемы, например:
- тулинг и инфраструктура — железо, системы сборки, кэширование, распределенные сборки, диагностика бутылочного горлышка, гигиена кода;
- техники — unity builds, precompiled headers, static vs shared;
- изменения в исходниках — идиома PIMPL, более правильное использование шаблонов, аннотации;
- модули — что это такое, когда появятся в C++, что из-за этого окажется более ненужным.
О докладчике
Шесть лет профессионального опыта в C++ в индустрии игр и VFX. Сейчас Виктор занимается разработкой open source и время от времени — обычной контрактной работой. Из последних интересных задач — реализация горячей подмены кода в рантайме языка Nim. Кроме того, он является автором doctest — «самой быстрой и мощной single-header-библиотеки тестирования для C++». Интересуется разработкой игр и игровых движков, высокопроизводительного кода, криптовалют, оптимизацией рабочего процесса и интеграцией хороших практик разработки, таких как современные инструменты статического анализа и инструментации. Виктор живет в городе София (Болгария), и программирование — одновременно его профессия и хобби. Есть свой сайт: http://onqtam.com/
9. Шаблоны C++ и базы данных
Сергей Федоров
Когда мы работаем с БД, мы зачастую получаем сырые буферы, в то время как хочется получать данные в виде структур, классов и контейнеров C++.
Рассказ о проектировании и реализации драйвера PostgreSQL с человеческим интерфейсом с применением почти всех доступных на данный момент языковых средств C++17.
Описанный в докладе подход можно адаптировать практически к любому протоколу уровня приложений.
О докладчике
Сергей Федоров — ведущий разработчик в «Яндекс.Такси», занимается разработкой асинхронного фреймворка для бэкенда Такси. Большой любитель метапрограммирования и open source.
8. Move-only C++ design
Ivan Čukić
RAII отпускает захваченные ресурсы. Но есть ресурс, который не вернуть — это время.
Одна из наиболее затратных по времени ошибок — создание ненужных копий. Move-семантика C++11 сделала шаг в правильном направлении. Она позволяет отдать ненужные данные кому-то еще без штрафа на создание копии и без риска гонок по данным, когда у данных много пользователей.
В этом докладе мы поучаствуем в обсуждении подхода к архитектуре, который разрешает использование только специальных некопируемых перемещаемых типов под названием «линейные типы». Будут обсуждаться возможности C++, которые позволят форсировать использование именно таких типов.
Для этого предлагается использовать концепты из C++20, &&-квалифицированные функции и т.п.
О докладчике
Иван Чукич — автор книги «Functional Programming in C++», опубликованной издательством Manning. Контрибьютит в KDE — один из самых больших свободных опенсорсных проектов. Кроме того, он преподает современные техники программирования в университете, передавая студентам свой 20-летний опыт использования C++. Он занимался исследованиями функционального программирования на C++ во время постдока и до него и использовал эти техники в реальных проектах.
7. Concurrency and parallelism in C++17 and C++20/23
Rainer Grimm
Что общего между тредами, атомиками, мьютексами и условными переменными? Все это — базовые блоки для построения любых многопоточных приложений в C++, и они могут доставить проблем даже опытным разработчикам на C++.
Эта ситуация серьезно поменялась в C++17, и еще больше — в C++20/23. Начиная с C++17, большинство стандартных алгоритмов доступны в последовательной, параллельной и векторизованной форме. В свежих стандартах мы ожидаем executors и transactional memory, можно ожидать больших улучшений в futures и coroutines. Для многопоточности и параллелизма это — только начало. Есть надежда, что в будущем в абстракциях будут использоваться только они (executors, transactional memory, futures, coroutines), а треды, атомики, мьютексы и условные переменные станут всего лишь деталями реализации.
Цель этого доклада — посмотреть, что мы уже получили в C++17 и на что можно надеяться в C++20/23.
О докладчике
Райнер Гримм работает архитектором, тимлидом и инструктором около 20 лет. В свободное время любит писать статьи о C++, Python и Haskell и выступать на конференциях, часто пишет в свой блог «Modern C++». Сейчас он ведет семинары по современному C++ и Python. Его книги «C++11 für Programmierer», «C++», «C++ Standardbibliothek» и «The C++ Standard Library» публикуются как издательством O'Reilly, так и в Leanpub.
6. Метапрограммирование, щадящее компилятор
Андрей Давыдов
Любой окунувшийся в мир C++ программист знает, что шаблоны тьюринг-полные, «substitution failure is not an error» и в compile-time можно делать удивительные, а иногда даже полезные вещи. С другой стороны, опытный С++ разработчик понимает, что «можно» не значит «нужно» и что за злоупотребление метапрограммированием приходится платить. Один из основных сдерживающих факторов — время компиляции, поэтому в докладе рассматривается, какие операции/техники наиболее дороги с точки зрения компилятора и как их можно избегать.
В частности, были освещены следующие вопросы:
- почему SFINAE — это последнее, что нужно использовать;
- почему std::conditional_t определен неэффективно;
- в чем разница между реализациями tuple в Microsoft STL и libc++;
- когда стоит использовать std::{conjunction,disjunction}, а когда — fold expressions;
- почему не стоит использовать std::void_t;
- как появляющиеся в C++20 концепты могут помочь.
О докладчике
Последние 3 года Андрей работает в команде ReSharper C++ в JetBrains. В прошлом занимался промышленным программированием в областях, связанных с ГИС-ами и системами 3D-визуализации.
5. Незаменимый С++
Антон Полухин
Каждый новомодный язык программирования норовит заявить о том, что он быстрее, надёжнее и вообще по всем параметрам в несколько раз лучше C++.
Давайте разберёмся — где правда, а где вымысел. Да начнётся битва между C++ и Asm/Rust/Go/Java/C#… !
О докладчике
Представитель России в ISO на международных заседаниях рабочей группы по стандартизации C++. Автор нескольких принятых предложений к стандарту языка C++.
Aвтор Boost-библиотек TypeIndex, DLL, Stacktrace и активный maintainer Any, Conversion, LexicalCast, Variant.
Автор книг «Boost C++ Application Development Cookbook» и «Boost C++ Application Development Cookbook, Second Edition».
4. Postmodern immutable data structures
Juan Pedro Bolívar Puente
Элита C++ годами говорит о value semantics, immutability и sharing by communicating. Нас ждет лучший мир без мьютексов, гонок, обсерверов, паттернов «команда» и всего такого прочего. Когда же доходит до практики, есть большие проблемы. Одна из основных проблем — в структурах данных.
Неизменяемые структуры данных не меняют значений, чтобы работать с ними — нужно создавать новые значения. Старые значения остаются лежать как есть, и поэтому с ними можно работать из нескольких потоков без блокировок. Это дает нам структурное разделение ресурсов, потому что новые и старые значения могут пользоваться одними и теми же общими данными — их можно быстро сравнивать и очень компактно хранить undo-history. Именно поэтому их так приятно использовать в многопоточных и интерактивных системах: они упрощают архитектуру десктопного софта и позволяют серверам лучше масштабироваться. Это — секретный ингредиент, определивший успех Clojure и Scala, и даже JavaScript-разработчики любят использовать их с помощью чего-то вроде Immutable.js, разработанного в Facebook.
Juan же представляет Immer, библиотеку для C++, которая реализует современные эффективные неизменяемые структуры данных.
В этом докладе он говорил об архитектурных преимуществах неизменяемости и показал, как чрезвычайно эффективный и мощный персистентный вектор можно построить на основе современных структур данных, доведенных до совершенства (Relaxed Radix Balanced Trees). Посмотрели на программу-пример — текстовый редактор, разработанный в таком архитектурном стиле. Код не просто супер-простой, он еще и обогнал по производительности большинство похожих программ. Не верите? Откройте доклад и удостоверьтесь сами!
Используемые технологии:
- https://github.com/arximboldi/immer
- https://github.com/arximboldi/ewig
- https://github.com/arximboldi/lager
О докладчике
Juan — консультант-фрилансер и инженер из Берлина, специализирующийся на value oriented design, интерактивном ПО, современном C++, функциональном программировании и стратегическом использовании open source. До этого он работал в Ableton и занимался различными проектами, связанными с музыкой. Кроме того, он участвовал в проекте GNU и стал сооснователем Hacklab в Гранаде.
3. Концепты: упрощаем реализацию классов std utility
Андрей Давыдов
Появляющиеся в C++20 концепты — давно и широко обсуждаемая тема. Несмотря на избыток материала, накопившегося за годы (в т.ч. выступления экспертов мирового уровня), среди прикладных программистов (не засыпающих ежедневно в обнимку со стандартом) все еще остается неразбериха, что же такое С++20-концепты и так ли они нам нужны, если есть проверенный годами enable_if. Частично виной тому то, как концепты эволюционировали за ~15 лет (Concepts Full + Concept Map -> Concepts Lite), а частично то, что концепты получились непохожими на аналогичные средства в других языках (Java/С# generic bounds, Rust traits, …).
Доклад начнется с краткого обзора concept-related нововведений C++20, после чего мы посмотрим на реализацию некоторых классов и функций STL, сравнивая C++17 и С++20-решения. К примеру:
- для реализации std::optional сейчас приходится использовать иерархию наследования глубины 7, в С++20 это будет не нужно;
- для default-конструктора std::pair сейчас требуется 2 шаблонные функции, в С++20 — 1 нешаблонная;
- часто шаблонные классы частично специализируются, в случае, когда у шаблонных параметров есть какие-то специальные свойства, c концептами это делать удобнее и правильнее.
От слушателей предполагается общее представление, что такое концепты и SFINAE. Также будет полезно знакомство со стандартной библиотекой C++, знание тонкостей и деталей реализации не требуется.
О докладчике
Последние 3 года Андрей работает в команде ReSharper C++ в JetBrains. В прошлом занимался промышленным программированием в областях, связанных с ГИС-ами и системами 3D-визуализации.
2. Initialisation in modern C++
Timur Doumler
Общеизвестно, что семантика инициализации — одна из наиболее сложных частей C++. Существует множество видов инициализации, описываемых разным синтаксисом, и все они взаимодействуют сложным и вызывающим вопросы способом. C++11 принес концепцию «универсальной инициализации». К сожалению, она привнесла еще более сложные правила, и в свою очередь, их перекрыли в C++14, C++17 и снова поменяют в C++20.
В этом докладе Тимур вначале подвел исторические итоги эволюции инициализации в С++. Он дал системный обзор текущего варианта правила инициализации, типичных проблем и сюрпризов. Представил практичные правила того, как использовать все эти правила эффективно. И наконец, Тимур рассказал о свежих предложениях в стандарт, которые могут сделать семантику инициализации C++20 немного более удобной.
О докладчике
Тимур — С++ разработчик, специализирующийся на звуке и музыке, член комитета ISO C++, программный директор Audio Developer Conference (ADC). Он стремится писать чистый код, разрабатывая хорошие инструменты, продвигая эволюцию языка C++ и выстраивая инклюзивные сообщества.
1. C++17 — the biggest traps
Nicolai Josuttis
C++17 — это огромная комбинация небольших новых возможностей, как в языке, так и в библиотеке. Эти возможности не только позволяют делать вам больше нового, но и предоставляют новые способы стрелять по ногам — куда чаще, чем вы ожидали. Это не теория. Это происходит в реальной жизни, здесь и сейчас.
В этом докладе Николай разобрал все эти ловушки, обсудил причины лежащих за ними идей и архитектуры, дал указания, как обходить проблемы. В качестве побочного эффекта вы сможете глубже познакомиться с новыми возможностями C++17.
О докладчике
Николай — независимый системный архитектор, технический менеджер, автор и консультант. Он разрабатывает средине и большие программные системы для телекоммуникации, финансов и обрабатывающей промышленности.
Он широко известен в сообществе своими докладами и тем, что пишет книги про C++ (The C++ Standard Library and C++ Templates), рассказывает о новых возможностях языка.
Уже в течение 20 лет он — активный член комитета по стандартизации С++.
Полный плейлист со всеми докладами доступен по ссылке. Напоминаем, что новая C++ Russia уже на подходе и состоится 31 октября – 1 ноября 2019 года в Санкт-Петербурге. Билеты на нее можно приобрести на официальном сайте.
Автор: Олег Чирухин