Корутины, компиляторы, кодогенерация и другие «ко...» грядущей C++ Russia

fe5ddc7c5d78e58823347dc8a17a5cda.jpeg

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

А в программе C++ Russia нашлось место всему этому: будут доклады и о производительности, и о специализированных задачах вроде систем реального времени, и о способах уменьшить боль. И ещё немножко про Rust и Go. А ещё про микросервисы (тут расскажет @antoshkka) и, внезапно, про советские компиляторы.

В начале июня пройдёт онлайн-часть конференции, 26 июня — офлайн-часть, а сейчас про обе сразу можно узнать, какие доклады там будут.

Оглавление

Возможности новых стандартов

Учимся готовить C++ корутины на практике, часть 2: генераторы

5865b388d16a7156510380a1be8cc4e0.jpegПавел Новиков

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

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

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

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

Reflection TS: будущее рефлексии в C++

98ba9d5298b0b34fb76cfa8a5f337066.jpegАлександр Ганюхин

Orion Innovation

Сказать, что в C++ рефлексии совсем нет, будет неправдой: можно узнать, существуют ли между классами отношения наследования, является ли некий тип перечислением, и, даже, возможно получить список типов аргументов функции. Но, конечно, до Python и C# ещё далеко. 

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

Александр расскажет про изменения, которые привносит спецификация Reflection TS: её возможности и ограничения. Также будет шанс опробовать новинку в деле: спикер на интересных практических примерах покажет, как использовать рефлексию не только для сериализации.

Если надоело писать boilerplate-код или заниматься кодогенерацией с помощью сторонних инструментов, вам будет интересно послушать. 

Software Design

(Core) библиотеки: идеи и примеры

4681ea0e60d25111fe404c347e4690ac.jpegАлександр Еналдиев

Лаборатория Касперского

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

Он рассмотрит Abseil и Folly, а также расскажет про GMock, GBenchmark и Boost. Посмотрим, какие у них есть плюсы и нужно ли их использовать в 2022 году.

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

Why Сlean Сode is not the Norm?

bf426b2b3cb0c3fcc512da147a314ebd.jpegSandor Dargo

Качество кода — это всегда проблема. Кто-нибудь скажет: «пишите хороший код, а плохой не пишите» или «нормально делай — нормально будет». Но эти пустые максимы никак не приближают нас к качественному коду. А что приближает — можно узнать из доклада.

На C++ Russia 2022 Шандор Дарго проанализирует объективные причины низкого качества кода и объяснит, почему чистый код все еще не норма. А также почему мы вечно виним других, но это плохая идея.

Шандор — опытный разработчик и автор блога, где, в том числе, уделяется внимание чистоте кода.

Доклад для тех, кто хочет найти ответы на вечные вопросы про качество кода: «Что делать?» и «Кто виноват?»

Embedded software bus: платформонезависимая библиотека публикации-подписки для встраиваемых систем реального времени

63accc21eade7468c918cc0520e3ed74.jpegИван Макаров

Catalyst Aerospace Technologies

Иван — основатель компании, производящей воздушные суда с автопилотом. Так что ему хорошо знаком мир встраиваемых систем, где требования по быстродействию и отказобезопасности особые. Понятно, что тут свои требования к перформансу и безопасности. Иван поговорит о решении проблемы переносимости программных функций между различными платформами (OS + HW) для подобных систем.

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

Доклад поможет разработчикам отказобезопасных встраиваемых систем и систем реального времени. Вы узнаете про парадигму software in the loop, hardware in the loop, а также в целом про то, как разрабатываются программы для летающих беспилотников. Тех, кому интересно, как с минимальными затратами создавать мелкосерийное ПО и железо — тоже приглашаем к участию.

Автоматизация программирования в СССР: субъективный обзор незаслуженно забытых теоретических результатов

d281dc9c1151c632cb3918838e93733a.jpegПетр Советов

РТУ МИРЭА

Многие читали современную литературу про компиляторы. Некоторые читали советскую литературу про компиляторы 60–80-х годов. Но совсем никто не пытался сопоставить, что было тогда, что есть сейчас и как это связано. 

Пётр попытается построить такой мостик и составить полную картину, включающую не только западных ученых, но и их советских коллег.

