C++ Moscow
447 subscribers
6 photos
66 links
Информационный канал московского сообщества программистов на C++

Чат: @cppmoscow_chat
Бот обратной связи: @cppmoscow_bot
Организатор: @eoanermine
Download Telegram
#cpp20 #coroutines

Не будем вас томить, следующие статьи и доклады раскрывают корутины наиболее детально:

1. 🇷🇺 Habr: Корутины в C++20 — что это и как с ними работать
2. 🇷🇺 Habr: C++20. Coroutines
3. 🇬🇧 David Mazières: My tutorial and take on C++20 coroutines
4. 🇬🇧 Lewis Baker: Asymmetric Transfer

Выбирайте любую по своим языковым предпочтениям — не ошибетесь. Но как наиболее фундаментальный и всеобъемлющий труд я рекомендую серию статей Assymetric Transfer (Lewis Baker). Это лонг-лонг рид, но он абсолютно того стоит: теоретические основы корутин; механизмы их работы: operator coawait, promisetype, симметричный перенос; какие преобразования над нашим корутинным кодом выполняет компилятор — все это раскрывается во всех деталях, и вряд ли после его прочтения у вас останется хоть один вопрос о том, как работают сопрограммы.

Если же вы больше предпочитаете видео, то на тему корутин есть несколько хороших докладов:

1. 🇬🇧 Andreas Fertig: C++20’s Coroutines for Beginners — рассматривающий корутины на основе примеров;
2. 🇬🇧 Andreas Weis: Deciphering C++ Coroutines - A Diagrammatic Coroutine Cheat Sheet — больше углубляющийся в анатомию корутин и проводящий связи между их компонентами, как они между собой взаимодействуют.

И две прекрасные лекции, детальные и с прекрасной подачей:

1. 🇷🇺 Константин Владимиров: Сопрограммы, часть 1 — Обзор разновидностей сопрограмм и их основных частей, дополненный множеством интересных упражнений: собственный генератор, исследование объектов ожидания и разбор тонких и сложных проблем;
2. 🇷🇺 Константин Владимиров: Сопрограммы, часть 2 — Варианты симметрии в корутинах, их применение в конечных автоматах, многопоточности и асинхронности.

И это все, конечно, очень хорошо, но как дела обстоят с инфраструктурой для корутин: ведь обычно нам хочется использовать готовые классы generator, task и так далее, а не писать их самостоятельно, и насколько хорошо их поддерживают компиляторы? Поговорим об этом в следующий раз!
🔥9👍3
#cpp20 #coroutines

⁠Если говорить об инфраструктуре и поддержке корутин в компиляторах, то, к сожалению, C++20 не принес совершенно никакой высокоуровневой библиотечной поддержки; все, что мы имеем: coroutine_traits, coroutine_handle. И это, конечно, прекрасно: мы можем с помощью них писать свои сопрограммы. Однако не всем в удовольствие писать низкоуровневый код, хотелось бы иметь для прикладного использования и готовенькое.
И комитет не дремлет; в C++23 был принят пропозал (не реализованный еще ни в одном компиляторе):

1. 🇬🇧 std::generator: Synchronous Coroutine Generator for Ranges, описывающий корутинный генератор:

std::generator<int> iota(int start = 0) {
while (true)
co_yield start++;
}

void f() {
for (auto i: iota() | std::views::take(3))
std::cout << i << ' '; // Печатает 0 1 2
}

Кроме того, прямо сейчас в комитете рассматривается:

1. 🇬🇧 std::lazy: Coroutine for Deferred Execution, предлагающий довольно минималистичный класс для представления асинхронных вычислений:

lazy<int> coro() {
int result = 0;
while (int v = co_await async_read())
result += v;
co_return result;
}

void f() {
lazy<int> task = coro(); // Получим объект корутины
co_await task; // А теперь наконец ее исполним
}

К сожалению, далеко не факт, примут ли это предложение в C++26: как оно было подано в 2022-ом, так с тех пор и нет никакого прогресса в продвижениии к его принятию.

И на этом всё. Больше никакой поддержки в стандартной библиотеке пока что не предвидится. К счастью, уже написано несколько библиотек, предоставляющих помимо высокоуровневых корутинных примитивов средства для планирования (scheduling) задач и неблокирующего I/O:

