Слайды одноименного доклада с конференции "C++ Russia 2018". В докладе речь идет о том, насколько C++ мешает и насколько C++ помогает в разработке акторного фреймворка для C++.
Евгений Зуев, С++ в России: Стандарт языка и его реализацияPlatonov Sergey
Доклад посвящён различным аспектам компилятора С++, созданного с участием автора. В выступлении рассказывается о продвинутой архитектуре компилятора, основных проектных решениях, а также обсуждаются особенности входного языка, повлиявшие на реализацию компилятора.
В докладе будут сделаны попытки ответить на вопросы, какой тип скрывается под маской auto, почему T&& не всегда rvalue, и почему move ничего не двигает.
Многие разработчики не представляют, как дорого обходятся ошибки в программах. Причем я имею в виду не падения ракет и прочие катастрофы, а обыкновенное прикладное программное обеспечение. Хочется показать всю важность нахождения ошибок на самых ранних этапах. Одним из способов выявить ошибку как можно раньше является статический анализ кода. Поговорим мы не только об этом, но и о различных приемах при написании кода, которые позволят избежать множество типовых ошибок.
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptSergey Platonov
Шаблоны — мощный инструмент, добавляющий в язык новые возможности, а программистам в команде — новые проблемы. Доклад покажет, как тщательно продуманный шаблонный код может не усложнить, а упростить жизнь и дать надёжную абстракцию межпроцессных межъязыковых асинхронных вызовов функций. С помощью шаблонов можно:
адаптировать Promise/A+ из Javascript для C++
автоматически проверять и раскладывать динамический массив аргументов на статичные аргументы функции
сделать аналог std::bind для weak_ptr.
Эти вещи будут показаны на примере взаимных вызовов между C++ и Javascript в одном приложении с помощью CEF3.
Евгений Зуев, С++ в России: Стандарт языка и его реализацияPlatonov Sergey
Доклад посвящён различным аспектам компилятора С++, созданного с участием автора. В выступлении рассказывается о продвинутой архитектуре компилятора, основных проектных решениях, а также обсуждаются особенности входного языка, повлиявшие на реализацию компилятора.
В докладе будут сделаны попытки ответить на вопросы, какой тип скрывается под маской auto, почему T&& не всегда rvalue, и почему move ничего не двигает.
Многие разработчики не представляют, как дорого обходятся ошибки в программах. Причем я имею в виду не падения ракет и прочие катастрофы, а обыкновенное прикладное программное обеспечение. Хочется показать всю важность нахождения ошибок на самых ранних этапах. Одним из способов выявить ошибку как можно раньше является статический анализ кода. Поговорим мы не только об этом, но и о различных приемах при написании кода, которые позволят избежать множество типовых ошибок.
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptSergey Platonov
Шаблоны — мощный инструмент, добавляющий в язык новые возможности, а программистам в команде — новые проблемы. Доклад покажет, как тщательно продуманный шаблонный код может не усложнить, а упростить жизнь и дать надёжную абстракцию межпроцессных межъязыковых асинхронных вызовов функций. С помощью шаблонов можно:
адаптировать Promise/A+ из Javascript для C++
автоматически проверять и раскладывать динамический массив аргументов на статичные аргументы функции
сделать аналог std::bind для weak_ptr.
Эти вещи будут показаны на примере взаимных вызовов между C++ и Javascript в одном приложении с помощью CEF3.
О сложностях программирования, или C# нас не спасет?Tatyanazaxarova
Программирование это сложно. С этим никто, надеюсь, не спорит. Но вот тема новых языков программирования, а точнее поиск "серебряной пули" всегда находит бурных отклик в умах разработчиков программного обеспечения. Особенно "модной" является тема превосходства одного языка программирования над другим. Ну, к примеру, что C# "круче", чем C++. И хотя holy wars – это не та причина, по которой я пишу этот пост, тем не менее, что называется "наболело". Ну не поможет C#/lisp/F#/Haskell/... написать изящное приложение, взаимодействующее с внешним миром, и все тут. Вся изящность теряется, стоит захотеть написать что-то реальное, а не пример "сам в себе".
Исключения C++ через призму компиляторных оптимизаций. Роман Русяев ➠ CoreHa...corehard_by
На дворе 21-й век, непроизводительная реализация обработки C++ исключений на основе setjmp/longjmp уже в прошлом. Современные компиляторы, такие как gcc и clang, используют продвинутую реализацию C++ исключений, называемую zero-cost exception handling. Но насколько действительно это zero-cost? Да, мы платим увеличением размера бинарного файла, а также в случае, когда исключение действительно выбрасывается, запуская процесс stack unwinding, вызывая деструкторы для локальных объектов и т.д. Но теряем ли мы производительность, если исключение не выбрасывается? Появляются ли какие-то ограничения на компиляторные оптимизации? В этом докладе дано описание того, каким образом С++ исключения оказывают влияние на компиляторные оптимизации. Какие оптимизации не могут быть применены в случае, если функция может бросить исключения, а какие оптимизации становится труднее применять. Примеры реализации исключений и компиляторных оптимизаций рассматриваются на базе LLVM. Доклад преследует цель дать людям понимание, когда делать сборку своего приложения с -fno-exceptions имеет смысл, а когда можно наслаждаться всеми прелестями использования C++ исключений, зная, что их код не значительно потерял в производительности по сравнению с кодом, где исключения отключены.
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
В последнее время в промышленной разработке ПО особую популярность обретают Domain-Specific Lanugages (DSL). Они драматически упрощают разработку и дают возможность “программировать” не только программистам, но и пользователям прикладных программ.
В своем докладе я расскажу об опыте использования DSL применительно к С++, причем упор будет сделан на производительность кода DSL, и его мгновенную “встраиваемость” в запущенную программу путем компиляции DSL-кода в нативный код с помощью инструментария LLVM.
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
Кто-то верно подметил, что разработчики статических анализатора часто сталкиваются с "проблемой айсберга". Им сложно объяснить разработчикам, почему сложно написать и развивать статические анализаторы кода. Дело в том, что сторонние наблюдатели видят только вершину всего процесса, так как им доступен для изучения только простой интерфейс, который предоставляют анализаторы для взаимодействия с миром. Это ведь не графический редактор с сотнями кнопок и рычажков. В результате и возникает ощущение, что раз прост интерфейс взаимодействия, то и прост продукт. На самом деле статические анализаторы кода — это сложные программы, в которых живут и взаимодействуют разнообразнейшие методы поиска дефектов. В них реализуется множество экспертные системы, выдающие заключения о коде на основе как точных, так и эмпирических алгоритмах. В парном докладе, основатели анализатора PVS-Studio расскажут о том, как незаметно потратить 10 лет, чтобы написать хороший анализатор. Дьявол кроется в деталях!
Стандартная библиотека C++ крайне гибка и позволяет решать множество задач. Однако мало кто знает о некоторых её возможностях, из-за чего порой вместо написания нескольких строчек кода люди неделями пишут своё решение или переизобретают готовые алгоритмы. В докладе вас ждёт рассказ о полезных "фишках" стандартной библиотеки на которые почему-то мало кто обращает внимание.
Андрей Карпов, Приватные байки от разработчиков анализатора кодаSergey Platonov
Доклад о редких нестандартных расширениях языка С++, про которые никто не знает, но которые надо поддерживать в анализаторе кода.
О магии Visual C++ с файлом stdafx.h, когда проект компилируется, хотя не должен. О том как зародился viva64 (предшественник PVS-Studio) для поиска 64-битных проблем. Как и почему исчез анализ кода, который одно время существовал в компиляторе Intel C++.
В докладе рассказывается об особенностях подхода к dependence injections в C++. Посмотрим какие подходы, в чем их плюсы и минусы. Также затрагивается тема Inversion of Control контейнеров.
Юнит-тестирование и Google Mock. Влад Лосев, Googleyaevents
Владимир Лосев, Google
Закончил математико-механический факультет Санкт-Петербургского государственного университета в 1995 году. Работал в компаниях Motоrola, Fair Isaac и Yahoo. С 2008 года работает в Google, в группе, занимающейся вопросами повышения производительности инженеров.
Тема доклада
Юнит-тестирование и Google Mock.
Тезисы
В модульных (юнит) тестах каждый элемент программы тестируется по отдельности, в изоляции от других. Такие тесты исполняются очень быстро, поэтому их можно запускать когда угодно, что позволяет отлавливать дефекты на самых ранних стадиях разработки. Однако для тестирования объекта в изоляции от других необходимо имитировать поведение связанных с ним объектов, что на C++ довольно утомительное занятие. Разработанная в Googlе библиотека для создания и использования mock-объектов — Google Mock — позволяет существенно упростить этот процесс и ускорить написание тестов. В докладе пойдет речь о принципах и возможностях библиотеки, примерах её использования и её внутреннем устройстве.
В этот раз победу одержало добро. А вернее, исходные коды проекта Chromium. Chromium - один из лучших проектов, который мы проверяли с помощью PVS-Studio.
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Yandex
Основываясь на опыте разработки Крипты, Дмитрий рассмотрит средства реализации статического и динамического полиморфизма в C++, а также некоторые их паттерны и антипаттерны.
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Yandex
Флеш-накопители используются в самых разных устройствах, от мобильных телефонов до компьютеров и серверов. Для каждой модели накопителя нужна прошивка с определённым набором параметров, которые могут отличаться в зависимости от ситуации. В докладе будет описан универсальный фреймфорк на С++, который предоставляет разработчикам симуляторов простой, прозрачный и быстрый доступ к любому параметру. Тестировщикам же он позволяет управлять конфигурациями при помощи стандартных инструментов редактирования и слияния.
Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...Moscow.pm
- Почему C++? Плюсы, минусы.
- Как найти компилятор (поддержка в EUMM, MB, стандартные и не очень решения).
- Конфликты имён.
- Трансляция C++ исключений в Perl-исключения.
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
В докладе перед нами откроется великолепный мир велосипедов и устаревших технологий, которые люди продолжают переносить в новые проекты и повсеместно использовать. Мы поговорим о:
Copy-On-Write
разработке без оглядки на готовые решения и к чему это приводит
force inline
оптимизациях, которые отлично себя показывают на бенчмарках и плохо себя ведут в реальной жизни
бездумно отключаемых оптимизациях компилятора
тонкостях стандартной библиотеки для повседневного использования
супер качественном велосипедостроении
Сравнение статического анализа общего назначения из Visual Studio 2010 и PVS-...Tatyanazaxarova
В статье показаны ошибки, выявленные с помощью статического анализатора кода, встроенного в Visual Studio 2010. Исследование проводилось на пяти open source проектах. Эти же проекты были проверены с помощью PVS-Studio. Приведены результаты сравнения этих двух инструментов.
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMSergey Platonov
Зачастую, знакомство с алиасингом в C++ у многих программистов начинается и заканчивается одинаково: -fno-strict-aliasing. На вопросы новичка, более опытные коллеги отвечают в стиле: «не трогай! а то все сломаешь!». Новичок и не трогает. В докладе будет предпринята попытка заглянуть под капот и понять, что же там, внутри. Что такое алиасинг, где он может быть полезен и какие реальные преимущества дает. Тема будет рассмотрена и со стороны программиста и со стороны разработчика компилятора. А по сему, вопрос «зачем?» будет центральным в повествовании.
Дмитрий Прокопцев, Яндекс
Речь пойдёт о, наверное, одном из самых важных и в то же время сложных нововведений в С++11 — R-ссылках (rvalue references). Мы рассмотрим базовые правила работы с такими ссылками и связанные с ними новые концепции языка: перемещение классов, универсальные ссылки и перенаправление вызовов.
О сложностях программирования, или C# нас не спасет?Tatyanazaxarova
Программирование это сложно. С этим никто, надеюсь, не спорит. Но вот тема новых языков программирования, а точнее поиск "серебряной пули" всегда находит бурных отклик в умах разработчиков программного обеспечения. Особенно "модной" является тема превосходства одного языка программирования над другим. Ну, к примеру, что C# "круче", чем C++. И хотя holy wars – это не та причина, по которой я пишу этот пост, тем не менее, что называется "наболело". Ну не поможет C#/lisp/F#/Haskell/... написать изящное приложение, взаимодействующее с внешним миром, и все тут. Вся изящность теряется, стоит захотеть написать что-то реальное, а не пример "сам в себе".
Исключения C++ через призму компиляторных оптимизаций. Роман Русяев ➠ CoreHa...corehard_by
На дворе 21-й век, непроизводительная реализация обработки C++ исключений на основе setjmp/longjmp уже в прошлом. Современные компиляторы, такие как gcc и clang, используют продвинутую реализацию C++ исключений, называемую zero-cost exception handling. Но насколько действительно это zero-cost? Да, мы платим увеличением размера бинарного файла, а также в случае, когда исключение действительно выбрасывается, запуская процесс stack unwinding, вызывая деструкторы для локальных объектов и т.д. Но теряем ли мы производительность, если исключение не выбрасывается? Появляются ли какие-то ограничения на компиляторные оптимизации? В этом докладе дано описание того, каким образом С++ исключения оказывают влияние на компиляторные оптимизации. Какие оптимизации не могут быть применены в случае, если функция может бросить исключения, а какие оптимизации становится труднее применять. Примеры реализации исключений и компиляторных оптимизаций рассматриваются на базе LLVM. Доклад преследует цель дать людям понимание, когда делать сборку своего приложения с -fno-exceptions имеет смысл, а когда можно наслаждаться всеми прелестями использования C++ исключений, зная, что их код не значительно потерял в производительности по сравнению с кодом, где исключения отключены.
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
В последнее время в промышленной разработке ПО особую популярность обретают Domain-Specific Lanugages (DSL). Они драматически упрощают разработку и дают возможность “программировать” не только программистам, но и пользователям прикладных программ.
В своем докладе я расскажу об опыте использования DSL применительно к С++, причем упор будет сделан на производительность кода DSL, и его мгновенную “встраиваемость” в запущенную программу путем компиляции DSL-кода в нативный код с помощью инструментария LLVM.
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
Кто-то верно подметил, что разработчики статических анализатора часто сталкиваются с "проблемой айсберга". Им сложно объяснить разработчикам, почему сложно написать и развивать статические анализаторы кода. Дело в том, что сторонние наблюдатели видят только вершину всего процесса, так как им доступен для изучения только простой интерфейс, который предоставляют анализаторы для взаимодействия с миром. Это ведь не графический редактор с сотнями кнопок и рычажков. В результате и возникает ощущение, что раз прост интерфейс взаимодействия, то и прост продукт. На самом деле статические анализаторы кода — это сложные программы, в которых живут и взаимодействуют разнообразнейшие методы поиска дефектов. В них реализуется множество экспертные системы, выдающие заключения о коде на основе как точных, так и эмпирических алгоритмах. В парном докладе, основатели анализатора PVS-Studio расскажут о том, как незаметно потратить 10 лет, чтобы написать хороший анализатор. Дьявол кроется в деталях!
Стандартная библиотека C++ крайне гибка и позволяет решать множество задач. Однако мало кто знает о некоторых её возможностях, из-за чего порой вместо написания нескольких строчек кода люди неделями пишут своё решение или переизобретают готовые алгоритмы. В докладе вас ждёт рассказ о полезных "фишках" стандартной библиотеки на которые почему-то мало кто обращает внимание.
Андрей Карпов, Приватные байки от разработчиков анализатора кодаSergey Platonov
Доклад о редких нестандартных расширениях языка С++, про которые никто не знает, но которые надо поддерживать в анализаторе кода.
О магии Visual C++ с файлом stdafx.h, когда проект компилируется, хотя не должен. О том как зародился viva64 (предшественник PVS-Studio) для поиска 64-битных проблем. Как и почему исчез анализ кода, который одно время существовал в компиляторе Intel C++.
В докладе рассказывается об особенностях подхода к dependence injections в C++. Посмотрим какие подходы, в чем их плюсы и минусы. Также затрагивается тема Inversion of Control контейнеров.
Юнит-тестирование и Google Mock. Влад Лосев, Googleyaevents
Владимир Лосев, Google
Закончил математико-механический факультет Санкт-Петербургского государственного университета в 1995 году. Работал в компаниях Motоrola, Fair Isaac и Yahoo. С 2008 года работает в Google, в группе, занимающейся вопросами повышения производительности инженеров.
Тема доклада
Юнит-тестирование и Google Mock.
Тезисы
В модульных (юнит) тестах каждый элемент программы тестируется по отдельности, в изоляции от других. Такие тесты исполняются очень быстро, поэтому их можно запускать когда угодно, что позволяет отлавливать дефекты на самых ранних стадиях разработки. Однако для тестирования объекта в изоляции от других необходимо имитировать поведение связанных с ним объектов, что на C++ довольно утомительное занятие. Разработанная в Googlе библиотека для создания и использования mock-объектов — Google Mock — позволяет существенно упростить этот процесс и ускорить написание тестов. В докладе пойдет речь о принципах и возможностях библиотеки, примерах её использования и её внутреннем устройстве.
В этот раз победу одержало добро. А вернее, исходные коды проекта Chromium. Chromium - один из лучших проектов, который мы проверяли с помощью PVS-Studio.
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Yandex
Основываясь на опыте разработки Крипты, Дмитрий рассмотрит средства реализации статического и динамического полиморфизма в C++, а также некоторые их паттерны и антипаттерны.
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Yandex
Флеш-накопители используются в самых разных устройствах, от мобильных телефонов до компьютеров и серверов. Для каждой модели накопителя нужна прошивка с определённым набором параметров, которые могут отличаться в зависимости от ситуации. В докладе будет описан универсальный фреймфорк на С++, который предоставляет разработчикам симуляторов простой, прозрачный и быстрый доступ к любому параметру. Тестировщикам же он позволяет управлять конфигурациями при помощи стандартных инструментов редактирования и слияния.
Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...Moscow.pm
- Почему C++? Плюсы, минусы.
- Как найти компилятор (поддержка в EUMM, MB, стандартные и не очень решения).
- Конфликты имён.
- Трансляция C++ исключений в Perl-исключения.
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
В докладе перед нами откроется великолепный мир велосипедов и устаревших технологий, которые люди продолжают переносить в новые проекты и повсеместно использовать. Мы поговорим о:
Copy-On-Write
разработке без оглядки на готовые решения и к чему это приводит
force inline
оптимизациях, которые отлично себя показывают на бенчмарках и плохо себя ведут в реальной жизни
бездумно отключаемых оптимизациях компилятора
тонкостях стандартной библиотеки для повседневного использования
супер качественном велосипедостроении
Сравнение статического анализа общего назначения из Visual Studio 2010 и PVS-...Tatyanazaxarova
В статье показаны ошибки, выявленные с помощью статического анализатора кода, встроенного в Visual Studio 2010. Исследование проводилось на пяти open source проектах. Эти же проекты были проверены с помощью PVS-Studio. Приведены результаты сравнения этих двух инструментов.
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMSergey Platonov
Зачастую, знакомство с алиасингом в C++ у многих программистов начинается и заканчивается одинаково: -fno-strict-aliasing. На вопросы новичка, более опытные коллеги отвечают в стиле: «не трогай! а то все сломаешь!». Новичок и не трогает. В докладе будет предпринята попытка заглянуть под капот и понять, что же там, внутри. Что такое алиасинг, где он может быть полезен и какие реальные преимущества дает. Тема будет рассмотрена и со стороны программиста и со стороны разработчика компилятора. А по сему, вопрос «зачем?» будет центральным в повествовании.
Дмитрий Прокопцев, Яндекс
Речь пойдёт о, наверное, одном из самых важных и в то же время сложных нововведений в С++11 — R-ссылках (rvalue references). Мы рассмотрим базовые правила работы с такими ссылками и связанные с ними новые концепции языка: перемещение классов, универсальные ссылки и перенаправление вызовов.
Язык C++ и инфраструктура вокруг него продолжает активно развиваться, что делает этот язык одним из самых эффективных инструментов в настоящее время. Хочется выделить три фактора, делающие язык C++ сейчас столь привлекательным. Первое: нововведения в стандарт языка, позволяющие писать эффективный код. Второе: зрелость инструментов разработки и увеличение скорости сборки проектов. Третье: зрелось вспомогательного инструментария, позволяющие контролировать качество кода и другие аспекты жизненного цикла проекта. Этот доклад - ода языку программирования C++!
Незаменимый С++. Антон Полухин. CoreHard Spring 2019corehard_by
Каждый новомодный язык программирования норовит заявить о том, что он быстрее, надёжнее и вообще по всем параметрам в несколько раз лучше C++. Давайте разберёмся — где правда, а где вымысел. Да начнётся битва между C++ и Asm/Rust/Go/Java/C#... !
Статический и динамический полиморфизм в C++, Дмитрий ЛевановYandex
На примере некоторых архитектурных решений Крипты Дмитрий расскажет о способах реализации полиморфного поведения в программах на C++, о преимуществах и недостатках этих способов, а также о новых возможностях C++11.
Статический и динамический полиморфизм в C++, Дмитрий ЛевановYandex
На примере некоторых архитектурных решений Крипты Дмитрий расскажет о способах реализации полиморфного поведения в программах на C++, о преимуществах и недостатках этих способов, а также о новых возможностях C++11.
Разница в подходах анализа кода компилятором и выделенным инструментомTatyanazaxarova
У компилятора и сторонних инструментов статического анализа кода есть общая задача - выявление опасных фрагментов кода. Однако существует существенная разница в том, анализ какого типа они осуществляют. Я попробую на примере компилятора Intel C++ и анализатора PVS-Studio продемонстрировать различия подходов, и пояснить, чем они вызваны.
шишки, набитые за 15 лет использования акторов в c++ v.001.3corehard_by
Автор доклада давно и успешно использует Модель Акторов при разработке приложений на C++. В основном это был положительный опыт. Но есть некоторые неочевидные моменты, про которые было бы хорошо узнать заранее. О том, где использование Модели Акторов уместно, а где нет, на какие грабли довелось наступить, какие шишки были набиты, как можно упростить себе жизнь и пойдет речь в докладе.
Евгений Охотников
Системный архитектор @stiffstream
Подробнее...
Слайды доклада на конференции C++ Corehard Winter 2017 (г.Минск).
Автор доклада давно и успешно использует Модель Акторов при разработке приложений на C++. В основном это был положительный опыт. Но есть некоторые неочевидные моменты, про которые было бы хорошо узнать заранее. О том, где использование Модели Акторов уместно, а где нет, на какие грабли довелось наступить, какие шишки были набиты, как можно упростить себе жизнь и пойдет речь в докладе.
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...corehard_by
Все мы знаем, что компиляторы в настоящее время достаточно умные. И нам как программистам зачастую не нужно думать о каких-то незначительных оптимизациях - мы полагаемся на оптимизации компилятора. Что ж, настало время выяснить, действительно ли настолько компиляторы умны и узнать, в каких местах программист всё же (может быть) умнее.
Similar to Акторы на C++: стоило ли оно того? (20)
arataga. SObjectizer and RESTinio in action: a real-world exampleYauheni Akhotnikau
Slides about the usage of SObjectizer and RESTinio in implementation of performant socks5/http1.1 proxy server that has to deal with thousands of entry points.
Actor Model and C++: what, why and how? (March 2020 Edition)Yauheni Akhotnikau
This is an updated version of slides from my talk on the C++ CoreHard Autumn 2016 conference.
The Actor Model which is currently trending in software development is a popular design approach when it comes to complex applications. Many systems are written in Erlang (Akka framework) are designed with the Actor Model in their core. But Erlang and Akka are managed environments and safe programming languages. Is it worth using the Actor Model in C++? If yes, where to look and what to use? The talk will cover all these topics.
Слайды одноименного доклада с конференции C++ CoreHard Autumn 2018 (г.Минск, 2018.11.03).
Краткое описание доклада:
На предыдущих конференциях C++ CoreHard автор доклада рассказывал про Модель Акторов и опыт ее использования в C++. Но Модель Акторов -- это далеко не единственный способ борьбы со сложностью при работе с многопоточностью. Давайте попробуем поговорить о том, что еще можно применить и как это может выглядеть в C++.
Shrimp: A Rather Practical Example Of Application Development With RESTinio a...Yauheni Akhotnikau
Description of a demo project for serving images by using Actor Model and embedded HTTP-server. This project is implemented in C++17 with SObjectizer and RESTinio (OpenSource products from stiffstream).
Акторы в C++: взгляд старого практикующего актородела (St. Petersburg C++ Use...Yauheni Akhotnikau
Автор доклада более 16 лет отвечает за развитие Open-Source фреймворка SObjectizer -- одного из немногих живых, эволюционирующих, кросс-платформенных фреймворков для C++, базирующихся на Модели Акторов. При этом SObjectizer никогда не был исследовательским экспериментом и с самого начала использовался в ряде business-critical проектов.
За годы разработки и эксплуатации SObjectizer накопился некоторый практический опыт использования акторов в С++, которым докладчик поделится со слушателями. Речь пойдет о том, почему Модель Акторов выглядит привлекательной, где и когда ее выгодно использовать. Какие особенности накладывает именно С++ и разумно ли использовать Модель Акторов в C++? Почему реализации Модели Акторов для C++ настолько разные и почему SObjectizer получился именно таким?
GECon 2017: C++ - a Monster that no one likes but that will outlast them allYauheni Akhotnikau
Slides from my presentation from GECon-2017 conference: https://events.epam.com/events/gecon-2017
It covers the following topics:
A bit of C++ evolution history.
Why C++ became popular and why C++ started to lose its popularity.
Why C++ is a Monster? If C ++ is a monster, then why does someone need C++?
How to use C++ safely and efficiently?
Where and when C++ can be used. If it can...
Pressure to C++ from competitors. Real and imaginary.
Dive into SObjectizer 5.5. Tenth part: Mutable MessagesYauheni Akhotnikau
This part describes a feature which was introduced in v.5.5.19: an ability to send mutable messages with guarantees that it will be delivered to at most one receiver.
Actor model which is currently trending in software development is a popular design approach when it comes to complex applications. Many systems written in Erlang (Akka framework) are designed with actor model in their core. But Erlang and Akka are managed environments and safe programming languages. Is it worth using actor model in C++? If yes, where to look and what to use? The talk will cover all these topics.
Dive into SObjectizer 5.5. Seventh part: Message LimitsYauheni Akhotnikau
Next part of serie with deep dive into SObjectizer-5.5. A brief explanation of message limits feature. This feature allows to protect agents from overloading in simple situations and can be used as building blocks for more complex and domain-specific overload control schemes.
2. Коротко о себе
Начал программировать в 1990-ом.
В обнимку c C++ c 1992-го.
Был разработчиком, руководителем отдела, руководителем
управления, совладельцем софтверной компании.
Насмотрелся на C++, его плюсы и минусы с разных сторон.
С 2002-го года отвечаю за разработку SObjectizer.
2
3. SObjectizer
Инструмент для упрощения разработки многопоточных и/или
событийно-ориентированных приложений на C++.
Комбинирует идеи из Actor Model, Publish-Subscribe и CSP.
Живет на SourceForge + зеркало на github.
Рассказ о SObjectizer был на C++Russia 2017:
● слайды;
● видео.
3
4. Давным-давно, в далекой-далекой...
SObjectizer имеет длительную историю, но мы начнем лишь с 2002-
го года.
2002: начало разработки и эксплуатации SObjectizer-4.
С++98. Но с оглядкой на VC++ 6.0 и старые версии GCC.
2010: начало разработки SObjectizer-5.
Сразу на C++0x. Без нормальной его поддержки в компиляторах.
4
6. Да кому C++ вообще нужен?
Огромная конкуренция со стороны других языков
программирования.
Java, C#, Scala, Python, Erlang, Go, Kotlin, Rust...
Объективно, C++ ‒ это нишевый язык. Для большого количества
задач есть лучшие альтернативы.
Классический вопрос:
А зачем нужен ваш SObjectizer, если есть Erlang, Akka и Go?
6
7. C++ везде очень разный
В разработке десктоп-приложений C++ свой.
В разработке hard real-time С++ свой.
В разработке high performance computing С++ свой.
В разработке embedded systems С++ свой.
Яркий пример: отношение к использованию исключений.
7
8. Управление зависимостями ‒ боль
В нормальных языках есть Maven, Cargo, Cabal, RubyGems, ...
В С++: buckaroo, build2, cget, conan, conda, cpm, cppan, hunter, vcpkg, ...
Только де-факто стандарта нет :(
Де-факто есть CMake* + целый зоопарк: bazel, build2, buckaroo,
meson, scons, waf. Ну и старый добрый make.
Написать что-то свое иногда проще, чем подключить чужое :(
8
* Отличный пример Worse Is Better :(
9. Есть C++ в стандарте, а есть C++...
...в вашем компиляторе.
Иногда это сильно разные C++.
Особенно в прошлом.
Не все имеют возможность сидеть на самых новых компиляторах.
Боль для разработчиков библиотек. Как пример: использование
подмножества C++11 через несколько лет после выхода C++14.
9
10. Компилятор влияет на дизайн (1-1)
Variadic templates из C++11
API когда поддержки variadic templates нет:
struct my_message : public so_5::message_t {
...
my_message(int a, int b, int c) : ... {}
};
const so_5::mbox_t & target = ...;
unique_ptr<my_message> msg(new my_message(1, 2, 3));
target->deliver_message(std::move(msg));
10
11. Компилятор влияет на дизайн (1-2)
Variadic templates из C++11
API когда поддержка variadic templates есть:
struct my_message : public so_5::message_t {
...
my_message(int a, int b, int c) : ... {}
};
const so_5::mbox_t & target = ...;
so_5::sent<my_message>(target, 1, 2, 3);
11
12. Компилятор влияет на дизайн (2)
noexcept из C++11
constexpr из C++11/14
Перегрузка методов для & и && (актуально для builder pattern).
До сих пор забываю использовать вышеперечисленное.
Приходится обкладываться макросами для VC++12.0.
12
14. Нет compile-time рефлексии (2)
Метаописание для SObjectizer-а.
14
// Описание класса агента для SObjectizer-а.
SOL4_CLASS_START( a_hello_t )
// Описание сообщений.
SOL4_MSG_START( msg_hello, a_hello_t::msg_hello )
SOL4_MSG_FINISH()
// Описание событий.
SOL4_EVENT( evt_start )
SOL4_EVENT( evt_hello )
// Описание единственного состояния.
SOL4_STATE_START( st_initial )
SOL4_STATE_EVENT( evt_start )
SOL4_STATE_EVENT( evt_hello )
SOL4_STATE_FINISH()
SOL4_CLASS_FINISH()
15. Скудная стандартная библиотека
Раньше даже hash-tables нужно было искать на стороне.
В C++11/14/17 уже сильно получше. Но до JDK далеко :(
Многое до сих пор нужно искать на стороне.
Очень уж разные вкусы у C++ников: Boost, ACE, libev, libuv и т.д.
Чтобы ты не выбрал, будет много тех, кому твой выбор не нравится.
15
16. С++ ‒ это язык без Garbage Collector-а
Странная претензия для C++, но...
...при разработке многопоточного кода GC очень сильно облегчает
жизнь.
Ну очень сильно.
16
18. Fail-fast в C++ ‒ это совсем не то...
...что в Erlang-е или даже в Go.
Деление на ноль.
Не обработанное на верхнем уровне исключение.
Представьте, что это делает нить в многопоточном C++
приложении.
18
25. 25
func main() {
sayHello := make(chan string)
sayWorld := make(chan string)
quitter := make(chan string)
go func() {
for i := 0; i < 1000; i++ {
fmt.Print("Hello ")
sayWorld <- "Do it"
<-sayHello
}
sayWorld <- "Quit"
}()
go func() {
for {
var reply string
reply = <-sayWorld
if (reply == "Quit") {
break
}
fmt.Print("World!n")
sayHello <- "Do it"
}
quitter <- "Done"
}()
<-quitter
}
int main() {
wrapped_env_t sobj;
auto say_hello = create_mchain( sobj );
auto say_world = create_mchain( sobj );
thread hello{ [&] {
string reply;
for( int i = 0; i != 1000; ++i ) {
cout << "Hello ";
say_world << "Do it"s;
say_hello >> reply;
}
say_world << "Quit"s;
} };
thread world{ [&] {
for(;;) {
string reply;
say_world >> reply;
if( "Quit" == reply )
break;
cout << "World" << endl;
say_hello << "Do it"s;
}
} };
auto_join(hello, world);
}
#include <iostream>
#include <thread>
#include <so_5/all.hpp>
using namespace std;
using namespace std::literals;
using namespace so_5;
template< typename T >
void operator<<( mchain_t & to, T && o ) {
send< T >( to, forward<T>(o) );
}
template< typename T >
void operator>>( mchain_t & from, T & o ) {
receive( from, infinite_wait, [&o]( const T & msg ) { o = msg; } );
}
26. Макросы и препроцессор
Мало кто любит. Ждут C++ без макросов. Когда-то в светлом
будущем...
Но сейчас более чем востребованы:
● несовместимости между компиляторами;
● системно-зависимые вещи;
● отладочно-трассировочный код;
● средство борьбы с boilerplate code;
● особенности поведения компиляторов с -Wall, -Weverything...
26
27. Макросы, препроцессор и -Weverything
// Воспользуемся __has_cpp_attribute, если доступен.
#if defined(__has_cpp_attribute)
// clang-4 и clang-5 ругаются при попытках использовать
// [[nodiscard]] совместно с -std=c++11 и -std=c++14
#if __has_cpp_attribute(nodiscard) &&
!(defined(SO_5_CLANG) && __cplusplus < 201703L)
#define SO_5_NODISCARD [[nodiscard]]
#endif
#endif
// Уточняем что получилось с nodiscard.
#if !defined( SO_5_NODISCARD )
#define SO_5_NODISCARD
#endif
27
29. Поговорим далеко не обо всем...
В обзор не вошли очень важные особенности С++:
● унифицированная система типов;
● конструкторы-деструкторы, RAII;
● пространства имен;
● const-методы (в том числе const-методы + mutable);
● лямбды;
● ...
29
30. Скорость исполнения
C++ в числе безусловных лидеров по скорости работы кода.
Огромное количество ресурсов уже вложено в оптимизирующие
компиляторы.
Добавление дополнительных уровней абстракции в C++ может
обходиться дешевле, чем в других языках программирования.
30
31. Поддержка ООП
31
Это сейчас ООП модно ругать и еще более модно от него
отказываться.
Но ООП отлично работало и 30-ть, и 20-ть лет назад.
И сейчас оно хорошо работает. Просто реже нужно.
В C++ очень хорошая поддержка ООП.
Лучше только в Eiffel, но в Eiffel есть GC и куча других проблем.
33. typedef/using (2)
33
Отличный способ сократить количество писанины.
template<typename Work_Thread> using dispatcher_template_t =
so_5::disp::thread_pool::common_implementation::dispatcher_t<
Work_Thread,
dispatcher_queue_t,
agent_queue_t,
params_t,
adaptation_t>;
using timer_manager_factory_t = std::function<
timer_manager_unique_ptr_t(
error_logger_shptr_t,
outliving_reference_t<timer_manager_t::elapsed_timers_collector_t>)>;
Очень сильно не хватает в Java и том же Eiffel.
34. typedef/using (3)
34
Один из лучших друзей кода с длинной историей.
namespace rt
{
/*!
* deprecated Obsolete in v.5.5.1. Use so_5::intrusive_ptr_t instead.
*/
template< class T > using smart_atomic_reference_t = intrusive_ptr_t< T >;
/*!
* since v.5.5.9
*
* brief A typedef for compatibility with previous versions.
* deprecated Will be removed in v.5.6.0.
*/
using agent_coop_t = so_5::coop_t;
}
35. typedef/using (4)
35
Удобный способ "спрятать" детали реализации.
using private_dispatcher_handle_t = so_5::intrusive_ptr_t< private_dispatcher_t >;
using demands_counter_t = std::atomic< std::size_t >;
36. Перегрузка (1)
36
Упрощаем жизнь пользователям по мере накопления опыта.
Было:
const so_5::agent_t & target = ...;
so_5::send<Msg>(target.so_direct_mbox(), ...);
so_5::send_delayed<Msg>(target.so_environment(), target.so_direct_mbox(), 100ms, ...);
40. Исключения (1)
40
Спорам "использовать или не использовать" несть числа.
Отдельное спасибо Google за его C++ Style Guide:
● все знают про Google C++ Style Guide и запрет исключений в нем;
● мало кто сумел дочитать этот гайдлайн до:
"On their face, the benefits of using exceptions outweigh the costs, especially in new projects.
However, for existing code, the introduction of exceptions has implications on all dependent
code. If exceptions can be propagated beyond a new project, it also becomes problematic to
integrate the new project into existing exception-free code. Because most existing C++ code at
Google is not prepared to deal with exceptions, it is comparatively difficult to adopt new code
that generates exceptions."
41. Исключения (2)
41
Кто действительно любит писать код в таком стиле?
auto msg = allocate_message<my_message>();
if(!msg)
return msg.error();
auto init_result = msg->init(1, 2, 3);
if(init_result)
return init_result;
auto send_result = target->deliver_message(std::move(*msg));
if(send_result)
return send_result;
42. Исключения (3)
42
Мы предпочитаем писать так:
target->deliver_message(std::make_unique<my_message>(1, 2, 3));
И исключения позволяют нам так делать не теряя в надежности.
А если называть вещи своими именами, то существенно
выигрывая в надежности.
43. Шаблоны. Обычные и Variadic
43
Очень и очень упрощают жизнь в C++.
Активно используются в SObjectizer (для версии 5.5.22):
http://cloc.sourceforge.net v 1.64 T=1.76 s (111.4 files/s, 35211.6 lines/s)
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
C/C++ Header 133 6167 21581 20290
C++ 61 2634 2869 10675
CMake 2 29 0 183
Ruby 4 56 2 135
44. Шаблоны. Обычные
44
Фрагмент реализации диспетчеров (С++11):
template<typename Demand_Queue, template<class> class Work_Thread >
class work_thread_template_t : public Work_Thread< Demand_Queue >
{
auto pop_demand() -> decltype(std::declval<Demand_Queue>().pop()) {...}
...
};
...
template< typename Demand_Queue >
using work_thread_no_activity_tracking_t =
work_thread_template_t<Demand_Queue, work_thread_details::no_activity_tracking_impl_t >;
template< typename Demand_Queue >
using work_thread_with_activity_tracking_t =
work_thread_template_t<Demand_Queue, work_thread_details::with_activity_tracking_impl_t >;
45. Шаблоны. Variadic
45
Не самая простая, но удобная шаблонная функция:
template< typename Timeout, typename... Handlers >
inline mchain_receive_result_t receive(
const so_5::mchain_t & chain,
Timeout waiting_timeout,
Handlers &&... handlers ) {...}
Позволяет писать почти как в Go:
receive(channel, so_5::infinite_wait,
[&](mhood_t<new_request> cmd) {...},
[&](mhood_t<check_status> cmd) {...},
[&](mhood_t<cancel_request> cmd) {...},
[&](mhood_t<reconfigure> cmd) {...});
46. Пора переходить к итогам
Был ли смысл в создании
акторного фреймворка для C++?
46
47. Да!
47
Модель Акторов ‒ это один из способов упростить разработку.
Как и Publish-Subscribe. Как и CSP.
Использование голых нитей и mutex-ов в C++ ‒ это пот, боль и
кровь.
Чем более высокоуровневый инструмент в руках у разработчика,
тем проще, быстрее и надежнее.
Не забываем про скорость работы C++ кода.
48. И еще об итогах...
Легко ли "продать" акторный
фреймворк для C++?
48
49. Нет!
49
Ниша C++ сама по себе сжимается со временем.
Большое количество удобных альтернатив (Erlang, Akka, Go).
Особенно для задач, где Actor Model, Pub/Sub и CSP востребованны.
С++ в разных предметных областях очень разный. Невозможно
создать инструмент, который был бы одинаково удобен в embbeded,
HPC и desktop.
NIH-синдром и C++-сообщество. Зачастую это объективно, см.
предыдущий пункт.
51. SObjectizer: https://sourceforge.net/p/sobjectizer или
https://github.com/eao197/so-5-5
Документация по SObjectizer: https://sourceforge.net/p/sobjectizer/wiki/Home/
Статьи о SObjectizer на русском: https://habrahabr.ru/users/eao197/posts
Серия презентаций о SObjectizer на английском "Dive into SObjectizer-5.5":
Intro, Agent's States, More About Coops, Exceptions, Timers, Synchonous
Interaction, Message Limits, Dispatchers, Message Chains, Mutable Messages.
Если вам нужна помощь по SObjectizer: https://stiffstream.com
51