Он поговорит о достижениях в областях компиляции в 50–70 годах ХХ века, а также об актуальности многих теоретических результатов того времени. Изложение иллюстрируется рядом практических примеров.

Всем, кто интересуется вопросами компиляторостроения, историей IT, классическими алгоритмами и ключевыми персонами в этой сфере.

Инструменты

Межмодульный анализ C++ проектов

19aaa1f5f12386c9694392795c0717e6.jpegОлег Лысый

PVS-Studio

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

Во время работы анализатор проверяет только один исходный файл, не имея информации о том, что находится в других файлах проекта. Межмодульный анализ позволяет дать информацию анализатору о полной структуре проекта, делая анализ более точным и качественным. Это очень схоже с задачей оптимизации на этапе компоновки (Link Time Optimization, LTO). Таким образом, анализатор может узнать поведение той или иной внешней функции из другого файла проекта и выдать срабатывание, к примеру, на разыменование нулевого указателя, переданного как аргумент внешней функции.

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

Nobody Can Program Correctly: Lessons from 20 Years of Debugging C++ Code

ee2d08d012546191eff29453ab38c5b3.jpegSebastian Theophil

think-cell

На конференциях часто рассказывают о конкретных инструментах для отладки кода. Но что, если взглянуть на весь процесс отладки сверху? Себастьян из think-cell подходит к этой теме именно так — рассматривая отладку целиком как процесс.

Уже 20 лет он занимается отладкой C++ кода, а теперь поделится с вами идеями и выводами, сделанными за это время. Вы узнаете:

  • что делать в первую очередь, когда программа упала;

  • какие вопросы себе задать;

  • какая информация нужна для отладки;

  • как найти причину ошибки;

  • какие инструменты помогут нам в этом поиске;

  • что сделать, чтобы баг не повторился.

Экосистема вокруг ОС: какие инструменты нужны разработчику?

328a25af6b04839c1f4b63d80d565520.jpegАрсений Сапелкин

Лаборатория Касперского

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

Арсений создавал средства разработки для KasperskyOS. Поэтому в своем докладе он не только разберет плюсы и минусы известных SDK различных систем, но и расскажет об уникальных чертах в SDK Kaspersky OS.

Этот доклад организован как обзор нескольких экосистем вокруг ОС (Android NDK, Fuchsia IDK, Tizen SDK и прочих), на примере которых спикер сформулирует представление об идеальной экосистеме С++ разработчика. 

Также поговорим о новинках в KasperskyOS SDK и о том, как там стараются упростить жизнь разработчику.

Практичный С++

Монолит vs Микросервисы, и Как эффективно работать с последними в C++

2235cb34d195e63f9dc8dfa2255742d2.jpegАнтон Полухин

Яндекс Go

Микросервисы многим уже набили оскомину, но в контексте C++ тема работы с ними остаётся актуальной. Хороших фреймворков нет, все пилят что-то своё.

Давным-давно, лет пять назад, в Такси была монолитная архитектура. И жили с этим нормально… пока монолит не стал огромных размеров и не начались проблемы. Как эти проблемы преодолевались, к чему пришли, для чего нужен собственный фреймворк userver и как он устроен — об этом поведает непосредственный участник событий.

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

A Practical Approach to Error Handling

94afcb04e239e3dc2babb976109fb054.jpegArno Schoedl

think-cell Software

С обработкой ошибок приходится иметь дело всем, но вот как именно это делать — неочевидный вопрос. Понятно, что если игнорировать их все, это сделает программу абсолютно ненадежной. Но только пытаться предусмотреть все возможные ошибки без исключения значит чересчур усложнять программу с минимальной пользой. В think-cell используют и совершенствуют свой собственный принципиальный подход к обработке ошибок. Арно расскажет про их оригинальный подход, чтобы в следующем проекте вы смогли писать более надежное ПО с меньшими усилиями.

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

С++ лямбда-идиомы

f0a77107be44e51d6dd674767fbd6cf8.jpegТимур Думлер

JetBrains

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