1. 🇬🇧 Facebook: Folly::Coro — Асинхронный корутинный фреймворк от Facebook, быстрый и помимо всего поддерживающий асинхронные примитивы синхронизации.
2. 🇬🇧 Lewis Baker: CppCoro — Прародитель всех корутинных фреймворков. К сожалению, уже мертвый, но ввиду своей большой популярности продолживший жизнь через форки и многочисленных идейных продолжателей: [1], [2], [3], [4], [5].
3. 🇬🇧 Dan Vrátil: QCoro — Если вы хотите использовать в Qt корутины вместо сигналов.

А какие библиотеки используете вы? Или вы уже успели написать все самостоятельно? 😉
🔥6👍2
Вот и закончилась неделя корутин. Надеемся, наши материалы оказались не только интересны, но и полезны! И, так как это были первые посты в экспериментальном формате «Неделя X», мы приглашаем всех поделиться в комментариях своим мнением: понравился ли вам формат, как его можно было бы улучшить и какую неделю вы хотите видеть следующей послеследующей?

Кроме того, мы рады напомнить, что сегодня последний день приёма заявок желающих выступить с докладом на ближайшем митапе! А значит, следующая неделя будет неделей анонсов докладов C++ Moscow №2!
🔥6❤2
Чуть больше чем месяц остался до нашей встречи и мы рады познакомить вас с одним из запланированных докладов: Илья Быконя расскажет нам, как подружить Qt и корутины!
🔥6
Корутины и Qt. Библиотека QCoro

Qt появился уже почти 30 лет назад. Хотя фреймворк и сейчас поддерживается и получает крупные обновления как от разработчиков, так и от комьюнити, его событийно-ориентированная система заставляет нас использовать вереницы коллбеков или множество вложенных лямбд и на сегодняшний день выглядит достаточно громоздко в сравнении с другими языками и даже библиотеками C++ (привет, userver).

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

Библиотека не ломает обратную совместимость. Все старые классы, по типу QNetworkManager, QFuture или классов IO-системы полностью совместимы с QCoro. Достаточно лишь заменить QObject::connect с коллбеком на co_await и узреть магию.

При этом библиотека надёжна и признана мировым сообществом. Например, она входит в официальные репозитории (extra) для Manjaro Linux, а значит, проходит несколько этапов проверок прежде, чем попасть в эти репозитории.
🔥9
#digest

Подборка самых интересных новостей и материалов из мира C++
за последние две недели (2 октября – 15 октября 2023)

Читать далее на Хабре
❤‍🔥6❤3👍1🔥1
Ровно месяц остался до нашей встречи! И мы не можем не представить оставшийся запланированный доклад:  Дмитрий Косенко расскажет и покажет, как паттерны проектирования применяются в реальном коде. На примере ClickHouse!
🔥9
ООП в ClickHouse

Паттерны проектирования. О них все слышали, их все используют (надеемся). А давайте посмотрим на них в реальном проекте? Как они помогают понизить связанность компонентов и реализовать принцип SOLID? Как помогают разобраться в незнакомом коде?

В докладе мы разберём использование объектно-ориентированных паттернов не в простом веб-приложении, а в СУБД. Это один из самых известных C++ проектов с открытым исходным кодом — ClickHouse
🔥9
Finally!

В CMake (3.28+) наконец-то реализовали поддержку модулей!

Кроме новейшего CMake вам также потребуются новейшие компиляторы: msvc 14.34+, clang 16+, gcc 14+

Подробнее по ссылке
🔥10
#meetup

⠀
Наш митап состоится уже через 4 недели, 19 ноября (Вс) с 15:20 до 18:00 по адресу Москва, Малый Конюшковский переулок, д. 2 (оффлайн + онлайн трансляция докладов), и мы готовы огласить список запланированных активностей:

1. Доклад: Корутины и Qt. Библиотека QCoro
2. Доклад: ООП в ClickHouse
3. Конкурс по мотивам C++ Quiz

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

Остались вопросы? Пишите в комментарии, на все ответим!
🔥9👍2
#proposals #resources

Возвращаясь к интересным новостям: недавно комитет по стандартизации C++ опубликовал предложенные за последний месяц пропозалы.

