Уже скоро стартует С++ Russia. И в преддверии конференции хотим поделиться с хабражителями описаниями докладов.
С++ Russia — это всегда хардкор. В этот раз поговорим про ассемблер, асинхронные движки с корутинами, исключения, GPGPU и многое другое. Будут и низкоуровневые оптимизации, и метапрограммирование, и «кишочки», и конкурентность с многопоточностью.
Среди спикеров будут члены комитета по стандартизации C++, контрибьюторы известных проектов, один из авторов языка Swift (внезапно!), авторы книг и курсов, разработчики из крупных компаний. А также Антон Полухин @antoshkka, сочетающий в себе почти все перечисленное.
Под катом программа с описанием докладов, для вашего удобства разбили ее на тематические блоки.
Практичный С++
Exception Handling: богатый мир обработки исключений
Евгений Ерохин
HyperIntegrate
Сложно найти разработчика на C++, который никогда не пользовался исключениями. Но как они устроены внутри, наверное, знает не так много людей. А понимание принципов работы инструментов — залог правильного их использования.
Евгений (старший инженер по компиляторам в Huawei) исправит ситуацию и разберёт внутреннее устройство исключений по винтикам: от ассемблера, генерируемого компилятором для выбрасывания и перехвата исключений, до аппаратных ресурсов процессора, на которые может влиять использование исключений.
Веселье с type erasure + раскладываем данные из абстрактной структуры в параметры функции
Павел Новиков
Align Technology
Иногда хочется магии, которая бы вызывала обработчик и раскладывала поля запроса в параметры функции за тебя. Еще сильнее этого хочется, когда обработчиков со множеством параметров становится много.
В докладе мы сконцентрируемся на type erasure для создания удобного и дружелюбного для разработчика способа организации обработчиков запросов. Разберём несколько подходов, их профит, как их можно улучшить и что ещё с этим можно сделать. Предупреждение: будет много кода. Начнём код прямо здесь с иллюстрации идеи «магии, раскладывающей поля запроса за тебя»: она в том, чтобы из
{
"request": "baz",
"count": 1,
"id": "two",
"payload": { "three": 3 }
}
получалось
public class Program
{
public static void foo()
{ }
public static void bar([Name("count")] int i)
{ }
public static void baz([Name("count")] int i,
[Name("id")] string s,
[Name("payload")] JsonElement p)
{ }
}
Typescripten — generating type-safe JavaScript bindings for emscripten
Sebastian Theophil
think-cell
WebAssembly стала очень популярной целевой платформой для разработчиков C++. Благодаря emscripten портировать нативные приложения на WebAssembly очень просто — до тех пор, пока приложение использует браузер только как устройство отображения и ввода. Однако emscripten не предоставляет типобезопасных оберток для стандартных JavaScript API, таких как API манипуляции DOM, не говоря уже о других JavaScript API, предоставляемых существующими веб-приложениями.
Опенсорс-инструмент "typescripten" был создан на основе трех мощных технологий, чтобы устранить этот пробел. Он использует файлы определения интерфейса TypeScript и API компилятора TypeScript для создания безопасных для типов C++ оберток на основе emscripten. TypeScript уже содержит файлы определения интерфейса для более чем 7000 библиотек JavaScript, которые теперь можно безопасно использовать из C++.
В think-cell, где работает Себастьян, стремятся разрабатывать обертки C++ таким образом, чтобы использующий их код C++ выглядел аналогично эквивалентному коду TypeScript или JavaScript. Однако специфическую семантику основанных на прототипах Javascript и TypeScript часто трудно перевести на язык, основанный на типах, такой как C++. Себастьян расскажет о проблемах, с которыми столкнулась команда, и о выборе, который они сделали при разработке этого фреймворка.
С++ в мире встраиваемых систем
Владимир Вишневский
Intel
В материалах по встраиваемым системам зачастую фокус оказывается на языке C, а C++ оказывается менее освещен. Попробуем компенсировать этот дефицит. У Владимира есть опыт работы и над embedded, и над более высокоуровневыми системами, так что он знает эту сферу изнутри, но его доклад будет понятен и тем, кто «снаружи».
В своем докладе он познакомит слушателей с концепциями, разнообразием и архитектурными особенностями встраиваемых систем и рассматривает специфику использования С++ для разработки встраиваемого ПО. Множество аппаратных платформ и задач, решаемых встраиваемыми системами, определяет разнообразие существующих проблем, доступного инструментария и стандартов.
В докладе рассматривается текущее положение дел в сфере использования языка С++ для разработки встраиваемого ПО с фокусом на особенностях языка С++, востребованных в реальных проектах, а также проблемах, ограничивающих его применение.
Genode for C++ developers — фреймворк для создания операционных систем
Сергей Платонов
gapfruit
Сергей создал конференцию C++ Russia, а тут сам на ней и выступит: поделится опытом, полученным при использовании фреймворка Genode. Это опенсорсный инструмент, который позволяет создавать ОС с упором на безопасность (а в эпоху IoT этот вопрос стоит особенно остро).
Сергей покажет и как портировать готовое приложение, и как разработать своё простое. В процессе участники увидят, какие IPC предоставляет Genode, попробуют разобраться с тем какие ресурсы нужны приложению и как можно их получить. Наконец, научатся собирать программу и образ ОС с этой программой.
Разработка встраиваемых баз данных: советы, трюки и подводные камни
Александр Боргардт
ВКонтакте
У проектов на скриптовых языках есть простое правило: «хочешь сделать быстрее — пиши нативный код». Это действительно рабочий подход, когда код пишет опытный разработчик, владеющий всеми тонкостями интеграции в конкретном языке и видевший все детали реализации. Что делать всем, кто впервые может столкнуться с ворохом особенностей использования расширений и может ненамеренно сделать код только медленнее?
Почему такое может произойти? Могут оказаться большими те неявные накладные расходы, которые возникают при вызове нативного кода, или конкурентная модель может не оказаться совместимой с C/C++.
Александр (знакомый многим как организатор митапов/дринкапов по C++) рассмотрит особенности интеграции с нативным кодом на примере встраиваемой базы данных для проекта RocketJoe. Затронет передачу больших объектов через границу языков, нативные типы и RPC как способ манипуляции большими данными.
Just Enough Assembly for Compiler Explorer
Anders Schau Knatten
Zivid
Становится всё популярнее проект Compiler Explorer, позволяющий увидеть, что именно компилятор делает с твоим кодом (на прошлогодней C++ Russia мы даже порасспрашивали его создателя Мэтта Годболта). Вот только не всем легко читать язык ассемблера.
И пришло время это исправить: Андерс плавно погрузит вас в мир ассемблера x86_64. Конечно, за один доклад такую тему не охватишь целиком, но информации будет достаточно, чтобы понять полный листинг простых функций на ассемблере в Compiler Explorer. Предыдущий опыт работы с ассемблером не требуется, тут важнее базовое понимание C/C++.
После этого доклада вы сможете:
Вставить код из собственного проекта в Compiler Explorer и либо понять вывод ассемблера, либо знать, как его упростить до понятного состояния.
Знать, что искать и понимать, когда понадобится больше информации.
Конкурентность
Антон Полухин
Яндекс Go
Антон отлично известен многим плюсовикам — как участник комитета стандартизации C++, разработчик Boost-библиотек, автор текстов, спикер. Недавно мы делали расшифровку его доклада «C++ на практике», вызвавшую немало дискуссий в комментариях.
О чём его новый доклад? Во многих языках программирования набирают популярность асинхронные движки с корутинами. Антон предлагает взглянуть, как они устроены и что в них хорошего для I/O-bound-приложений. Мы посмотрим, как люди жили до современных корутин, рассмотрим базовые компоненты асинхронного движка и окунемся в дивный мир движковых оптимизаций и хитростей. В докладе /ожидаются:
использование стека как «кучи»;
мьютексы, которые не блокируют потоки;
таймеры и поколения;
отмены.
Фоновыe задачи: Управления ресурсами и отмена
Андрей Давыдов
JetBrains
Вынос тяжелой операции с UI-потока — частая проблема. Разумеется, она не нова и даже не уникальна для C++. Но в отличие от языков со сборкой мусора, в C++ необходимо предпринимать нетривиальные усилия для того, чтобы ресурсы, используемые фоновой задачей, но принадлежащие основному потоку, жили достаточно долго. Очевидное решение — использовать повсюду shared_ptr, но иногда требуется что-то потоньше (и поэффективнее). Еще одна нетривиальная часть работы с фоновыми операциями — реализация отмены.
В докладе поочередно рассмотрят, как это все можно написать с тремя механизмами асинхронного программирования: callbacks, (самописные) future и корутины С++20 (от слушателей ожидается поверхностное знакомство с ними).
Андрей работает в команде ReSharper C++ в JetBrains — той компании, где делают сложные приложения с UI, так что о связанных с этим вопросах наверняка знают многое
Погружение в Futures: подходы к реализации Task Parallelism
Валерий Миронов
Mail.ru Group
Один из основных способов написания асинхронного конкурентного кода — это Task Parallelism. Есть несколько подходов к его реализации.
Наиболее актуальный из них — Stackless Coroutines. К сожалению, он недоступен разработчикам до С++20, а библиотека для него, вероятно, не появится даже в C++23. Но существуют и другие подходы: Fibers, Actor Model, Futures.
Валерий расскажет о Futures и о том, какие оптимизации можно использовать при их реализации на примере опенсорс-библиотеки YacLib.
Concurrency in C++20 and beyond
Anthony Williams
Woven Planet
В C++20 добавлены новые средства, облегчающие написание конкурентного кода. Некоторые из них взяты из ранее опубликованного Concurrency TS, другие — новые, но все они облегчают жизнь разработчиков. В этом докладе будут представлены новые сущности — std::jthread,std::latch и std::barrier, и рассказано, как и почему мы должны их использовать.
Впрочем, на этом эволюция поддержки конкурентности в C++ не останавливается на достигнутом: комитет постоянно работает с новыми предложениями. В этом докладе представлены некоторые заметные из них, включая новую модель Executor.
Про спикера стоит сказать, что Энтони — автор книги "C++ Concurrency in Action", а также лично причастен к некоторым вещам, связанным с конкурентностью в C++, так что с темой близко знаком много лет.
Константин Осипов
ScyllaDB
С принятием корутин в стандарт С++20 возникла странная ситуация, когда в языке появилась мощная и эффективная фича, которой нельзя воспользоваться, так как поддержка библиотеки еще не доехала.
В сложившейся ситуации команда базы данных ScyllaDB в своей кооперативной среде выполнения Seastar самостоятельно реализовала поддержку, позволяющую начинать пользоваться корутинами.
Константин — известный разработчик СУБД, ранее занимавшийся MySQL и Tarantool, а теперь в команде ScyllaDB. Так что тут можно будет из первых рук узнать об использовании корутин в Seastar, подводных камнях компилятора и стандартов, а также о преимуществах корутин перед программированием на основе функций.
Производительность
Программируем видеокарты: введение в основные виды GPGPU-оптимизаций
Михаил Лукин
ООО «Судо»
Известно, что у вычислений на GPU есть свои преимущества — но только нужно уметь ими пользоваться. Как не просто разрабатывать программы для видеокарт, а делать это эффективно?
Об этом и расскажет Михаил Лукин. Он пишет на С++ с 2008 года, имеет практический опыт ускорения вычисления алгоритмов на GPU, изнутри знает, как устроены такие вычисления — его команда еще и написала декомпилятор для OpenCL. В своем докладе он покажет способы оптимизации для GPGPU-программ и разберет установившиеся практики разработки эффективных программ для видеокарт.
EVE: Новая C++20 библиотека для работы с SIMD
Денис Ярошевский
Bloomberg
EVE — это новая C++20 библиотека для работы с SIMD. Она поддерживает большинство актуальных платформ: ARM (neon) и x86 (с sse2 по avx-512).
К её преимуществам можно отнести:
коллекцию похожих на STL алгоритмов с поддержкой zip для работы с параллельными массивами;
поддержку ARM (большинство библиотек ограничиваются x86);
большой набор математических функций.
Доклад включает в себя различные демо использований библиотеки, бенчмарки, а также советы по включению в EVE в ваш проект.
Денис — один из контрибьюторов EVE. В 2020-м на C++ Russia он уже рассказывал про основы использования SIMD, но с тех пор EVE сильно продвинулась вперед, и теперь он расскажет о текущем положении дел.
C++ в двух нетипичных проектах
Олег Катков
Mad Devs
У С++ непростая репутация — многие люди считают, что если его можно не использовать, то лучше не использовать. Однако есть множество случаев, где выбор C++ дает огромные преимущества, и это не только про производительность.
Олег Катков расскажет, как команда считала проходимость магазинов и пропускную способность перекрестков с помощью даркнета и YOLO9k, как команда оптимизировала криптобиржу и почему C++ остается хорошим выбором.
Этот доклад для тех, кто считает С++ слишком сложным.
Максим Кита
ClickHouse
ClickHouse добрался до 20 000 звёзд на GitHub, всё больше людей использует его и видит «снаружи» — а Максим состоит в команде проекта и может рассказать о его развитии «изнутри».
В докладе он расскажет, как делалась JIT-компиляция запросов и операции GROUP BY в ClickHouse. Про технологии: какие использовали (LLVM) и с какими проблемами столкнулись при внедрении. Как измеряли результаты производительности, и какие запросы компилировать максимально выгодно.
Взаимозаменяемые AoS- и SoA-контейнеры
Павел Крюков
МФТИ
Проблема выбора оптимального размещения данных в памяти актуальна при программировании высокопроизводительных систем, работающих с большим объемом данных. В докладе представлена C++ библиотека, унифицирующая интерфейс к AoS- и SoA-подходам к организациям данных и упрощающая процесс выбора.
Доклад содержит начальные сведения об устройстве кеша CPU, качественное сравнение подходов AoS и SoA, недостатки использования их стандартных реализаций на C++. Перечислены задачи, возникающие при построении взаимозаменяемых AoS- и SoA-контейнеров, и представлены их решения с использованием средств рефлексии C++17.
В докладе вас ждет интересное пересечение метапрограммирования и низкоуровневых оптимизаций.
Инструменты
PGO: Как устроено и как использовать
Павел Косов
Huawei
Profile-guided optimization — довольно мощная техника, которая позволяет улучшить производительность приложения. А программистам на C++ всегда интересно знать, как ускорить их программы — и лучше всего, когда ускорение можно получить без переписывания кода. PGO как раз предоставляет такую возможность.
В данном докладе мы сначала разберемся, как эта техника устроена в компиляторе (на примере clang/llvm). Затем мы познакомимся с более продвинутыми вариантами применения PGO, такими, как двухпроходная инструментация и оптимизация бинарных файлов. И в конце разберем пару небольших примеров: когда PGO может улучшить производительность приложения, а когда — нет.
Павел имеет большой опыт в создании и улучшении компиляторов для С/С++ и системных утилит. Его опыт в использовании и модификации LLVM позволит глубоко раскрыть эту тему.
Алексей Веселовский
Align Technology
Этот доклад продолжает начатую в 2020 году тему санитайзеров в С++. Алексей уже разобрал устройство и нюансы работы Address Sanitizer, и теперь примется за второй по востребованности —Thread Sanitizer.
Будут рассмотрены основные механизмы, используемые TSan для выявления ошибок совместного доступа к данным (aka data races).
Как обычно, посмотрим, как поддержка этого санитайзера реализована в компиляторе (clang и gcc), как меняется генерация кода при включении опции fsanitize=thread, и к чему это может привести.
Также посмотрим, как реализована поддержка TSan со стороны рантайма. Разберемся, почему TSan использует примерно в 10 раз больше адресного пространства, чем ASan. Нужно ли перевыбрать все используемые библиотеки с TSan или же можно включить TSan только для части исходников, и почему TSan не сочетается с ASan. Ну и, наконец, может ли TSan поймать deadlock.
Александр Воронков
Align Technology
Александр представит обзор двух популярных кросс-платформенных пакетных менеджеров для C++, рассмотрит различия в походах, возможности интеграции, добавления своих библиотек.
Попытаемся понять, в каких случаях какой из них стоит выбрать для своего проекта. Вполне понятно, что каждый из инструментов можно допилить под свои потребности, но цель данного доклада — посмотреть, что у нас есть из коробки.
Доклад рассчитан как на слушателей, уже использующих какой-то пакетный менеджер для C++, так и на тех, кто ещё не определился.
Greg Law
Undo
Если вы пишете на C++ в Linux, вероятно, хотя бы иногда используете GDB. Но при всей популярности этого отладчика редко кто пользуется им в полную силу. Этот доклад покажет, что GDB — гораздо больше, чем просто break, step, print.
Будет много простых примеров, демонстрирующих более продвинутые возможности GDB, включая мощный скриптинг на Python, различные пользовательские интерфейсы, динамический printf, отладку нескольких процессов, расширенные типы брейкпойнтов и точек останова и наблюдения (breakpoints и watchpoints), даже отладку с перемещением во времени!
Разработчики в целом тратят мало времени на ввод кода и гораздо больше на то, чтобы заставить его работать — нельзя стать хорошим программистом, не умея отлаживать.
Проектирование ПО
Zen and the art of code lifecycle maintenance
Phil Nash
SonarSource
Бестселлер Роберта Пирсига 1974 года «Дзен и искусство ухода за мотоциклом» совсем не о дзене и не о мотоциклах. Важнее подзаголовок этой книги «Исследование ценностей», а в дальнейшем возникает понятие «Метафизики качества».
Качество, как оказалось, очень трудно определить. Качество ПО не является исключением. Когда кто-то говорит о качестве софта, что он имеет в виду? Как его измерить? Как улучшить? Как узнать, когда оно есть?
Фил (создатель тестового фреймворка Catch2) много лет работал над определением того, что, по его мнению, является наиболее важными аспектами качества ПО, то как они работают вместе (а иногда и друг против друга), и зачем нужны все эти аспекты (даже если иногда они идут в комплекте).
В полуавтобиографическом романе Пирсига мы отправляемся в путешествие на мотоцикле с восточного на западное побережье США. Это же путешествие пройдет по территории тестов, типов, статического и динамического анализа.
Designing for the long term: Invariants, knobs, extensions, and Hyrum's Law
Titus Winters
Конфигурируемость софта — это совершенно не обязательно что-то хорошее. Предоставление опций и переключателей настройки параметров дает пользователям больше свободы, но эти параметры почти сразу становятся устаревшими и хрупкими и ухудшают общие результаты эффективности. При этом любые опции и настройки, которые вы однажды предоставите, будет затруднительно отменить.
Это вызвано законом Хайрама. Его суть в том, что при достижении достаточного количества пользователей API уже неважно, что именно вы официально обещали, а что нет: на любую реально проявляющуюся особенность поведения вашей системы найдётся пользователь, который от неё зависит. Это наглядно выражено в xkcd:
В итоге возникает конфликт между кастомизируемостью и развиваемостью софта.
Что тут можно делать при проектировании? Включать ли тот или иной «рычаг»? Эти вопросы рассмотрит Тайтус — инженер из Google, представитель компании в комитете по стандартизации, соавтор книги «Делай как в Google. Разработка программного обеспечения», который ранее уже появлялся на C++ Russia.
Контрактное программирование в C++
Александр Ганюхин
Orion Innovation
Довольно продолжительное время Александр не писал assert от слова совсем, однако написав его впервые, теперь не может представить код без него. Довольно быстро пришло осознание того, что хочется расширить возможности такой диагностики, и в результате этих изысканий произошло знакомство с контрактами. Уже 4 года Александр ждет контракты в C++, и решил им посвятить свой доклад.
В докладе пойдет речь о том, как появилась сама идея контрактного программирования и как она эволюционировала, будет разобрано, что такое контрактное программирование сейчас и как его применяют на практике, дан обзор того, какими должны были быть контракты C++20 и какими они могут быть в C++23.
Александр работает программистом C++ уже на протяжении более восьми лет, в большей степени в сферах сотовой связи и автомобильной индустрии. В последнее время увлекся метапрограммированием и разработкой инструментов на C++, чтобы сделать жизнь коллег немного легче.
What I learned about language and library design by working on Swift
Dave Abrahams
Adobe
Когда в конце 1990-х годов Дэйв начал посещать заседания комитета C++, он и представить себе не мог, как это повлияет на него. Это и его участие в Boost сформировали его представления о работе, и положили начало личного и профессионального роста. К 2013 году этот этап завершился — Дэйв закрыл свою консалтинговую компанию, специализирующуюся на C++, и присоединился к команде Apple по разработке языка программирования следующего поколения.
Хотя все члены команды были опытными программистами на C++, они привнесли в работу много своего, и результаты удивили всех. Для Дейва полученные им знания о том, каким может быть язык и как создавать библиотеки, оказались даже более удивительными, чем сам Swift. Доклад — история этого путешествия.
Сейчас Дейв — главный научный сотрудник Adobe, где вместе с Шоном Парентом (неоднократно выступавшим у нас) отвечает за миссию Software Technology Lab по повышению уровня программирования через образование, инструменты и исследования.
Безопасность
Ошибки С++, приводящие к уязвимостям, и их митигация на KasperskyOS
Сергей Талантов
Лаборатория Касперского
В ПО есть огромное количество уязвимостей, которые приводят к рискам безопасности при их эксплуатации. Так или иначе, уязвимости в коде есть и будут — с этим ничего не поделать. Но используя специальные процессы разработки ПО, можно свести количество уязвимостей к минимуму.
Одним из подходов, позволяющим митигировать риски уязвимостей, которые еще не выявлены, является применение подхода «Secure By Design», используемого в KasperskyOS. А одной из практик разработки безопасного ПО является выделение роли Security Champion (а именно такую роль занимает Сергей), который контролирует выполнение требований безопасности на самых ранних этапах.
В докладе приведены примеры кода на С++ с обозначенными уязвимостями — это малая часть уязвимостей, специфичных в целом для нативных приложений на C/C++, которая, в свою очередь, является малой частью всех возможных уязвимостей.
Когда оптимизация кода нужна, а когда нет
Анна Мелехова
Лаборатория Касперского
Вопрос качественного ПО всегда актуален. Один из способов описать отказоустойчивое, надежное «без-бажное» ПО — это стандарты из области automotive, например, ISO 26262.
Здесь и техники, помогающие написать более понятный код (защитное программирование), и подмножества языка (MISRA, AUTOSAR), и архитектурные подходы (к обработкам ошибок, к повышению отказоустойчивости) и даже формальные верификации, как вишенка на торте. В докладе затронем вопросы применимости. Поговорим о кодо-метриках, линтерах и паттернах.
Возможности новых стандартов
The next level of C++20 Templates: Concepts and more
Andreas Fertig
Unique Code GmbH
C++20 — это, вероятно, самое большое изменение в языке за все время его существования. В этом докладе речь пойдёт об изменениях, связанных с шаблонами. Самое значимое изменение — это введение концепций. Кроме того, в докладе речь пойдёт и об улучшениях в CTAD и NTTP, и о том, как работают шаблонные лямбды в C++20. К концу доклада участники узнают всё главное о новейших обновлениях шаблонов C++20 и их применении.
А расскажет об этом Андреас Фертиг — генеральный директор Unique Code GmbH, который является опытным тренером и лектором по C++ для стандартов с 11 по 20. Участвует в работе комитета по стандартизации C++.
Заключение
Конференция начнется 15 ноября и продлится аж четыре дня. И докладами она не ограничится: там будут и тематические дискуссии в эфире, и вопросы спикерам, и общение с другими участниками, и активности компаний-партнеров.
Билеты и точное расписание — на сайте. Увидимся в онлайне!