Появившиеся в С++11 лямбда-выражения уже были мощным и полезным инструментом в языке. Каждое последующее обновление стандарта добавляло новые возможности для лямбд: в С++14 появились generic лямбды и захваты с инициализатором, в С++17 — constexpr лямбды, в С++20 — default-construction и assignment лямбд, явные шаблонные параметры и другое. В грядущем стандарте С++23 будет еще больше интересных возможностей.

Тимур детально разберет эволюцию лямбд в C++ вплоть до ожидаемого С++ 23. Он рассмотрит ряд интересных паттернов программирования с лямбдами. Некоторые из них — это уже хорошо известные идиомы; другие — менее известные и даже неожиданные. Обсуждается наследование от лямбд с использованием pack expansion, три разных метода вызвать лямбду рекурсивно, ответ на вопрос «что произойдет, если мы присвоим немедленно вызываемое лямбда-выражение статическому объекту» и многое другое.

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

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

Запускаем почти произвольный код через WebAssembly на backend-end

f430a5891082a83d402c27de415f3e42.jpegАлександр Боргардт

VK

Часто при разработке сложного продукта внутри заводят скриптовый язык для «упрощения» работы. А что делать, если хочется еще один скриптовый язык или хочется заменить предыдущий язык?

Виртуальная машина wasm позволяет запускать произвольный код на различных скриптовых языках, вроде JS, Python или Lua, в едином окружении и одновременно.

Александр расскажет о достаточно необычном сценарии применения wasm. Многие думают, что wasm — это только для браузера. Это не так — его запускают и на бэкенде. Вы также услышите про все ограничения серверных приложений созданных на базе виртуальной машины wasm и связанные с этим возможности. Никто не рассматривал wasm как lingua franca для многоязычных систем, написанных с применением разных скриптовых языков. Никто не мерил производительность таких систем. 

Всем, кому нужно комбинировать несколько языковых движков в одном серверном приложении. Странно и больно, но возможно.

Что происходит внутри браузера

65bb25ff80b85b965277f09c5a94b5d4.jpegАлексей Кузнецов

VK

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

Алексей подробно и с примерами опишет взаимодействие JS и C++ внутри браузера. В докладе разбирается современный процесс отображения интернет-страниц. Спикер покажет, что там скрывается под капотом и как JS, HTML и CSS-код преобразуется в C++: как это все компонуется вместе, управляется, рисуется и отображается. Будет и погружение в V8, Blink, Render и View.

Кстати, в процессе доклада будет возможность написать свое расширение стандарта для HTML-кода. Это явно подойдет тем, кто хочет узнать, как в современном мире работает браузер.

Сырые безопасные указатели в Chromium. MiraclePtr

ab5b5d52c2c0156eee3eb3054ab597f9.jpegАлександр Жиров

VK

Самая большая проблема безопасности в браузерах на основе Chromium — это ошибки, связанные с использованием объектов после их освобождения/уничтожения. Некоторые из этих багов удается эксплуатировать. 

Александр Жиров на предстоящей C++ Russia расскажет, как для решения этой проблемы внедряется и используется MiraclePtr aka raw_ptr aka BackupRefPtr.

Производительность

Практики оптимизации производительности на примере ClickHouse

5824a9820685a8dd92c92fd110276fd7.jpegМаксим Кита

ClickHouse

ClickHouse делает упор на скорость, вопрос оптимизации производительности для этого проекта самый главный. Максим объяснит, как именно оптимизируют производительность в ClickHouse: перформанс-тесты и практики.

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

Вы любите векторизовать SIMD-алгоритмы, или знаете как шаблонными специализациями ускорить конкретные алгоритмы? Тогда вам будет интересно. 

В качестве бонуса вы услышите про нестандартные трюки — как на ровном месте можно ускорить неускоряемые вещи.

Доклад про декомпилятор GPGPU

43035106b5d2d560015ba5920d65e37f.jpegМихаил Лукин

Судо

fa49e28b4ccd13526903d5e855fc2c87.jpegКристина Михайленко

Судо

У нас уже был доклад «Программируем видеокарты: введение в основные виды GPGPU-оптимизаций». Это своего рода продолжение.

C++ разработчики все больше интересуются вычислениями с использованием GPU. Ведь это можно рассматривать как очередной способ ускорить выполнение программы.

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

