Корутины, компиляторы, кодогенерация и другие «ко...» грядущей C++ Russia
Как известно, в мире C++ много способов причинить себе боль, но также много высокой производительности, нетипичных амбициозных задач и прочего увлекательного хардкора. Ну и ещё известно, что плюсовиков хлебом не корми, дай немножко похоливарить про Rust или Go.
А в программе C++ Russia нашлось место всему этому: будут доклады и о производительности, и о специализированных задачах вроде систем реального времени, и о способах уменьшить боль. И ещё немножко про Rust и Go. А ещё про микросервисы (тут расскажет @antoshkka) и, внезапно, про советские компиляторы.
В начале июня пройдёт онлайн-часть конференции, 26 июня — офлайн-часть, а сейчас про обе сразу можно узнать, какие доклады там будут.
Оглавление
Возможности новых стандартов
Учимся готовить C++ корутины на практике, часть 2: генераторы
Корутины недавно вошли в стандарт C++20 и пока что остаются малоизученной областью с точки зрения их практического применения, но уже сейчас понятно, что это довольно мощный инструмент.
На данный момент в стандартной библиотеке нет готовых удобных пользователю средств, которые можно было бы сразу начать использовать. Однако появилось несколько библиотек, реализующих такие примитивы.
Это выступление можно считать продолжением доклада Павла с прошлой конференции. В этот раз фокус направлен на часть корутин, отвечающую за генераторы. Вы узнаете о том, как работают корутины, о ключевом слове co_yield
и о том, как концептуально устроены простые и асинхронные генераторы.
Доклад будет полезен тем, кто хочет использовать корутины C++20 на практике. Мы считаем, что доклады на эту тему приближают их проникновение в реальный код на C++.
Reflection TS: будущее рефлексии в C++
Orion Innovation
Сказать, что в C++ рефлексии совсем нет, будет неправдой: можно узнать, существуют ли между классами отношения наследования, является ли некий тип перечислением, и, даже, возможно получить список типов аргументов функции. Но, конечно, до Python и C# ещё далеко.
С появлением Reflection TS дистанция наконец-то начала уменьшаться. Все мы ощущаем, что рефлексия медленно, но верно приближается к включению в стандарт языка. Важно следить за этим прогрессом, чтобы не пропустить тот самый момент.
Александр расскажет про изменения, которые привносит спецификация Reflection TS: её возможности и ограничения. Также будет шанс опробовать новинку в деле: спикер на интересных практических примерах покажет, как использовать рефлексию не только для сериализации.
Если надоело писать boilerplate-код или заниматься кодогенерацией с помощью сторонних инструментов, вам будет интересно послушать.
Software Design
(Core) библиотеки: идеи и примеры
Лаборатория Касперского
Нечасто можно встретить в одном докладе сравнительный обзор различных библиотек. Александр хочет взглянуть на core-библиотеки не просто с позиции их содержания, но и с критическим взглядом на их интерфейсы.
Он рассмотрит Abseil и Folly, а также расскажет про GMock, GBenchmark и Boost. Посмотрим, какие у них есть плюсы и нужно ли их использовать в 2022 году.
Рекомендуем доклад всем, кто хочет выбрать для себя библиотеку общего назначения в дополнении к стандартной.
Why Сlean Сode is not the Norm?
Качество кода — это всегда проблема. Кто-нибудь скажет: «пишите хороший код, а плохой не пишите» или «нормально делай — нормально будет». Но эти пустые максимы никак не приближают нас к качественному коду. А что приближает — можно узнать из доклада.
На C++ Russia 2022 Шандор Дарго проанализирует объективные причины низкого качества кода и объяснит, почему чистый код все еще не норма. А также почему мы вечно виним других, но это плохая идея.
Шандор — опытный разработчик и автор блога, где, в том числе, уделяется внимание чистоте кода.
Доклад для тех, кто хочет найти ответы на вечные вопросы про качество кода: «Что делать?» и «Кто виноват?»
Embedded software bus: платформонезависимая библиотека публикации-подписки для встраиваемых систем реального времени
Catalyst Aerospace Technologies
Иван — основатель компании, производящей воздушные суда с автопилотом. Так что ему хорошо знаком мир встраиваемых систем, где требования по быстродействию и отказобезопасности особые. Понятно, что тут свои требования к перформансу и безопасности. Иван поговорит о решении проблемы переносимости программных функций между различными платформами (OS + HW) для подобных систем.
Библиотека, о которой пойдет речь, обобщает взаимодействие функций на уровне внутрипоточного, межпоточного и межпроцессного взаимодействия. Такая библиотека может быть фактически единственной зависимостью для проекта и единственным IPC.
Доклад поможет разработчикам отказобезопасных встраиваемых систем и систем реального времени. Вы узнаете про парадигму software in the loop, hardware in the loop, а также в целом про то, как разрабатываются программы для летающих беспилотников. Тех, кому интересно, как с минимальными затратами создавать мелкосерийное ПО и железо — тоже приглашаем к участию.
Автоматизация программирования в СССР: субъективный обзор незаслуженно забытых теоретических результатов
РТУ МИРЭА
Многие читали современную литературу про компиляторы. Некоторые читали советскую литературу про компиляторы 60–80-х годов. Но совсем никто не пытался сопоставить, что было тогда, что есть сейчас и как это связано.
Пётр попытается построить такой мостик и составить полную картину, включающую не только западных ученых, но и их советских коллег.
Он поговорит о достижениях в областях компиляции в 50–70 годах ХХ века, а также об актуальности многих теоретических результатов того времени. Изложение иллюстрируется рядом практических примеров.
Всем, кто интересуется вопросами компиляторостроения, историей IT, классическими алгоритмами и ключевыми персонами в этой сфере.
Инструменты
Межмодульный анализ C++ проектов
PVS-Studio
Олег поговорит о том, как технология межмодульного анализа влияет на качество предупреждений, выдаваемых компиляторами и анализаторами кода.
Во время работы анализатор проверяет только один исходный файл, не имея информации о том, что находится в других файлах проекта. Межмодульный анализ позволяет дать информацию анализатору о полной структуре проекта, делая анализ более точным и качественным. Это очень схоже с задачей оптимизации на этапе компоновки (Link Time Optimization, LTO). Таким образом, анализатор может узнать поведение той или иной внешней функции из другого файла проекта и выдать срабатывание, к примеру, на разыменование нулевого указателя, переданного как аргумент внешней функции.
Доклад будет интересен С++ программистам, которые хотят больше узнать о возможностях компилятора, посмотреть на технологии, которые используются в статическом анализе, и узнать про интересные ошибки, найденные в известных проектах с помощью этих технологий.
Nobody Can Program Correctly: Lessons from 20 Years of Debugging C++ Code
think-cell
На конференциях часто рассказывают о конкретных инструментах для отладки кода. Но что, если взглянуть на весь процесс отладки сверху? Себастьян из think-cell подходит к этой теме именно так — рассматривая отладку целиком как процесс.
Уже 20 лет он занимается отладкой C++ кода, а теперь поделится с вами идеями и выводами, сделанными за это время. Вы узнаете:
что делать в первую очередь, когда программа упала;
какие вопросы себе задать;
какая информация нужна для отладки;
как найти причину ошибки;
какие инструменты помогут нам в этом поиске;
что сделать, чтобы баг не повторился.
Экосистема вокруг ОС: какие инструменты нужны разработчику?
Лаборатория Касперского
Операционная система здорового человека должна не просто исполнять запросы программ, их загрузку и выполнение — она должна еще и предоставлять экосистему для разработчиков, которая упрощает разработку ПО под эту систему.
Арсений создавал средства разработки для KasperskyOS. Поэтому в своем докладе он не только разберет плюсы и минусы известных SDK различных систем, но и расскажет об уникальных чертах в SDK Kaspersky OS.
Этот доклад организован как обзор нескольких экосистем вокруг ОС (Android NDK, Fuchsia IDK, Tizen SDK и прочих), на примере которых спикер сформулирует представление об идеальной экосистеме С++ разработчика.
Также поговорим о новинках в KasperskyOS SDK и о том, как там стараются упростить жизнь разработчику.
Практичный С++
Монолит vs Микросервисы, и Как эффективно работать с последними в C++
Яндекс Go
Микросервисы многим уже набили оскомину, но в контексте C++ тема работы с ними остаётся актуальной. Хороших фреймворков нет, все пилят что-то своё.
Давным-давно, лет пять назад, в Такси была монолитная архитектура. И жили с этим нормально… пока монолит не стал огромных размеров и не начались проблемы. Как эти проблемы преодолевались, к чему пришли, для чего нужен собственный фреймворк userver и как он устроен — об этом поведает непосредственный участник событий.
Антона представлять особо не надо: это известнейший участник сообщества, частный докладчик наших конференций и член комитета по стандартизации языка. Его выступление может помочь тем, у кого код работает под большой нагрузкой. Разработчикам фреймворков для создания микросервисов — тоже.
A Practical Approach to Error Handling
think-cell Software
С обработкой ошибок приходится иметь дело всем, но вот как именно это делать — неочевидный вопрос. Понятно, что если игнорировать их все, это сделает программу абсолютно ненадежной. Но только пытаться предусмотреть все возможные ошибки без исключения значит чересчур усложнять программу с минимальной пользой. В think-cell используют и совершенствуют свой собственный принципиальный подход к обработке ошибок. Арно расскажет про их оригинальный подход, чтобы в следующем проекте вы смогли писать более надежное ПО с меньшими усилиями.
Доклад может быть интересен разработчикам любого уровня, так как с обработкой ошибок сталкиваются все.
С++ лямбда-идиомы
JetBrains
Лямбды в C++ чрезвычайно полезны, но немногие умеют ими по-настоящему пользоваться. А главное, далеко не все следят за их эволюцией в стандартах языка, полагаясь лишь на общие представления об этой сущности.
Появившиеся в С++11 лямбда-выражения уже были мощным и полезным инструментом в языке. Каждое последующее обновление стандарта добавляло новые возможности для лямбд: в С++14 появились generic лямбды и захваты с инициализатором, в С++17 — constexpr лямбды, в С++20 — default-construction и assignment лямбд, явные шаблонные параметры и другое. В грядущем стандарте С++23 будет еще больше интересных возможностей.
Тимур детально разберет эволюцию лямбд в C++ вплоть до ожидаемого С++ 23. Он рассмотрит ряд интересных паттернов программирования с лямбдами. Некоторые из них — это уже хорошо известные идиомы; другие — менее известные и даже неожиданные. Обсуждается наследование от лямбд с использованием pack expansion, три разных метода вызвать лямбду рекурсивно, ответ на вопрос «что произойдет, если мы присвоим немедленно вызываемое лямбда-выражение статическому объекту» и многое другое.
Обычно доклады структурированы «по горизонтали», то есть по стандартам языка. А здесь группировка именно «вертикальная», то есть разбирается конкретная фича в своей эволюции сквозь стандарты.
Доклад посвящается всем, кто хочет научиться использовать лямбды в C++, и всем, кому интересны их возможности в современных стандартах.
Запускаем почти произвольный код через WebAssembly на backend-end
VK
Часто при разработке сложного продукта внутри заводят скриптовый язык для «упрощения» работы. А что делать, если хочется еще один скриптовый язык или хочется заменить предыдущий язык?
Виртуальная машина wasm позволяет запускать произвольный код на различных скриптовых языках, вроде JS, Python или Lua, в едином окружении и одновременно.
Александр расскажет о достаточно необычном сценарии применения wasm. Многие думают, что wasm — это только для браузера. Это не так — его запускают и на бэкенде. Вы также услышите про все ограничения серверных приложений созданных на базе виртуальной машины wasm и связанные с этим возможности. Никто не рассматривал wasm как lingua franca для многоязычных систем, написанных с применением разных скриптовых языков. Никто не мерил производительность таких систем.
Всем, кому нужно комбинировать несколько языковых движков в одном серверном приложении. Странно и больно, но возможно.
Что происходит внутри браузера
VK
Веб-браузер — незаменимый софт в жизни любого человека. Несмотря на то, что код для современных браузеров пишется в основном на JS, сами браузеры в массе своей написаны на С++.
Алексей подробно и с примерами опишет взаимодействие JS и C++ внутри браузера. В докладе разбирается современный процесс отображения интернет-страниц. Спикер покажет, что там скрывается под капотом и как JS, HTML и CSS-код преобразуется в C++: как это все компонуется вместе, управляется, рисуется и отображается. Будет и погружение в V8, Blink, Render и View.
Кстати, в процессе доклада будет возможность написать свое расширение стандарта для HTML-кода. Это явно подойдет тем, кто хочет узнать, как в современном мире работает браузер.
Сырые безопасные указатели в Chromium. MiraclePtr
VK
Самая большая проблема безопасности в браузерах на основе Chromium — это ошибки, связанные с использованием объектов после их освобождения/уничтожения. Некоторые из этих багов удается эксплуатировать.
Александр Жиров на предстоящей C++ Russia расскажет, как для решения этой проблемы внедряется и используется MiraclePtr aka raw_ptr aka BackupRefPtr.
Производительность
Практики оптимизации производительности на примере ClickHouse
ClickHouse
ClickHouse делает упор на скорость, вопрос оптимизации производительности для этого проекта самый главный. Максим объяснит, как именно оптимизируют производительность в ClickHouse: перформанс-тесты и практики.
Он провел много времени, ускоряя эту СУБД с разных слоёв абстракции, и накопил хороший опыт, помогающий взглянуть на проблемы производительности с наиболее подходящей точки зрения. В рамках доклада он расскажет про инфраструктуру, которая используется для анализа производительности запросов и нахождения мест, которые следует оптимизировать. Также обсудим и выбор структуры данных, библиотек, написание специализаций.
Вы любите векторизовать SIMD-алгоритмы, или знаете как шаблонными специализациями ускорить конкретные алгоритмы? Тогда вам будет интересно.
В качестве бонуса вы услышите про нестандартные трюки — как на ровном месте можно ускорить неускоряемые вещи.
Доклад про декомпилятор GPGPU
Судо
Судо
У нас уже был доклад «Программируем видеокарты: введение в основные виды GPGPU-оптимизаций». Это своего рода продолжение.
C++ разработчики все больше интересуются вычислениями с использованием GPU. Ведь это можно рассматривать как очередной способ ускорить выполнение программы.
Михаил и Кристина расскажут, что еще может сделать разработчик после того, как применил все классические оптимизации из курсов по GPGPU. Кроме того, они проанализируют несколько алгоритмов, применяемых в декомпиляторах, и их адаптации для архитектуры видеокарт. Вы узнаете, как разработка декомпилятора позволила найти узкие места и ускорить алгоритмы на GPGPU.
Любите копаться в ассемблере или интересуетесь GPGPU? Заходите послушать.
Файловый и сетевой стек в Userland: почему их нужно использовать в 2022 году
OKTET Labs
I/O-перформанс становится все популярнее, и вот почему:
появляется больше ядер;
PCIe Gen3 наконец-то уступает место PCIe Gen5 и перестает быть узким местом;
драйверы NVMe и 200G NIC означают, что сеть становится быстрее.
Стеки которые были «ну, ок» в прошлом — теперь не ок. Невозможно увеличивать мощность железа и в то же время заниматься переключением контекста и прочим. И то, что раньше было «одним из вариантов», сейчас то, что нужно для приложений с высокой производительностью. Всё это можно будет обсудить с Константином — одним из разработчиков высокопроизводительного user space сетевого стека Open Onload.
Доклад понравится разработчикам, которым важна производительность их сетевых приложений.
Память как концепция в гетерогенных системах
МФТИ
C++ разработчики хорошо знают, что такое память и полагают, что имеют над ней контроль. Но много ли известно о памяти на GPU?
Внезапно многие привычные концепции из мира C++ ломаются, а создание single-source слоев абстракции (таких как SYCL) требует введения большого количества странных для CPU понятий и терминов. Всё это, конечно, влияет на производительность.
Константин расскажет про память, как ее понимают в C++ и как ее понимают для графики, и покажет много примеров на SYCL.
Это доклад — уже не введение в технологию, а более глубокий уровень работы с гетерогенной памятью GPU. Он будет полезен всем, кто хочет глубже погрузиться в мир программирования на GPU.
Безопасность
Украшаем молоток: как автоматизировать разбор проблем в дебаггере
Лаборатория Касперского
Сергей поделится наработками Лаборатории Касперского по использованию отладчиков под различные платформы. Он покажет подходы к автоматизации разбора проблем и проведет лайвкодинг-демонстрацию нескольких скриптов в отладчике.
Будучи автором тех инструментов, о которых пойдёт речь, он не ограничится рассказом про готовые скрипты для отладчиков, но и раскроет принципы их устройства.
Итого, обсудим:
1. Поиск исключений, произошедших в потоке ранее (Win).
2. Вывод стеков 32-битного приложения для 64-битного kernel-mode дампа (Win).
3. Поиск потребителей большого количества памяти:
4. Что делать, если упали в boost: coroutine (GDB).
Будут и жизненные примеры, взятые из реальных продов, которые отвечают текущим запросам индустрии разработки.
Распределение демонстрируемых кейсов между Windows и Linux ~ 50/50.
Безопасный дизайн на С++
Лаборатория Касперского
Среди современных языков методы безопасной разработки особенно важны для C++, про способы сделать себе хуже с его помощью сказано уже многое.
В этом докладе делается обзор подхода «secure by design», при котором безопасность (security/safety) достигается путем изначально правильного проектирования, а не за счет устранения уязвимостей по факту их выявления.
Сергей рассмотрит паттерны безопасного дизайна и примеры их использования на С++. Он непосредственно занимается внедрением практик безопасного кодирования в различные продукты и не понаслышке знаком с реальным практическим использованием этих практик.
Посвящается разработчикам, которые думают над безопасностью своих приложений.
Системное программирование
Голый Rust
Parity Technologies
Роман покажет внутреннее устройство std/core языка Rust: примитивы и подходы, которые можно применить как для низкоуровневого программирования (модуля ядра Linux, под микроконтроллеры), так и высокоуровневого, в том числе и многопоточного.
Go и мир системного программирования
Используя язык C++ как основной инструмент работы, важно не забывать посматривать и на развитие других языков.
Часто Go, наряду с C, C++, Rust и Zig, называют «системным языком программирования». Алексей предлагает обсудить, насколько это правда, и что вообще подразумевается под термином «системный язык».
Будет возможность написать пару несложных приложений и библиотек, которые обычно пишут на «системных языках программирования», и посмотреть, какую цену за это придется заплатить.
Метапрограммирование
Декларативное метапрограммирование: обработка списков на этапе компиляции
N-able Technology
Механизм шаблонов в языке C++ позволяет построить библиотеку достаточно сложных алгоритмов обработки списков, включающих поэлементное преобразование, фильтрацию, поиск и сортировку. Для реализации таких алгоритмов подходит декларативный стиль. На примере обработки списков Вадим продемонстрирует метод декларативного метапрограммирования.
Захотелось увидеть это всё? Есть два разных способа. Если брать билет «онлайн + офлайн», то сможете первые дни смотреть на мониторе, а вот 26 июня встретиться вживую в Санкт-Петербурге.
Если вы далеко от Петербурга, есть и другой вариант. Можно купить онлайн-билет, тогда в первой части для вас ничего не изменится, а вторую будете смотреть в трансляции.
Что бы вы ни выбрали — будем рады видеть. Билеты, расписание и прочие подробности — на сайте конференции.