Из наиболее примечательного:
1. Продолжение работы над std::hive: был обновлен раздел, касающийся constexpr; внесено множество изменений в описание асимптотической сложности операций.
2. С учётом всех замечаний LEWG был обновлен P0876 fiber_context - fibers without scheduler, прокладывающий более широкий путь в наше светлое корутинное будущее: в частности, предлагающий базовые абстракции для реализации stackful корутин.
3. Виктор Зверович, известный продвижением std::format в стандарт, всё не находит покой, и теперь предлагает аналогичные безопасные функции, испольщующие все прелести constexpr, но для разбора строк:

if (auto result = std::scan<std::string, int>("answer = 42", "{} = {}")) {
const auto& [key, value] = result->values();
// key == "answer", value == 42
}

И дальше, более коротким, но далеко не исчерпывающим списком: Contracts for C++ (ставящий высокую цель наконец-то ввести в язык аннотации контрактов); A New Approach For Compiling C++ (захватывающий дух бенчмарками, показавшими увеличение скорости компиляции на 25–40%); optional<T&> (намеренное заделать ранее намеренно оставленную брешь), Reflection for C++26 (упрощающий рефлексию максимально, чтобы у нее был шанс пройти в C++26), Low-Level Integer Arithmetic (предлагающий не влекущие UB библиотечные функции для выполнения базовых арифметических операций) и UFCS (описывающий единый синтаксис вызовов функций и методов)

А какие из этих пропозалов кажутся наиболее интересными вам? Или каких полезных фич, по вашему мнению, в этом списке не хватает? Присоединяйтесь к обсуждению в комментариях!
🔥10
#cpp23 #clang

Хорошие новости! В clang 18 наконец-то реализовали P0847R7 Deducing this. Однако пока что только в экспериментальном режиме: макрос __cpp_explicit_this_parameter в этом версии установлен не был

Что это нововведение нам даёт? Если раньше мы хотели реализовать один метод с четырьмя разными ref-квалификаторами, то нам приходилось так или иначе писать практически один и тот же код четырежды. (см. пикрелейтед)

Теперь же мы можем избежать необходимости подобного дублирования, подчинив для этого привычный механизм выведения типов:

template <typename Self>
constexpr auto&& value(this Self&& self) {
if (!self.has_value()) {
throw bad_optional_access();
}
return forward<Self>(self).m_value;
}

Более подробно про deducing this в статье по ссылке
🔥7👍2
#digest

Подборка самых интересных новостей и материалов из мира C++ за последние две недели (16 октября – 29 октября 2023)

Читать далее на Хабре
🔥5
#resources #education #courses