Любите копаться в ассемблере или интересуетесь GPGPU? Заходите послушать.

Файловый и сетевой стек в Userland: почему их нужно использовать в 2022 году

a47648a647837d3e4900404719c586f9.jpegКонстантин Ушаков

OKTET Labs

I/O-перформанс становится все популярнее, и вот почему:

  • появляется больше ядер;

  • PCIe Gen3 наконец-то уступает место PCIe Gen5 и перестает быть узким местом;

  • драйверы NVMe и 200G NIC означают, что сеть становится быстрее.

Стеки которые были «ну, ок» в прошлом — теперь не ок. Невозможно увеличивать мощность железа и в то же время заниматься переключением контекста и прочим. И то, что раньше было «одним из вариантов», сейчас то, что нужно для приложений с высокой производительностью. Всё это можно будет обсудить с Константином — одним из разработчиков высокопроизводительного user space сетевого стека Open Onload.

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

Память как концепция в гетерогенных системах

8ba413215bdbd2f5dd742f35e2e136c4.jpegКонстантин Владимиров

МФТИ

C++ разработчики хорошо знают, что такое память и полагают, что имеют над ней контроль. Но много ли известно о памяти на GPU?

Внезапно многие привычные концепции из мира C++ ломаются, а создание single-source слоев абстракции (таких как SYCL) требует введения большого количества странных для CPU понятий и терминов. Всё это, конечно, влияет на производительность.

Константин расскажет про память, как ее понимают в C++ и как ее понимают для графики, и покажет много примеров на SYCL.

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

Безопасность

Украшаем молоток: как автоматизировать разбор проблем в дебаггере

28ad1cf7c5c8514a9377e8f25f0c34d1.pngСергей Козлов

Лаборатория Касперского

Сергей поделится наработками Лаборатории Касперского по использованию отладчиков под различные платформы. Он покажет подходы к автоматизации разбора проблем и проведет лайвкодинг-демонстрацию нескольких скриптов в отладчике. 

Будучи автором тех инструментов, о которых пойдёт речь, он не ограничится рассказом про готовые скрипты для отладчиков, но и раскроет принципы их устройства.

Итого, обсудим:

1. Поиск исключений, произошедших в потоке ранее (Win).

2. Вывод стеков 32-битного приложения для 64-битного kernel-mode дампа (Win).

3. Поиск потребителей большого количества памяти:

4. Что делать, если упали в boost: coroutine (GDB).

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

Распределение демонстрируемых кейсов между Windows и Linux ~ 50/50.

Безопасный дизайн на С++

8dd4de50e6ba4a87308f85cae67e5ea6.jpegСергей Талантов

Лаборатория Касперского

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

В этом докладе делается обзор подхода «secure by design», при котором безопасность (security/safety) достигается путем изначально правильного проектирования, а не за счет устранения уязвимостей по факту их выявления.

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

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

Системное программирование

Голый Rust

1d05a25c9dc6f074ebfa46c11d07fb35.jpegРоман Проскуряков

Parity Technologies

Роман покажет внутреннее устройство std/core языка Rust: примитивы и подходы, которые можно применить как для низкоуровневого программирования (модуля ядра Linux, под микроконтроллеры), так и высокоуровневого, в том числе и многопоточного.

Go и мир системного программирования

90769f32322df96689cf4aa6b69914f4.jpegАлексей Веселовский

Используя язык C++ как основной инструмент работы, важно не забывать посматривать и на развитие других языков.

Часто Go, наряду с C, C++, Rust и Zig, называют «системным языком программирования». Алексей предлагает обсудить, насколько это правда, и что вообще подразумевается под термином «системный язык». 

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

Метапрограммирование

Декларативное метапрограммирование: обработка списков на этапе компиляции

87759f78c85c3ee1f73d9c3c274bdde3.jpegВадим Винник

N-able Technology

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

Захотелось увидеть это всё? Есть два разных способа. Если брать билет «онлайн + офлайн», то сможете первые дни смотреть на мониторе, а вот 26 июня встретиться вживую в Санкт-Петербурге.

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

Что бы вы ни выбрали — будем рады видеть. Билеты, расписание и прочие подробности — на сайте конференции.

© Habrahabr.ru