Шаблоны — мощный инструмент, добавляющий в язык новые возможности, а программистам в команде — новые проблемы. Доклад покажет, как тщательно продуманный шаблонный код может не усложнить, а упростить жизнь и дать надёжную абстракцию межпроцессных межъязыковых асинхронных вызовов функций. С помощью шаблонов можно:
адаптировать Promise/A+ из Javascript для C++
автоматически проверять и раскладывать динамический массив аргументов на статичные аргументы функции
сделать аналог std::bind для weak_ptr.
Эти вещи будут показаны на примере взаимных вызовов между C++ и Javascript в одном приложении с помощью CEF3.
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
Кто-то верно подметил, что разработчики статических анализатора часто сталкиваются с "проблемой айсберга". Им сложно объяснить разработчикам, почему сложно написать и развивать статические анализаторы кода. Дело в том, что сторонние наблюдатели видят только вершину всего процесса, так как им доступен для изучения только простой интерфейс, который предоставляют анализаторы для взаимодействия с миром. Это ведь не графический редактор с сотнями кнопок и рычажков. В результате и возникает ощущение, что раз прост интерфейс взаимодействия, то и прост продукт. На самом деле статические анализаторы кода — это сложные программы, в которых живут и взаимодействуют разнообразнейшие методы поиска дефектов. В них реализуется множество экспертные системы, выдающие заключения о коде на основе как точных, так и эмпирических алгоритмах. В парном докладе, основатели анализатора PVS-Studio расскажут о том, как незаметно потратить 10 лет, чтобы написать хороший анализатор. Дьявол кроется в деталях!
Евгений Зуев, С++ в России: Стандарт языка и его реализацияPlatonov Sergey
Доклад посвящён различным аспектам компилятора С++, созданного с участием автора. В выступлении рассказывается о продвинутой архитектуре компилятора, основных проектных решениях, а также обсуждаются особенности входного языка, повлиявшие на реализацию компилятора.
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
В докладе перед нами откроется великолепный мир велосипедов и устаревших технологий, которые люди продолжают переносить в новые проекты и повсеместно использовать. Мы поговорим о:
Copy-On-Write
разработке без оглядки на готовые решения и к чему это приводит
force inline
оптимизациях, которые отлично себя показывают на бенчмарках и плохо себя ведут в реальной жизни
бездумно отключаемых оптимизациях компилятора
тонкостях стандартной библиотеки для повседневного использования
супер качественном велосипедостроении
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
Кто-то верно подметил, что разработчики статических анализатора часто сталкиваются с "проблемой айсберга". Им сложно объяснить разработчикам, почему сложно написать и развивать статические анализаторы кода. Дело в том, что сторонние наблюдатели видят только вершину всего процесса, так как им доступен для изучения только простой интерфейс, который предоставляют анализаторы для взаимодействия с миром. Это ведь не графический редактор с сотнями кнопок и рычажков. В результате и возникает ощущение, что раз прост интерфейс взаимодействия, то и прост продукт. На самом деле статические анализаторы кода — это сложные программы, в которых живут и взаимодействуют разнообразнейшие методы поиска дефектов. В них реализуется множество экспертные системы, выдающие заключения о коде на основе как точных, так и эмпирических алгоритмах. В парном докладе, основатели анализатора PVS-Studio расскажут о том, как незаметно потратить 10 лет, чтобы написать хороший анализатор. Дьявол кроется в деталях!
Евгений Зуев, С++ в России: Стандарт языка и его реализацияPlatonov Sergey
Доклад посвящён различным аспектам компилятора С++, созданного с участием автора. В выступлении рассказывается о продвинутой архитектуре компилятора, основных проектных решениях, а также обсуждаются особенности входного языка, повлиявшие на реализацию компилятора.
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
В докладе перед нами откроется великолепный мир велосипедов и устаревших технологий, которые люди продолжают переносить в новые проекты и повсеместно использовать. Мы поговорим о:
Copy-On-Write
разработке без оглядки на готовые решения и к чему это приводит
force inline
оптимизациях, которые отлично себя показывают на бенчмарках и плохо себя ведут в реальной жизни
бездумно отключаемых оптимизациях компилятора
тонкостях стандартной библиотеки для повседневного использования
супер качественном велосипедостроении
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMSergey Platonov
Зачастую, знакомство с алиасингом в C++ у многих программистов начинается и заканчивается одинаково: -fno-strict-aliasing. На вопросы новичка, более опытные коллеги отвечают в стиле: «не трогай! а то все сломаешь!». Новичок и не трогает. В докладе будет предпринята попытка заглянуть под капот и понять, что же там, внутри. Что такое алиасинг, где он может быть полезен и какие реальные преимущества дает. Тема будет рассмотрена и со стороны программиста и со стороны разработчика компилятора. А по сему, вопрос «зачем?» будет центральным в повествовании.
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
В последнее время в промышленной разработке ПО особую популярность обретают Domain-Specific Lanugages (DSL). Они драматически упрощают разработку и дают возможность “программировать” не только программистам, но и пользователям прикладных программ.
В своем докладе я расскажу об опыте использования DSL применительно к С++, причем упор будет сделан на производительность кода DSL, и его мгновенную “встраиваемость” в запущенную программу путем компиляции DSL-кода в нативный код с помощью инструментария LLVM.
Современный статический анализ кода: что умеет он, чего не умели линтерыcorehard_by
Статический анализ появился почти 40 лет назад. В своём докладе мы хотим показать, чему за это время научились статические анализаторы. Мы рассмотрим различные методики анализа, как они появлялись и какие ошибки можно найти с помощью них. Посмотрим на примеры ошибок, найденных PVS-Studio в Open Source проектах. Поговорим о том, чем статический анализатор отличается от "линтеров" и некоторых других инструментов, а также какие проблемы решает современный статический анализатор C++ кода, помимо собственно анализа кода.
Павел Беликов
@PVS-Studio, Тула, Россия
Андрей Карпов, Приватные байки от разработчиков анализатора кодаSergey Platonov
Доклад о редких нестандартных расширениях языка С++, про которые никто не знает, но которые надо поддерживать в анализаторе кода.
О магии Visual C++ с файлом stdafx.h, когда проект компилируется, хотя не должен. О том как зародился viva64 (предшественник PVS-Studio) для поиска 64-битных проблем. Как и почему исчез анализ кода, который одно время существовал в компиляторе Intel C++.
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекPython Meetup
"SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек", Алексей Черкес
Кратко рассказано о том, что такое биндинг и Pуthon c API. Краткий обзор средств биндинга для Python. SWIG: что такое, зачем нужен, особенности, схема работы утилит, порядок запуска и сборки, принципы работы, как происходит сопоставление объектных моделей С++ и целевого языка. Примеры на Python и C#. Опыт применения, плюсы/минусы.
Многие разработчики не представляют, как дорого обходятся ошибки в программах. Причем я имею в виду не падения ракет и прочие катастрофы, а обыкновенное прикладное программное обеспечение. Хочется показать всю важность нахождения ошибок на самых ранних этапах. Одним из способов выявить ошибку как можно раньше является статический анализ кода. Поговорим мы не только об этом, но и о различных приемах при написании кода, которые позволят избежать множество типовых ошибок.
Как показывает практика, повсеместное применение классического, основанного на callback’ах подхода к асинхронному программированию обычно оказывается неудобным. Для упрощения написания и поддержки сложного асинхронного кода можно использовать иной подход — с использованием сопрограмм. Он значительно сокращает объём и сложность кода, превращая код из асинхронного в синхронный.
В рамках данного выступления вас ждут:
* рассказ о полезных и интересных вещах из Boost
* новости с передовиц разработки Boost и о новинках ожидаемых в следующих версиях
* что из Boost готовится к переезду в новый стандарт С++
* как экспериментировать с Boost, имея под рукой только браузер
* что людям не нравится в Boost и как с этими людьми бороться (-:
Использование юнит-тестов для повышения качества разработкиvictor-yastrebov
В докладе рассмотрены подходы к созданию надежных юнит-тестов, которые просты в поддержке и модернизации, а также принципы создания кода пригодного для покрытия автотестами. Приведены два способа внедрения зависимости: с использованием конструктора тестируемого объекта, а также с использованием подхода "выделить и переопределить". Каждый из способов разобран на примере, демонстрирующем особенности его реализации и применения. Приведен ряд практических советов, нацеленных на создание надежных юнит-тестов. Использование на практике приведенных подходов и принципов позволяет упростить процесс поддержки и модификации существующего кода, а также дает уверенность в надежности работы добавляемого нового функционала. В конечном итоге это приводит к повышению качества разрабатываемого продукта.
Поговорим о рефлексии в C++, о том, что это такое, для чего нужно и почему это вообще важно. На практическом примере с котами рассмотрим эволюцию подходов к рефлексии в рамках разных версий языка: C++03, C++11/14, C++17. Посмотрим на то, что для нас готовят разработчики нового стандарта, узнаем где и как можно "пощупать" эти новые возможности. Поделимся полезными утилитами и подходами, которые облегчат жизнь пока эти новые возможности не придут к вам на проект.
Слайды доклада на конференции C++ Corehard Winter 2017 (г.Минск).
Автор доклада давно и успешно использует Модель Акторов при разработке приложений на C++. В основном это был положительный опыт. Но есть некоторые неочевидные моменты, про которые было бы хорошо узнать заранее. О том, где использование Модели Акторов уместно, а где нет, на какие грабли довелось наступить, какие шишки были набиты, как можно упростить себе жизнь и пойдет речь в докладе.
ЛЕКЦИЯ 4. Шаблоны многопоточного программирования
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
Intel IPP Samples for Windows - работа над ошибкамиTatyanazaxarova
Это моя очередная заметка о том, как PVS-Studio делает программы более надёжными. То есть где, и какие ошибки он обнаруживает. На этот раз под молоток попали примеры, демонстрирующие работу с библиотекой IPP 7.0 (Intel Performance Primitives Library).
Из презентации вы узнаете:
— как мы пришли к Go, оставив идею использования Node.js, Scala или Rust;
— про первый сервис, который мы написали на Go и запустили в продакшен;
— про ошибки, с которыми сталкивались под нагрузкой;
— про оптимизации, которые мы сделали и еще планируем сделать;
— про тестирование и предотвращение тестирования на продакшене (в частности, websocket'ов).
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMSergey Platonov
Зачастую, знакомство с алиасингом в C++ у многих программистов начинается и заканчивается одинаково: -fno-strict-aliasing. На вопросы новичка, более опытные коллеги отвечают в стиле: «не трогай! а то все сломаешь!». Новичок и не трогает. В докладе будет предпринята попытка заглянуть под капот и понять, что же там, внутри. Что такое алиасинг, где он может быть полезен и какие реальные преимущества дает. Тема будет рассмотрена и со стороны программиста и со стороны разработчика компилятора. А по сему, вопрос «зачем?» будет центральным в повествовании.
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
В последнее время в промышленной разработке ПО особую популярность обретают Domain-Specific Lanugages (DSL). Они драматически упрощают разработку и дают возможность “программировать” не только программистам, но и пользователям прикладных программ.
В своем докладе я расскажу об опыте использования DSL применительно к С++, причем упор будет сделан на производительность кода DSL, и его мгновенную “встраиваемость” в запущенную программу путем компиляции DSL-кода в нативный код с помощью инструментария LLVM.
Современный статический анализ кода: что умеет он, чего не умели линтерыcorehard_by
Статический анализ появился почти 40 лет назад. В своём докладе мы хотим показать, чему за это время научились статические анализаторы. Мы рассмотрим различные методики анализа, как они появлялись и какие ошибки можно найти с помощью них. Посмотрим на примеры ошибок, найденных PVS-Studio в Open Source проектах. Поговорим о том, чем статический анализатор отличается от "линтеров" и некоторых других инструментов, а также какие проблемы решает современный статический анализатор C++ кода, помимо собственно анализа кода.
Павел Беликов
@PVS-Studio, Тула, Россия
Андрей Карпов, Приватные байки от разработчиков анализатора кодаSergey Platonov
Доклад о редких нестандартных расширениях языка С++, про которые никто не знает, но которые надо поддерживать в анализаторе кода.
О магии Visual C++ с файлом stdafx.h, когда проект компилируется, хотя не должен. О том как зародился viva64 (предшественник PVS-Studio) для поиска 64-битных проблем. Как и почему исчез анализ кода, который одно время существовал в компиляторе Intel C++.
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекPython Meetup
"SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек", Алексей Черкес
Кратко рассказано о том, что такое биндинг и Pуthon c API. Краткий обзор средств биндинга для Python. SWIG: что такое, зачем нужен, особенности, схема работы утилит, порядок запуска и сборки, принципы работы, как происходит сопоставление объектных моделей С++ и целевого языка. Примеры на Python и C#. Опыт применения, плюсы/минусы.
Многие разработчики не представляют, как дорого обходятся ошибки в программах. Причем я имею в виду не падения ракет и прочие катастрофы, а обыкновенное прикладное программное обеспечение. Хочется показать всю важность нахождения ошибок на самых ранних этапах. Одним из способов выявить ошибку как можно раньше является статический анализ кода. Поговорим мы не только об этом, но и о различных приемах при написании кода, которые позволят избежать множество типовых ошибок.
Как показывает практика, повсеместное применение классического, основанного на callback’ах подхода к асинхронному программированию обычно оказывается неудобным. Для упрощения написания и поддержки сложного асинхронного кода можно использовать иной подход — с использованием сопрограмм. Он значительно сокращает объём и сложность кода, превращая код из асинхронного в синхронный.
В рамках данного выступления вас ждут:
* рассказ о полезных и интересных вещах из Boost
* новости с передовиц разработки Boost и о новинках ожидаемых в следующих версиях
* что из Boost готовится к переезду в новый стандарт С++
* как экспериментировать с Boost, имея под рукой только браузер
* что людям не нравится в Boost и как с этими людьми бороться (-:
Использование юнит-тестов для повышения качества разработкиvictor-yastrebov
В докладе рассмотрены подходы к созданию надежных юнит-тестов, которые просты в поддержке и модернизации, а также принципы создания кода пригодного для покрытия автотестами. Приведены два способа внедрения зависимости: с использованием конструктора тестируемого объекта, а также с использованием подхода "выделить и переопределить". Каждый из способов разобран на примере, демонстрирующем особенности его реализации и применения. Приведен ряд практических советов, нацеленных на создание надежных юнит-тестов. Использование на практике приведенных подходов и принципов позволяет упростить процесс поддержки и модификации существующего кода, а также дает уверенность в надежности работы добавляемого нового функционала. В конечном итоге это приводит к повышению качества разрабатываемого продукта.
Поговорим о рефлексии в C++, о том, что это такое, для чего нужно и почему это вообще важно. На практическом примере с котами рассмотрим эволюцию подходов к рефлексии в рамках разных версий языка: C++03, C++11/14, C++17. Посмотрим на то, что для нас готовят разработчики нового стандарта, узнаем где и как можно "пощупать" эти новые возможности. Поделимся полезными утилитами и подходами, которые облегчат жизнь пока эти новые возможности не придут к вам на проект.
Слайды доклада на конференции C++ Corehard Winter 2017 (г.Минск).
Автор доклада давно и успешно использует Модель Акторов при разработке приложений на C++. В основном это был положительный опыт. Но есть некоторые неочевидные моменты, про которые было бы хорошо узнать заранее. О том, где использование Модели Акторов уместно, а где нет, на какие грабли довелось наступить, какие шишки были набиты, как можно упростить себе жизнь и пойдет речь в докладе.
ЛЕКЦИЯ 4. Шаблоны многопоточного программирования
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
Intel IPP Samples for Windows - работа над ошибкамиTatyanazaxarova
Это моя очередная заметка о том, как PVS-Studio делает программы более надёжными. То есть где, и какие ошибки он обнаруживает. На этот раз под молоток попали примеры, демонстрирующие работу с библиотекой IPP 7.0 (Intel Performance Primitives Library).
Из презентации вы узнаете:
— как мы пришли к Go, оставив идею использования Node.js, Scala или Rust;
— про первый сервис, который мы написали на Go и запустили в продакшен;
— про ошибки, с которыми сталкивались под нагрузкой;
— про оптимизации, которые мы сделали и еще планируем сделать;
— про тестирование и предотвращение тестирования на продакшене (в частности, websocket'ов).
Семинар по Node.js в КПИ 20 октября 2014. Докладчики: Тимур Шемсединов, Никита Савченко, Максим Петренко. Краткое содержание:
* Что такое Node.js и как работает JavaScript в V8
* Профессионалы расскажут, почему они выбрали Node.js
* Вы узнаете его сильные и слабые стороны и где его лучше применять
* Будет полный обзор особеностей и внутреннего строения Node.js
* Примеры внедрения и Highload-проекты
* Вопросы развертывания, хостинг, тестирования, и отладки
* Где и что учить, что читать, как осваивать
Сергей Константинов — Что интересного готовит нам W3CYandex
2014 год обещает нам множество интересных нововведений. Помимо новинок в HTML5, нас ждут глобальные изменения в самой веб-платформе. Promises и модули — революция в стандартах разработки стандартов. Service Workers — новый подход к решению проблемы офлайновых веб-приложений. @@create — отнаследуйся от HTMLElement! Обо всём этом и пойдёт речь в докладе.
Михаил Рахманов рассказывает о паттерне Promise и его использовании в iOS разработке.
Краткие тезисы:
- Что такое promises?
- Использование promises в iOS разработке (существующие библиотеки и подходы)
- Реализация promises библиотекой PromiseKit (основные методы, цепочки promises, обработка ошибок)
- Какие задачи можно решить с помощью promises, а какие - нельзя
- Использование promises на примере приложения: драм-машины с возможностью сохранять аудио-дорожки
- Подведение итогов: преимущества и недостатки.
RDSDataSource - внутренние пятничные митапы iOS-команды RAMBLER&Co.
Григорий Демченко — Асинхронное программирование и сопрограммыYandex
Как показывает практика, повсеместное применение классического, основанного на callback’ах подхода к асинхронному программированию обычно оказывается неудобным. Для упрощения написания и поддержки сложного асинхронного кода можно использовать иной подход — с использованием сопрограмм. Он значительно сокращает объём и сложность кода, а также существенно упрощает реализацию нетривиальных сценариев, связанных с отменой вычислений и таймаутами операций.
Тестируй это / Виктор Русакович (GP Solutions)Ontico
РИТ++ 2017, Frontend Сonf
Зал Дели + Калькутта, 5 июня, 18:00
Тезисы:
http://frontendconf.ru/2017/abstracts/2625.html
Как писать тесты?
Как запускать тесты?
Кто все сломал?
Все три вопроса рассмотрены в докладе. Также будет демо интеграции проекта, покрытого тестами, и cloud-based-сервиса по запуску этих тестов (github+travis).
Кроме того, расскажу об опыте по сокращению времени прогона тестов; о том, как добавить тесты в случае, если у вас уже есть большое приложение, но все еще без тестов.
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»Yandex
Мониторинг – важная часть работы хорошего сервиса. Мало просто протестировать релиз, надо также убедиться, что код работает у пользователей и работает правильно. В докладе я расскажу про логирование js-ошибок при разных способах загрузки js, подводных камнях, способах их обойти, а также почему это надо делать.
Суперсилы Chrome DevTools — Роман Сальников, 2ГИСYandex
В своей работе мы постоянно используем инструменты, призванные облегчить нам жизнь. Но как хорошо мы ими на самом деле владеем? И почему мы пренебрегаем их суперсилами? Например, Chrome DevTools — это не только отладчик и инспектор HTML. Но когда у нас в руках молоток, кругом мерещатся гвозди. Десятки мегабайт и процентов загрузки процессора на вкладку браузера — верный признак того, что пора учиться пользоваться микроскопом.
Роман предложит освоить что-то посложнее молотка и расскажет о том, какую реальную пользу можно получить от профилирования, как найти в огромном отчёте проблему с кодом и что лучше — написать в коде десяток console.log или async debug.
Иван Пузыревский — Введение в асинхронное программированиеYandex
Доклад посвящен основам асинхронного программирования. Мы кратко обсудим историю вопроса: что такое асинхронность, где, почему и зачем она используется. Затем рассмотрим наиболее частые способы построения асинхронных интерфейсов: основанные на callback'ах и на future/promise. В ходе доклада выделим основные используемые концепции, посмотрим на их реализацию и примеры использования. А в конце поговорим о сложностях, которые часто встречаются в асинхронном программировании.
Любите ли вы велосипеды? Все разработчики любят свои ненаколеночныерешения велосипеды! И мы не исключение. В нашем докладе мы покажем как собирать, сколачивать, вылепливать собственный велосипед так, чтобы на нем потом могла ездить без слёз вся команда, компания, или может весь мир.
Что в докладе будет:
- много Spring Boot-а;
- live coding;
- создание собственного Spring Boot Starter-а;
- Apache Thrift в качестве подопытного кролика.
Чего не будет:
- бенчмарков и сравнений Thrift vs REST vs gRPC vs XXX.
Привет, Санкт-Петербург!
В разгар летнего сезона, мы поговорим об историях обновлений,
например, с 6.4 до 7.х, с разными трюками, а также об истории исследования разных регрессий на продуктах Atlassian и других плагинов.
Наша программа будет пополняться, и мы рады к сотрудничеству.
Ждем Вас на встрече в Яндекс Деньгах.
У нас было 500 страниц спецификаций, 40000 строк кода, 2 офиса, полдюжины разработчиков, а также целое множество андроидов всех сортов и расцветок. Не то, чтобы это был необходимый запас для приложения крупной торговой сети. Но если начал собирать софт, становится трудно остановиться. Единственное, что вызвало у меня опасение — это сетевая библиотека. Нет ничего более беспомощного, безответственного и испорченного, чем писать AsyncTask на каждый вызов. Я знал, что рано или поздно мы перейдём на Event Bus.
Август 2014, DevDay, Новосибирск
Similar to Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript (20)
Доклад вводит в рассмотрение универсальный адаптер, позволяющий обернуть любой класс с целью добавления новых свойств, отсутствующих в оригинальном классе. Получаемые классы могут иметь в точности такой же интерфейс, как и первоначальные, что позволяет прозрачно заменять их и оборачивать любое количество раз.
Это позволяет добавлять необходимые свойства объектам, не переписывая его с нуля. Предложенная обобщенная концепция будет последовательно введена и проиллюстрирована простыми, но интересными примерами.
На протяжении всего существования C++ тема компайл-тайм рефлексии поднимается постоянно, но, к сожалению, до сих пор Стандарт языка не дает достаточных возможностей для извлечения и манипулирования компайл-тайм информацией. Большое количество библиотек и препроцессоров было придумано для того, чтобы решить эту проблему, начиная от простых макросов и заканчивая Qt-moc или ODB. В докладе Антон расскажет о том, как на эту проблему смотрит Комитет по Стандартизации: какие решения были предложены, и какое стало доминирующим.
Evgeniy Muralev, Mark Vince, Working with the compiler, not against itSergey Platonov
The talk will look at limitations of compilers when creating fast code and how to make more effective use of both the underlying micro-architecture of modern CPU's and how algorithmic optimizations may have surprising effects on the generated code. We shall discuss several specific CPU architecture features and their pros and cons in relation to creating fast C++ code. We then expand with several algorithmic techniques, not usually well-documented, for making faster, compiler friendly, C++.
Note that we shall not discuss caching and related issues here as they are well documented elsewhere.
Василий Сорокин, Простой REST сервер на Qt с рефлексиейSergey Platonov
Библиотека Qt имеет довольно мощную систему рефлексии. На примере простого в использовании класса, позволяющего с помощью наследования быстро построить REST сервер под ваши нужды, я покажу как элегантно ее можно задействовать в реальной жизни. В заключительной части, покажу еще один пример когда рефлексия Qt помогает красиво протестировать испускание сигналов классом.
Антон Бикинеев, Writing good std::future< C++ >Sergey Platonov
В докладе Антон расскажет о грядущих мажорных изменениях языка, которые, не войдя в Стандарт 17-го года и оставшись в Technical Specifications, будут ждать своего мержа в 20-м, а также быть уже реализованными в некоторых компиляторах. Осветятся также минорные, уже одобренные фичи следующего Стандарта, как языковые, так и библиотечные. Антон расскажет об их целях, покажет методы использования, а также осветит некоторые гайдлайны и трики.
Павел Филонов, Разделяй и управляй вместе с Conan.ioSergey Platonov
Несмотря на солидный возраст С++, одной из больших проблем, возникающих при разработке с его использованием, до сих пор является управление зависимостям. Особенно остро этот вопрос возникает при наличии нескольких различных целевых платформ. В докладе будет рассмотрено, как менеджер пакетов Conan.io позволяет решить проблему управления зависимостями и, как следствие, значительно улучшить скорость разработки на C++ и повысить модульность разрабатываемых систем.
Григорий Демченко, Асинхронность и неблокирующая синхронизацияSergey Platonov
Практика показывает, что использование подхода, основанного на колбеках для асинхронного программирования обычно не является удобным и подвержено различным ошибкам. Для упрощения написания и поддержки сложных асинхронных программ можно использовать несколько иной подход: использовать сопрограммы для переключения контекста на время ожидания события. Такой подход позволяет реализовать интересные неблокирующие примитивы, включая неблокирующее сетевое взаимодействие, неблокирующие мьютексы, а также удобное переключение между различными пулами потоков для разнесения выполнения задач, которые требуют различные ресурсы.
Хочется чего-то новенького, необычного? Тогда добро пожаловать в мир чудеc C++17:
if constexpr (auto& [number, ok] = variable; ok)
return "Hi"
else
return number + 42;
Вы услышите о новом стандарте C++, обнаружите для себя новые полезные классы, функции и возможности языка. Для каждой новинки я приведу примеры использования, расскажу о нюансах и подводных камнях.
А ещё вы узнаете о том, как проходят заседания комитета по стандартизации C++ и сможете задать интересующие вас вопросы связанные с нововведениями С++17 и С++Next.
Павел Беликов, Как избежать ошибок, используя современный C++Sergey Platonov
Одной из проблем C++ является большое количество конструкций, поведение которых не определено или просто неожиданно для программиста. С такими ошибками мы часто сталкиваемся при разработке статического анализатора кода. Но, как известно, лучше всего находить ошибки ещё на этапе компиляции. На этом докладе мы поговорим о том, какие техники из современного C++ позволяют писать не только более простой и выразительный, но и безопасный код. Вы увидите ошибки в коде различных Open Source проектов и узнаете, как можно их избежать, используя новые стандарты
Тестирование графического интерфейса пользователя является одним из основных видов тестирования графических приложений. В докладе будут рассмотрены задачи и особенности такого тестирования.
Далее будут рассмотрены плюсы и минусы использования стандартной Qt библиотеки QTest, и представлен проект QSpec, как альтернатива QTest. Также будут представлены примеры использования QSpec и дальнейшие планы по развитию этого проекта.
Адрес проекта: https://github.com/ugeneunipro/QSpec
Не так давно Гор Нишанов представил свой доклад: C++ Coroutines a negative overhead abstraction. В этом докладе Гор упомянул, что предложенный дизайн корутин позволяет их использовать практически в любых окружениях, в том числе и с "бедным" C++ рантаймом.
Я решил попробовать запустить корутины в следующих окружениях: обычное приложение, драйвер ОС Windows, EFI приложение. Только в одном из этих окружений есть полноценный C++ рантайм и поддержка исключений, в остальных ничего этого нет. Более того, EFI приложение вообще выполняется до старта ОС.
Я хочу рассказать о том, как мне удалось запустить корутины в этих окружениях, поговорим о том, какие проблемы существуют в асинхронном системном программировании и как их можно обойти.
Дмитрий Демчук. Кроссплатформенный краш-репортSergey Platonov
Доклад будет посвящен возможностям библиотеки Google Breakpad по созданию краш-репорта. Посмотрим как это работает изнутри.
На примерах будут рассмотрены способы интеграции библиотеки на разных платформах Windows, Linux, Max OS.
2. Дилемма метапрограммирования
• Плюсы:
• Вносит в язык новые возможности
• Делает язык выразительнее
• Минусы:
• Имеет намного больший (чем ООП) порог вхождения
• Отнимает очень много (сколько угодно) времени
• Плохо подходит для решения повседневных задач на C++
• Хорошо подходит, чтобы заложить фундамент новых проектов
3. Суть нашей проблемы
CEF3 render processCEF3 browser process
V8 (Javascript)
Blink (HTML/CSS)
libcef.dll libcef.dll
JSON-подобные сообщения
(protobuf)
Прикладной протокол
(События, запуск фоновых
задач, управление жизненным
циклом UI)
???Прикладной
движок на C++
Прикладной UI
на HTML5/CSS3
+ Javascript
4. Диспетчеризация сообщений
string message_name = request;
if (message_name == kFileOpenMessageName) {
dialog_state_->mode_ = FILE_DIALOG_OPEN;
title = "My Open Dialog";
} else if (message_name == kFileOpenMultipleMessageName) {
dialog_state_->mode_ = FILE_DIALOG_OPEN_MULTIPLE;
title = "My Open Multiple Dialog";
} else if (message_name == kFileOpenFolderMessageName) {
dialog_state_->mode_ = FILE_DIALOG_OPEN_FOLDER;
title = "My Open Folder Dialog";
} /* ... */
• Наивный подход из разряда «Попробуй Смержить»
• Начиная с C++11 легко заменяется на map<string, function>
5. class CClientPaymentApi
{
public:
// Запуск операций: возвращает обещание результата
future<bool> StartPayment(int itemId);
future<bool> CompletePayment(int itemId);
future<bool> CancelPayment(int itemId);
// Сигналы-слоты: соединение "один ко многим"
Connection DoOnConnectionFailed(const Slot<void()> &handler);
};
Доменная модель API в приложении
• С такой моделью мы предпочли бы работать вместо switch/case
6. Запрос операции похож на вызов функции
• Операции могут завершиться успешно, с ошибкой либо быть
отменены
• Операция может выполниться немедленно или отложенно
Прикладной UI
на HTML5/CSS3
+ Javascript
Прикладной
движок на C++
OpenDocument("cbook.doc")
returns true
Прикладной
движок на C++
Прикладной UI
на HTML5/CSS3
+ Javascript
OpenDocument(42)
throws TypeError
Прикладной
движок на C++
Прикладной UI
на HTML5/CSS3
+ Javascript
OpenDocument("1GB.doc")
cancel that
7. Сложности работы с потоками
• Блокировать UI-потоки нельзя – это заденет пользователя
• Первый UI поток – browser-процессе (с прикладным C++-кодом)
• Второй UI поток – в render-процессе (с прикладным Javascript-кодом)
UI-поток в browser процессе
execute
task
handle
event
handle
event
handle
event
post
task
UI-поток в render процессе
IPC IPC
8. Тонкости маршалинга вызовов
• Можно ли проверить типы аргументов лучше, чем через assert?
• Повторять проверки в прикладном коде нелепо
• Информация о типах уже есть в сигнатуре функции-колбека
• Как сериализовать исключение?
• Тип или код ошибки могут подсказать стратегию обработки исключения
9. Мы решили писать шаблоны и велосипеды
https://github.com/sergey-shambir/cpp-promise-demo/
10. Преимущества Promise в Javascript
• Есть проверенная в деле спецификация: promisesaplus.com
• “An open standard for sound, interoperable JavaScript promises—by
implementers, for implementers.”
• Есть then/catch, т.е. можно повесить callback или продолжение
• Callback вызывается с чистым стеком на определённом потоке
(т.е. как новый task)
Pending
Fulfilled
Rejected
Задача запущена Выполнено
11. Подход «конвейер подзадач» с Promise
function loadGameMap() {
let contentPromise = utils.loadUrlAsStringAsync("/res/level1.tmx");
let xmlPromise = contentPromise.then((content) => {
return utils.parseXmlString(content)
});
let mapPromise = xmlPromise.then((xmlDocument) => {
return utils.buildGameMap(xmlDocument)
});
return mapPromise;
};
Запуск
FulfilledRejected
Чтение файла Разбор XML
Построение
карты уровня
12. Подход «у меня есть план B» с Promise
function loadUserPhotos(userId) {
let netPromise = netClient.loadPhotoCollectionAsync(userId);
let photosPromise = netPromise.catch(() => {
return localClient.loadCachedPhotoCollection(userId);
});
return photosPromise;
}
Запуск Запрос к сети
Запрос к
оффлайн-кешу
Fulfilled Rejected
13. Подход «подождать любого» с Promise
function loadUserPhotos(userId) {
let netPromise = netClient.loadPhotoCollection(userId);
let localPromise = localClient.loadCachedPhotoCollection(userId);
return Promise.race([netPromise, localPromise]);
}
Запуск
Запрос к сети
Запрос к
оффлайн-кешу
Fulfilled Rejected
14. Подход «подождать всех» с Promise
function loadUserPhotos(userId) {
let netPromise = netClient.loadPhotoCollection(userId);
let localPromise = localClient.loadCachedPhotoCollection(userId);
return Promise.all([netPromise, localPromise]);
}
Запуск
Запрос к сети
Запрос к
оффлайн-кешу
Fulfilled RejectedЖдём 2-х
15. Недостатки Promise в Javascript
• Легко нарушить контракт «Promise в конце операции переходит в
состояние Fulfilled или Rejected»
• Достаточно потерять колбеки в конструкторе Promise
• Легко нарушить контракт «Promise при успешном завершении
возвращает значимый результат»
• Просто сделайте обработчик catch такой же, как в примерах:
https://goo.gl/dEvi8V
var p1 = new Promise(function (resolve, reject) {
// .. давайте потеряем resolve/reject
});
16. Основной цикл и пул потоков
• В STL до сих пор нет каркаса событийного цикла
• Предполагаю, что комитет не пришёл к универсальной реализации
• В Boost.Asio и в каждой ОС есть свой основной цикл
• В UI-библиотеках циклы свои и в них надо встраиваться
• Цикл из Boost.Asio годен для серверов, а не для UI
UI-поток
execute
task
handle
event
handle
event
handle
event
post
task
17. Пул потоков на Boost.Asio в 35 строк
AsioThreadPool: https://goo.gl/NiYTUY
boost::asio::io_service
boost::asio::io_service::work
std::thread { io.run(); }
std::thread { io.run(); }
std::thread { io.run(); }
std::thread { io.run(); }
• Конструктор вызывает на каждом потоке io.run
• Деструктор вызывает io.stop() и затем join потоков
• Для добавления задачи вызываем io.post
18. future в C++ и Promise в Javascript
• В C++14 и C++17 future не расчитан на модель «исполнители и
задачи»
• В std::future нет then
• Если future получен от async, в деструкторе будет ожидание завершения
задачи
• В Concurrency TS future всё так же не расчитан на модель
«исполнители и задачи»
• К std::future добавляется then(callback), но нет стратегии вызова callback
• Нельзя выполнить callback в предсказуемом потоке и окружении
“Why is there no std::future::then in C++17?” stackoverflow.com/questions/41310197
19. Ответ на «Use the Boost, Luke!»
• Boost предоставляет then, он он имеет подводные камни
• Добиться работы «как в Javascript» можно, но сложно
• Даже над Boost лучше написать упрощённую и ограниченную
обёртку-велосипед
• И не забудьте взять с собой макросы:
#define BOOST_THREAD_PROVIDES_EXECUTORS
#define BOOST_THREAD_VERSION 4
#include <boost/thread.hpp>
20. Чемпионат по отстрелу ног с Boost, раунд 1
• На каком потоке по умолчанию будет вызван callback?
• Ответ: на новом потоке, т.к. Launch Policy – launch::none
// .. создаём boost::promise и получаем от него future
cerr << "called then on " << this_thread::get_id() << endl;
future.then([&](future<string> oldFuture) {
cerr << "then callback on " << this_thread::get_id() << endl;
dispatch.QuitMainLoop();
});
21. Чемпионат по отстрелу ног с Boost, раунд 2
• Будет ли вызван callback?
• Ответ: если задача ещё не завершилась, то не будет, т.к.
возвращённый от then объект future разрушается сразу после
выполнения инструкции
• Уточнение: если future получен от async, всё сложно.
// .. создаём boost::promise и получаем от него future
cerr << "called then on " << this_thread::get_id() << endl;
future.then(launch::deferred, [&](future<string> oldFuture) {
cerr << "then callback on " << this_thread::get_id() << endl;
dispatch.QuitMainLoop();
});
22. Чемпионат по отстрелу ног с Boost, раунд 3
• Будет ли вызван callback, если просто заменить Launch Policy?
• Ответ: если у future не указан executor, будет assert
• Assertion failed: this->future_->get_executor(), file
c:...boostthreadfuture.hpp, line 4761
// .. создаём boost::promise и получаем от него future
cerr << "called then on " << this_thread::get_id() << endl;
future.then(launch::executor, [&](future<string> oldFuture) {
cerr << "then callback on " << this_thread::get_id() << endl;
dispatch.QuitMainLoop();
});
23. Чемпионат по отстрелу ног с Boost, раунд 4
• Будет ли вызван callback, если установить executor, который
постит задачу в UI thread, и then вызывается из UI thread?
• Ответ: нет, wait() заблокирует обработку событий в UI thread
cerr << "called then on " << this_thread::get_id() << endl;
auto f2 = future.then(launch::executor, [&](future<string> oldFuture)
{
cerr << "then callback on " << this_thread::get_id() << endl;
dispatch.QuitMainLoop();
});
f2.wait();
24. Безопасный callback, связанный с объектом
void WelcomeController::OnLogin()
{
auto callback = std::bind(&WelcomeController::SaveLoginData, this, _1);
m_api.Login(m_view.GetEmail(), m_view.GetPassword(), callback);
}
• В момент вызова callback объект уже может быть уничтожен
• Из документации Boost.Signals: вызов слота может происходить после
disconnect, если disconnect был сделан в другом потоке
• Решения есть
• Weak this (аналог weak self в Objective-C)
• Monitor (альтернатива weak this)
25. Идиома “weak this”
BindWeakPtr: goo.gl/xlRM3E
• Нужно наследовать класс от enable_shared_from_this
• Нельзя вызывать shared_from_this в конструкторе и деструкторе
• Не работает с std::bind
std::weak_ptr<WelcomeController> weakThis = shared_from_this();
m_api.Login(m_view.GetEmail(), m_view.GetPassword(), [weakThis](const auto &data) {
if (auto strongThis = weakThis.lock())
{
strongThis->SaveLoginData(data);
}
});
26. BindWeakPtr – адаптер std::bind
BindWeakPtr: goo.gl/xlRM3E
• Функция BindWeakPtr перегружена для const и не-const методов
• Внутри создаёт WeakInvoker и вызывает bind с его копией
• Объект WeakInvoker хранит weak_ptr и реализует operator()
void WelcomeController::OnLogin()
{
auto callback = BindWeakPtr(
&WelcomeController::SaveLoginData, shared_from_this(), _1);
m_restClient->Login(m_view->GetEmail(), m_view->GetPassword(), callback);
}
27. Портируем JS Promise в C++
• Добавили метод Cancel и состояние Cancelled
• Для синхронизации использовали mutex
• Возможно, есть способ сделать lock-free, но в наших условиях нет
ежесекундного создания тысяч объектов Promise
Pending
Fulfilled
Rejected
Задача запущена Выполнено
Cancelled
Отменено
28. Портируем JS Promise в C++
template <class ValueType>
class IPromise
{
public:
using ThenFunction = function<void(ValueType)>;
using CatchFunction = function<void(exception_ptr const&)>;
virtual ~IPromise() = default;
virtual void Then(const ThenFunction &onFulfilled) = 0;
virtual void Catch(const CatchFunction &onRejected) = 0;
virtual void Cancel() = 0;
};
29. let promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(42);
});
});
promise.then((value) => alert("Succeed 1st: " + value));
promise.then((value) => alert("Succeed 2nd: " + value));
promise.then((value) => alert("Succeed 3rd: " + value));
• В Javascript один объект Promise позволяет вызвать then несколько раз
• В C++ это невозможно для Movable-only значений
• Мы решили поддерживать Movable-only, нарушив стандарт Promise/A+
Выбор: совместимость или movable-значения
30. Состояние храним в variant
• Promise содержит либо ошибку, либо исключение, либо ничего
• Можно использовать variant для экономии памяти на хранение
• Чтобы хранить состояние целиком, добавим два теговых типа CancelState
и PendingState
struct CanceledTag {};
struct PendingState {};
using StorageType = boost::variant<
PendingState,
CanceledTag,
ValueType,
std::exception_ptr
>;
31. Switch по типам для variant
void Then(const ThenFunction &onFulfilled) override
{
lock_guard lock(m_mutex);
if (m_then)
throw std::logic_error("Cannot call Then twice");
switch (m_storage.which()) {
case detail::VariantIndex<StorageType, PendingState>:
m_then = onFulfilled;
break;
case detail::VariantIndex<StorageType, ValueType>:
m_then = onFulfilled;
InvokeThen();
break;
}
}
32. Получение which index для типа в variant
namespace detail
{
template <class VariantType, class VariantCase>
using WhichIndex = typename boost::mpl::find<
typename boost::mpl::copy<
typename VariantType::types,
boost::mpl::back_inserter<boost::mpl::vector<>>
>::type,
VariantCase
>::type::pos;
template <class VariantType, class VariantCase>
constexpr int VariantIndex = WhichIndex<VariantType, VariantCase>::value;
}
33. Постановка задачи
// args пришёл из Javascript и выглядит так:
auto args = { Value(42.2), Value("add") };
ApplyVariantArguments([](const double &value, const string &operation) {
// выполняем действие над аргументами
}, args);
•Есть рекурсивный вариантный тип, который по набору типов
похож на JSON
•Есть callable, имеющий точно указанную сигнатуру
•Нужно применить аргументы к функции
34. // Для функторов, имеющих operator()
template <typename T>
struct function_traits : public function_traits<decltype(&T::operator())> {
};
// Для указателей на функции
template <typename ReturnType, typename... Args>
struct function_traits<ReturnType(*)(Args...)> {
typedef std::function<ReturnType(Args...)> f_type;
};
// ... для методов (константных и неконстантных) ...
// функция для вывода типа из параметра
template <typename Callable>
typename function_traits<Callable>::f_type make_function(Callable callable) {
return (typename function_traits<Callable>::f_type)(callable);
}
Шаг 1: function_traits
•Задаёт синонимы типов параметров и результата
•Принимает лямбды, указатели на свободные функции и методы
•Не принимает ни std::bind, ни generic lambda
•Могут быть ошибки компиляции с перегруженными функциями
35. Шаг 2: формируем tuple и вызываем apply
// Remove `const&` and other dangerous qualifiers.
template <typename ...Args>
using arguments_tuple = std::tuple<typename std::decay_t<Args>...>;
template <typename R, typename ...Args>
R ApplyCefArgumentsImpl(const std::function<R(Args...)> &function,
const CefRefPtr<CefListValue> & args)
{
detail::CJavascriptArgumentsAdapter adapter(args);
detail::arguments_tuple<Args...> typedArgs;
adapter.CheckArgumentsCount(std::tuple_size<decltype(typedArgs)>::value);
detail::for_each_in_tuple(typedArgs, adapter);
return detail::apply_tuple<R>(typedArgs, function);
}
41. Тестирование с Boost.Test
•Вдохновлялись Javascript-библиотекой sinon.js
• Сделали proxy-объекты
•Тесты в отдельном потоке, чтобы не блокировать Event Loop
• Поток тестов ждал значение через std::future
•Проверили передачу всех типов данных и исключений
• Были проблемы с передачей Object и временем жизни
• Нельзя передавать тип Function
• Нельзя передать три значения типа double: NaN, +INF и -INF
42. Тестирование с Boost.Test
Ожидание std::future
Поток, запустивший unit_test_main
execute
task
handle
event
handle
event
handle
event
UI-поток в browser process
Вызов Javascript через Proxy
execute
task
Proxy получил значение
43. Идиома “monitor”
// Нюанс: не соблюдается rule of five,
// что влечёт неверное копирование monitor
struct Student {
std::shared_ptr<void> monitor;
std::string name;
Student() : monitor(this, ignore) {}
decltype(auto) GetNamePrinter() {
std::weak_ptr<void> monitor = this->monitor;
return [=]() {
if (!monitor.expired()) {
// working with this
}
};
}
};
44. Сторонние библиотеки для Promise/A+
• tored/qml-promise – однопоточные Promise для C++/QML
• rhashimoto/poolqueue – запускает Promise поверх пула потоков
или на базе таймера
• grantila/q – крупная библиотека со своими 🚲 Promise, thread pool,
timers и т.п.
• 0of/Promise2 – содержит заготовку Promise, интегрировать запуск
задач Promise в свой EventLoop/ThreadPool придётся
самостоятельно
45. “libdispatch” от Apple
Библиотека содержит примитивы для событийной
многозадачности: очереди задач, исполнители, пул потоков и
основной поток
• Версия libdispatch от Apple: https://github.com/apple/swift-corelibs-
libdispatch
• Версия с улучшением поддержки Linux (встраивание в event loop):
https://github.com/nickhutchinson/libdispatch
• Версия с поддержкой Win32:
https://github.com/DrPizza/libdispatch
46. Вредные советы документации
Иногда документация содержит вредные советы.
• Примеры для JS Promise в сети содержат неправильную
обработку исключений (нет перевыброса): https://goo.gl/dEvi8V
Иногда документация неоднозначна (пример из STL от Microsoft):
void pop()
{
// erase element at end
c.pop_front();
}
Editor's Notes
О себе- я в iSpring в команде Desktop приложений для тренеров персонала в больших компаниях (ПО для быстрой разработки курсов)- так получилось, что попутно стал наставником для новичков и помогаю преподавать в ВУЗе- недавно команда стала использовать CEF3 для парочки проектов
Началась разработка серии гибридных приложений на CEF3
UI на JavaScript+HTML5
Вычислительное ядро на C++
Они находятся в разных процессах
Требуется интенсивное взаимодействие между С++ и JS:
Реакция на события
Запуск фоновых задач
Управление состоянием UI
CEF3 предполагает лишь асинхронную модель взаимодействия
Требуется маршалинг аргументов и результата вызова
В С++ типы и количество аргументов надо строго проверять
Также надо передавать исключения
Исключения могут нести код или тип ошибки для выбора стратегии обработки
CEF3 позволяет отправить сообщение в любую сторону, содержащее JSON-подобные данные
Если нужно извлекать аргументы вызова, код становится ещё запутаннее
Операции могут завершиться успешно, с ошибкой либо быть отменены
Операция может выполниться немедленно или отложенно
В С++ принято распределять задачи на фоновые потоки и на основной поток
В Javascript принято использовать один поток
Есть Web Workers, но в приложении из заменяет наш C++ бекенд
Нужна простая, понятная модель с приемлемым порогом вхождения
При обычном вызове действует контракт:
обычная функция может завершиться двумя путями: return и throw
можно его нарушить:
бесконечный цикл
longjmp или иное переключение контекста без возврата
останов процесса/потока
все способы нарушения контракта ненормальные
В render-процессе браузера есть поток, в котором исполняется Javascript код и происходит обработка DOM
Ниже показано, почему наши проблемы не решаются стандартными средствами
Либо решаются, но так, что решение позволит легко «отстрелить себе ногу»
Наиболее важное отличие Promise в Javascript от C++: вызов callback происходит как таск в предсказуемом и безопасном для исключений окружении
Приятная особенность: методы parseXmlString и loadTiledMap могут вернуть и Promise, и значение, и в любом случае произойдёт корректный переход в Fulfilled.
Если возвращать Promise, конвейер будет асинхронным, нагрузка может обрабатываться во вторичном потоке.
Приятная особенность: методы parseXmlString и loadTiledMap могут вернуть и Promise, и значение, и в любом случае произойдёт корректный переход в Fulfilled.
Если возвращать Promise, конвейер будет асинхронным, нагрузка может обрабатываться во вторичном потоке.
Одна из наибольших проблем для программистов – неправильное понимание работы языка. Полное незнание причиняет меньше проблем.
В основном Javascript-разработчики читают примеры, а не спецификацию, и совершают ошибки в обработке ошибок.
Такие ошибки остаются незаметными, т.к. сами по себе исключения редко возникают
В примере: «давайте потеряем resolve/reject» – это предложение навечно оставить Promise в состоянии Pending.
По ссылке https://goo.gl/dEvi8V показано, как легко забыть перебросить исключение в новый Promise
в Gamedev и в серверной разработке event loop всегда Data-Oriented
раздельные шаги (event process, update, render и т.п.)
много похожих данных на одном шаге
в Desktop и Mobile приложениях event loop всегда Object-Oriented
много разных событий, разных реакций, разных объектов
относительно мало массивов данных Вывод: в Desktop и Mobile простота event loop важнее низкого overhead на запуск одной задачи
Вывод:
в Desktop и Mobile хватает простого, но удобного объектно-ориентированного event loop, абстракции не страшны
на серверах и в играх нужен быстрый event loop, с поддержкой сотен тысяч задач в секунду
Мы сделал цикл на основе Win32 API
Мы также использовали Message Only Window для встраивания в существующий цикл Win32-событий, запущенный кем угодно (даже если наш код выполняется из DLL как плагин)
Не стоит использовать future, полученный от std::async: его деструктор будет блокировать поток до получения результат
В Visual Studio 2010, 2012, 2013 деструктор не блокирует поток, и это баг, который исправлен в VS2015: https://connect.microsoft.com/VisualStudio/feedback/details/810623
На момент, когда мы начинали работу, не было полного представления, как это должно выглядеть и способен ли Boost на такое
Позже оказалось, что самые свежие версии Boost способны
Boost Executors были реализованы в рамках Google Summer of Code 2014
В стандарт они войдут очень, очень нескоро
Объект WeakInvoker хранит weak_ptr и реализует operator()
Надо сделать две перегрузки BindWeakPtr: для const и не-const
Наиболее важное отличие Promise в Javascript от C++: вызов callback происходит как таск в предсказуемом и безопасном для исключений окружении
Наиболее важное отличие Promise в Javascript от C++: вызов callback происходит как таск в предсказуемом и безопасном для исключений окружении
Использовали template variables и boost::mpl для определения индекса в диапазоне типов во время компиляции
Есть рекурсивный вариантный тип, который по набору типов похож на JSON
Есть callable, имеющий точно указанную сигнатуру
Нужно без дополнительного указания типов применить аргументы к функции
decay_t очень полезен, если надо сформировать tuple со значениями
Перегружать функции для разных типов опасно тем, что появляются неоднозначные приведения типов
Можно добавить строгости и требовать от программиста использовать float вместо double, int вместо unsigned/short/long
Заворачивание в std::function позволяет вызвать callback отложенно, и даже добавить его в словарь, отображающий строковое имя сообщения на обработчик
Позволяет привязать обработчик к имени метода, экспортируемого в Javascript
Позволяет привязать обработчик к имени метода, экспортируемого в Javascript
Позволяет привязать обработчик к имени метода, экспортируемого в Javascript
Был создан отдельный поток для запуска Boost.Test
Был создан Proxy Binder, который отслеживал аргументы и факт вызова (на манер sinon.js)
Не требует enable_shared_from_this
Работает в конструкторе/деструкторе, но недоступен извне
Нельзя передавать monitor наружу
Проблемы примера:
Не соблюдает правило пяти, в итоге неправильно копируется/перемещается