Плюсовиками не рождаются, плюсовиками становятся. И наше сообщество радо помочь всем в этом становлении нашей новой рубрикой: учебные материалы (#education).

C++ базовый курс, MIPT, 2021-2022 (Константин Владимиров)

Если с чего и начинать — то с одного из самых популярных и объективно лучших русскоязычных базовых курсов по C++. Он не рассчитан на абсолютных новичков: предполагается начальное понимание C, но очень хорошо структурирован: изложение методично идет от таких базовых понятий как указатели и ссылки до метапрограммирования, constexpr функций и концептов (кроме того, в курсе есть отдельные лекции, посвященные OpenGL, Vulkan, LLVM); глубок и блестяще, интересно и нескучно изложен.
Так что он может быть полезен не только начинающим, но и всем желающим освежить память и структурировать свое понимание плюсов.

Список ссылок: канал, плейлист (youtube), слайды
🔥8👍4🤡3❤1
#conferences

Бувально на днях стали известны даты и началась продажа билетов на C++ Russia 2024, крупнейшую российскую конференцию для C++ разработчиков. Ее онлайн часть пройдет 15 мая, а оффлайн (с трансляцией докладов) 22-23 мая в Москве. Темы докладов пока что неизвестны: прием заявок на них был только открыт, но покупку билетов лучше не откладывать — мало того, что они не из дешевых, так и каждый месяц дорожают, причем довольно существенно. И хорошо, если вам их сможет оплатить работодатель, но если это не вариант — с промокодом CPPRussiaAttendeePV вы можете купить билет со скидкой 25%.

А были ли вы на какой-нибудь из прошлых конференций C++ Russia, и планируете ли посетить C++ Russia 2024?
👍9🔥4😐1
#meetup

Наш второй митап состоится уже чуть меньше чем через две недели, 19 ноября (Вс) с 15:20 до 18:00 по адресу Москва, Малый Конюшковский переулок, д. 2 (оффлайн + онлайн трансляция докладов)

Запланированные активности:
1. Доклад: Корутины и Qt. Библиотека QCoro
2. Доклад: ООП в Clickhouse
3. Конкурс по мотивам C++ Quiz

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

Регистрируйтесь и приходите на наш митап, будет классно!
🔥5❤2
#quiz

Корректен ли код, приведенный ниже? Делитесь своими мыслями в комментариях! Правильный ответ и его объяснение будут опубликованы в 18:00 по Москве.

void f()
{
std::mutex m;
for (int x : static_cast<void>(std::scoped_lock{m}), std::vector<int>{42, 17, 13})
{
std::scoped_lock guard{m};
}
}
🔥5
#quiz #explanation #cpp23

Конечно, это очень странный код и писать подобное в проде недопустимо. Но если говорить о его нормативном статусе, то тут есть нюансы.

В C++20 этот код корректен: согласно [
class.temporary#6], время жизни std::vector<int>{42, 17, 13}, являющегося временным объектов, продлевается до конца цикла for, так что мы можем безопасно по нему итерироваться. Временный же объект std::scoped_lock{m} создается и сразу уничтожается: для него не применимо ни одно из правил продления жизни.

В C++23 же существующее поведение было изменено:
P2644R1 добавил в стандарт следующий пункт:

> There are three four contexts in which temporaries are destroyed at a different point than the end of the full-expression. ...

> The fourth context is when a temporary object other than a function parameter object is created in the for-range-initializer of a range-based for statement. If such a temporary object would otherwise be destroyed at the end of the for-range-initializer full-expression, the object persists for the lifetime of the reference initialized by the for-range-initializer.

То есть, теперь времена жизни всех (за незначительными исключениями) объектов, созданных в инициализаторе range-based for, продлеваются до конца цикла. Так что если рассматривать приведенный выше код: мы создаем временный объект
std::scoped_lock{m}, чье время жизни продлевается до конца цикла; после чего создаем временный объект std::vector<int>{42, 17, 13}, время жизни которого продлевается так же; и дальше в цикле на первой же итерации создаем новый объект std::scoped_lock guard{m}, захватывающий мьютекс, который уже был захвачен предыдущим std::scoped_lock — и тем самым получаем состояние взаимной блокировки (deadlock), которое стандартом определяется как неопределенное поведение.
❤3👍3🔥1
#resources #books #optimization

Optimizing software in C++. An optimization guide for Windows, Linux, and Mac platforms (Agner Fog)

Один из наиболее исчерпывающих трудов, посвященных оптимизации программ на C++, рассматривающий как общие вопросы: что вообще в типичном приложении больше всего жрёт? Так и более частные (не исчерпывающиеся приведенными далее): во сколько на самом деле нам обходится использование различных конструкций C++? Какие компиляторы какие оптимизации умеют делать и как мы можем помочь им лучше соптимизировать наш код?
Как мы можем оптимизировать доступ к памяти? Как писать код так, чтобы он мог автоматически векторизоваться компилятором?

При этом автор самостоятельно знакомит читателя (ожидая от него лишь хорошее понимание C++) со всем необходимым понятийным аппаратом: как работает предсказатель ветвлений, как в процессорах организованы кэши — всё это объясняется очень доступно, так что Optimizing software in C++ можно порекомендовать всем: если вам не безразличен performance ваших программ — в этой книге вы точно найдете что-то новое и полезное

Скачать
🔥14
C++ Moscow
#meetup ⠀Наш митап состоится уже через 4 недели, 19 ноября (Вс) с 15:20 до 18:00 по адресу Москва, Малый Конюшковский переулок, д. 2 (оффлайн + онлайн трансляция докладов), и мы готовы огласить список запланированных активностей: 1. Доклад: Корутины и Qt.…
#meetup

Наше последнее напоминание 😉

C++ Moscow №2 пройдет уже на этой неделе, и если вы собираетесь посетить его очно и ещё не зарегистрировались — самое время это сделать, иначе вы не сможете попасть на митап.

Если же вы планируете участвовать онлайн — регистрироваться не нужно, трансляция пройдет на нашем YouTube канале.
🔥9