Доклад посвящён вопросам реализации пропозала Герба Саттера PR0707 (метаклассы в С++) за пределами компилятор - в виде отдельной утилиты. Будет продемонстрированы варианты использования метаклассов в реальной жизни, затронуты вопросы их реализации на базе Clang Frontend, а также возможные перспективы развития технологии и методики.
Андрей Карпов, Приватные байки от разработчиков анализатора кодаSergey Platonov
Доклад о редких нестандартных расширениях языка С++, про которые никто не знает, но которые надо поддерживать в анализаторе кода.
О магии Visual C++ с файлом stdafx.h, когда проект компилируется, хотя не должен. О том как зародился viva64 (предшественник PVS-Studio) для поиска 64-битных проблем. Как и почему исчез анализ кода, который одно время существовал в компиляторе Intel C++.
Статический анализ кода: Что? Как? Зачем?Andrey Karpov
Методология статического анализа год за годом зарекомендовывает себя в поисках дефектов в исходном коде программ.
Максим расскажет про:
- методологию статического анализа и какие плюсы и минусы у нее есть;
- технологии этой методологии, которые позволяют выявлять разнообразнейшие дефекты в коде;
- интересные примеры ошибок в реальных проектах, которые были найдены при помощи статического анализа;
- интеграцию инструментов статического анализа в проекты любой сложности, и почему так важно регулярное использование подобных инструментов.
Что могут статические анализаторы, чего не могут программисты и тестировщикиAndrey Karpov
Одной из технологий выявления ошибок на ранних этапах является статический анализ кода. К сожалению, ряд инструментов реализуют анализ весьма поверхностно, что снижает доверие к методологии статического анализа в целом. Некоторые программисты начинают думать, что анализ кода — это нечто, базирующееся на регулярных выражениях и они сами легко найдут такие ошибки. На самом деле всё гораздо сложнее и интересней. Более того, многие ошибки невероятно сложно найти, если не использовать инструменты статического анализа кода. И в этом докладе будет продемонстрировано множество таких случаев. Послушав доклад, вы взглянете на статический анализ совсем по-новому. Дополнительно будет рассказано с чего начать, если вы захотите внедрить инструмент статического анализа в уже существующий процесс разработки.
Многие разработчики не представляют, как дорого обходятся ошибки в программах. Причем я имею в виду не падения ракет и прочие катастрофы, а обыкновенное прикладное программное обеспечение. Хочется показать всю важность нахождения ошибок на самых ранних этапах. Одним из способов выявить ошибку как можно раньше является статический анализ кода. Поговорим мы не только об этом, но и о различных приемах при написании кода, которые позволят избежать множество типовых ошибок.
Андрей Карпов, Приватные байки от разработчиков анализатора кодаSergey Platonov
Доклад о редких нестандартных расширениях языка С++, про которые никто не знает, но которые надо поддерживать в анализаторе кода.
О магии Visual C++ с файлом stdafx.h, когда проект компилируется, хотя не должен. О том как зародился viva64 (предшественник PVS-Studio) для поиска 64-битных проблем. Как и почему исчез анализ кода, который одно время существовал в компиляторе Intel C++.
Статический анализ кода: Что? Как? Зачем?Andrey Karpov
Методология статического анализа год за годом зарекомендовывает себя в поисках дефектов в исходном коде программ.
Максим расскажет про:
- методологию статического анализа и какие плюсы и минусы у нее есть;
- технологии этой методологии, которые позволяют выявлять разнообразнейшие дефекты в коде;
- интересные примеры ошибок в реальных проектах, которые были найдены при помощи статического анализа;
- интеграцию инструментов статического анализа в проекты любой сложности, и почему так важно регулярное использование подобных инструментов.
Что могут статические анализаторы, чего не могут программисты и тестировщикиAndrey Karpov
Одной из технологий выявления ошибок на ранних этапах является статический анализ кода. К сожалению, ряд инструментов реализуют анализ весьма поверхностно, что снижает доверие к методологии статического анализа в целом. Некоторые программисты начинают думать, что анализ кода — это нечто, базирующееся на регулярных выражениях и они сами легко найдут такие ошибки. На самом деле всё гораздо сложнее и интересней. Более того, многие ошибки невероятно сложно найти, если не использовать инструменты статического анализа кода. И в этом докладе будет продемонстрировано множество таких случаев. Послушав доклад, вы взглянете на статический анализ совсем по-новому. Дополнительно будет рассказано с чего начать, если вы захотите внедрить инструмент статического анализа в уже существующий процесс разработки.
Многие разработчики не представляют, как дорого обходятся ошибки в программах. Причем я имею в виду не падения ракет и прочие катастрофы, а обыкновенное прикладное программное обеспечение. Хочется показать всю важность нахождения ошибок на самых ранних этапах. Одним из способов выявить ошибку как можно раньше является статический анализ кода. Поговорим мы не только об этом, но и о различных приемах при написании кода, которые позволят избежать множество типовых ошибок.
Краткое введение в Scala для разработчиков на других языках. Рассмотрены несколько простых программ, написанных с использованием красивых возможностей Scala.
Занимаясь разработкой интерфейсов, мы постоянно разбираемся как и что устроено. Вы задумывались, сколько времени у вас уходит на то, чтобы найти нужный фрагмент кода, который отвечает за компонент на странице? В своем докладе я покажу как это можно сделать за один клик, а так же раскрою технические детали.
Есть такая штука как инструментирование кода. Мало кто знает о ней, даже пользуясь результатами ее применения. Между тем, с инструментированием можно делать много всего интересного и, главное, полезного. Например, это может вам помочь лучше понять код или сделать процесс разработки более эффективным. Примеры инструментирования кода и принципы его работы.
"Инструментарий разработчика iOS: Xcode, AppCode и сторонние инструменты". Ма...Yandex
Выбор языка для разработки под iOS не ограничен Objective-C — всё зависит от конкретных задач. Но даже если код пишется на Objective-C, у разработчика есть и другие инструменты, кроме Xcode, способные облегчить жизнь. Есть сторонние тестовые фреймворки, менеджеры зависимостей, браузеры документации и, конечно, альтернативные IDE — например, AppCode.
В докладе я расскажу, почему в JetBrains создали собственную IDE для Objective-C, а не просто плагин к Xcode. Обсудим, чем AppCode отличается от Xcode, и как мы реализовали интеграцию с этой средой. А также поговорим о возникавших сложностях и планах по развитию интеграции и всего продукта.
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4 Dima Dzuba
Описываются возможности C++ по работе с наследованием (virtual, override, final). Описываются механизмы работы с константными переменными и методами (const, mutable, constexpr). Описываются возможности по перегрузке операторов (operator).
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)Ontico
TypeScript – светлое будущее ES6 уже вчера.
Почему не "Кофе"? Чай полезней.
Что не так с Flow от Facebook?
Реальная практика использования: плюсы и минусы.
Не VisualStudio единым. Особенности работы в других IDE.
Интеграция с уже существующим JS кодом.
Использование совместно с RequireJS. Подводные камни.
Использование TypeScript совместно с React.
TypeScript и Angular.
Плюшки, которых нет в ES6/7 (пока нет): [static] enum, интерфейсы, private, protected, декораторы... Что дают и зачем?
Доклад на конференциях JPoint 2016, JBreak 2016
Abstract: В Java SE 8 были добавлены лямбда-выражения, дефолтные методы, типовые аннотации, компактные профили и т.п., что привело к изменениям в спецификации Java SE платформы.
В этом докладе мы рассмотрим, как новые возможности, добавленные в Java 8, были реализованы в Excelsior JET JVM, полностью написанной с нуля, совершенно непохожей на Oracle HotSpot, но при этом совместимой со спецификацией Java SE.
В итоге, слушатель освежит в памяти, что появилось в Java 8, как это повлияло на спецификацию JVM, во что превращаются лямбда-выражения в Java байт-коде, как их можно статически оптимизировать, а также получит некоторое представление о внутреннем устройстве еще одной JVM.
Краткое введение в Scala для разработчиков на других языках. Рассмотрены несколько простых программ, написанных с использованием красивых возможностей Scala.
Занимаясь разработкой интерфейсов, мы постоянно разбираемся как и что устроено. Вы задумывались, сколько времени у вас уходит на то, чтобы найти нужный фрагмент кода, который отвечает за компонент на странице? В своем докладе я покажу как это можно сделать за один клик, а так же раскрою технические детали.
Есть такая штука как инструментирование кода. Мало кто знает о ней, даже пользуясь результатами ее применения. Между тем, с инструментированием можно делать много всего интересного и, главное, полезного. Например, это может вам помочь лучше понять код или сделать процесс разработки более эффективным. Примеры инструментирования кода и принципы его работы.
"Инструментарий разработчика iOS: Xcode, AppCode и сторонние инструменты". Ма...Yandex
Выбор языка для разработки под iOS не ограничен Objective-C — всё зависит от конкретных задач. Но даже если код пишется на Objective-C, у разработчика есть и другие инструменты, кроме Xcode, способные облегчить жизнь. Есть сторонние тестовые фреймворки, менеджеры зависимостей, браузеры документации и, конечно, альтернативные IDE — например, AppCode.
В докладе я расскажу, почему в JetBrains создали собственную IDE для Objective-C, а не просто плагин к Xcode. Обсудим, чем AppCode отличается от Xcode, и как мы реализовали интеграцию с этой средой. А также поговорим о возникавших сложностях и планах по развитию интеграции и всего продукта.
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4 Dima Dzuba
Описываются возможности C++ по работе с наследованием (virtual, override, final). Описываются механизмы работы с константными переменными и методами (const, mutable, constexpr). Описываются возможности по перегрузке операторов (operator).
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)Ontico
TypeScript – светлое будущее ES6 уже вчера.
Почему не "Кофе"? Чай полезней.
Что не так с Flow от Facebook?
Реальная практика использования: плюсы и минусы.
Не VisualStudio единым. Особенности работы в других IDE.
Интеграция с уже существующим JS кодом.
Использование совместно с RequireJS. Подводные камни.
Использование TypeScript совместно с React.
TypeScript и Angular.
Плюшки, которых нет в ES6/7 (пока нет): [static] enum, интерфейсы, private, protected, декораторы... Что дают и зачем?
Доклад на конференциях JPoint 2016, JBreak 2016
Abstract: В Java SE 8 были добавлены лямбда-выражения, дефолтные методы, типовые аннотации, компактные профили и т.п., что привело к изменениям в спецификации Java SE платформы.
В этом докладе мы рассмотрим, как новые возможности, добавленные в Java 8, были реализованы в Excelsior JET JVM, полностью написанной с нуля, совершенно непохожей на Oracle HotSpot, но при этом совместимой со спецификацией Java SE.
В итоге, слушатель освежит в памяти, что появилось в Java 8, как это повлияло на спецификацию JVM, во что превращаются лямбда-выражения в Java байт-коде, как их можно статически оптимизировать, а также получит некоторое представление о внутреннем устройстве еще одной JVM.
Solit 2014, EcmaScript 6 in Action, Трухин Юрий solit
Юрий Трухин, Россия. Эксперт по облачным технологиям хостинговой компании InfoboxCloud. В прошлом – обладатель статуса Microsoft Most Valuable Professional. Гик, стратег, разработчик. Подробнее на trukhin.com
«Обзор InfoboxCloud для разработчиков». Development секция. Высокий уровень подготовки. Для разработчиков.
В этом докладе будет рассказано об устройстве InfoboxCloud из первых рук, о деталях внутренней реализации, о том, какую пользу несет облако для разработчиков и о будущем InfoboxCloud. Будут рассмотрены 2 кита облачных технологий: IaaS и PaaS без vendor-lock. Отличная возможность спросить обо всём, что касается PaaS/IaaS непосредственно архитектора и разработчика этих систем.
«EcmaScript 6 in Action». Development секция. Для разработчиков.
Поговорим о том, как жизнь разработчиков изменится с приходом нового стандарта.
Java SE 8 has brought lambdas, default methods, type annotations, compact profiles, etc. As a result, the Java SE platform specification was changed to reflect new features.
The session shows how the new Java 8 features have been implemented in Excelsior JET JVM, written from scratch, very different from the Oracle HotSpot JVM, but compatible with the Java SE specification.
As a result, an attendee will refresh his/her memory regarding new Java 8 features, will learn how they affected the JVM specification, how the lambda expressions are translated into Java bytecode and how they can be optimized at the JVM level.
Теория языков программирования некоторые слайды к лекциямSergey Staroletov
Теория языков программирования (немного об интерпретаторах, триадах, оптимизации, парсерах и прочее)
Compilers construction some lectures of whole course, it covers some methods on interpreters, optimisations, antlr, dsl (introduction)
JavaScript-модули "из прошлого в будущее"oelifantiev
Доклад на первом Ярославском форнтэнд-митапе.
Рассказ об имеющихся методиках описания модулей в JavaScript а также о грядущем стандарте ES6 и, наконец-то, нативной поддержке модулей языком.
Документация на тему архитектуры языка PHP скудна и разрозненна, несмотря на то что тема интересна многим. В моем докладе я постараюсь заполнить этот пробел и рассказать о модулях PHP: как они работают, зачем и как их пишут. В процессе мы рассмотрим опыт Badoo в этой сфере на примерах двух модулей. И еще напишем очень небольшой собственный модуль.
— Что такое модули PHP, как они работают
— Как начать писать свой модуль PHP
— Скелет модуля — Функции, классы, методы
— Разбор параметров функции
— Сборка модуля
— Подгрузка модуля
— Простой пример модуля из Badoo
— Сложный пример модуля из Badoo
Roslyn API: SyntaxTree vs CodeDom, SemanticModel vs ReflectionDenis Tsvettsih
Презентация к докладу «Roslyn API: SyntaxTree vs CodeDom, SemanticModel vs Reflection» с конференции .NEXT SPb 2015 (Санкт-Петербург, 5 июня 2015)
http://spb2015.dotnext.ru/#cvetkih_talk
Similar to C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей Садовников (20)
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...corehard_by
Использование сторонних библиотек в языке C++ никогда не было простым - необходимо было правильно собрать их, имея дело с различными системами сборки, но с появлением пакетного менеджера conan.io процесс стал намного проще, так что теперь осталось только сделать пакеты для нужным библиотек, и в этом поможет команда bincrafter-ов.
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотниковcorehard_by
На предыдущих конференциях C++ CoreHard автор доклада рассказывал про Модель Акторов и опыт ее использования в C++. Но Модель Акторов -- это далеко не единственный способ борьбы со сложностью при работе с многопоточностью. Давайте попробуем поговорить о том, что еще можно применить и как это может выглядеть в C++.
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титовcorehard_by
Если вам важна скорость работы ваших программ, то вы обязаны понимать, как работает ваше "железо". Современный процессор -- это сложное устройство, многие механизмы которого могут неочевидным образом влиять на скорость исполнения вашего кода. В докладе дается обзорное представление основных структур современного процессора и подробно рассматривается работа иерархии памяти. Будут освещены следующие темы: организация кэш-памяти, принцип локальности, предподкачка данных, нежелательное общее владение данными, а также программные техники для эффективной работы с памятью.
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...corehard_by
Информационная безопасность все больше из отдельной сферы плавно перетекает в разработку ПО. А значит «обычным» программистам приходится понимать те требования и терминологию, которые специалисты по безопасности уже давно знают и используют. CWE, CERT, MISRA, SAST– для «обычных» программистов это непонятные аббревиатуры. Поэтому в обзорном докладе мы попробуем рассказать простым языком об этих понятиях так, чтобы все разработчики начали уверенно ориентироваться в этой теме.
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишковcorehard_by
Вот уже более двух лет мы создаём онлайн-специализацию по С++ на платформе Coursera. Её цель — обучить языку C++ с нуля до уровня, достаточного для решения практических задач, с которыми приходилось сталкиваться авторам в своей практике. В своём докладе я расскажу, как мы создаём наши онлайн-курсы, и уделю особое внимание техническим проблемам, которые нам пришлось решить в процессе создания автоматической системы проверки программ студентов.
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...corehard_by
В докладе обсуждаются способы улучшения времени сборки C++ проектов, опыт полученный в ходе ускорения сборки клиента и тулов World Of Tanks. Также описывается эффект, который они оказывают на организацию кодобазы (как позитивный, так и негативный) и затраты, которые необходимы для поддержки этих решений, т.к. не все они бесплатны. Методики, описываемые в докладе: ускорение линковки (Incremental Linking, Fastlink), ускорение компиляции(Include what you use, использование precompiled headers).
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...corehard_by
Все мы знаем, что компиляторы в настоящее время достаточно умные. И нам как программистам зачастую не нужно думать о каких-то незначительных оптимизациях - мы полагаемся на оптимизации компилятора. Что ж, настало время выяснить, действительно ли настолько компиляторы умны и узнать, в каких местах программист всё же (может быть) умнее.
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...corehard_by
В докладе будет рассмотрена генерация кода при компиляции различных языковых конструкций, как простых, так и сложных, на различных платформах, как общераспространённых x86/x64, так и тех, которым уделяется меньше внимания: ARM, AVR. Также будут встречаться примеры для совсем экзотических процессоров вроде PowerPC и даже MicroBlaze. Основной упор будет делаться не на обработку данных, а именно на сопоставление различных конструкций кода с инструкциями целевых платформ.
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...corehard_by
What do threads, atomic variables, mutexes, and conditional variables have in common? They are the basic building blocks of any concurrent application in C++, which are even for the experienced C++ programmers a big challenge. This massively changed with C++17 and change even more with C++20/23. What did we get with C++17, what can we hope for with C++20/23? With C++17, most of the standard template library algorithms are available in sequential, parallel, and vectorised variants. With the upcoming standards, we can look forward to executors, transactional memory, significantly improved futures and coroutines. To make it short. These are just the highlights from the concurrent and parallel perspective. Thus there is the hope that in the future C++ abstractions such as executors, transactional memory, futures and coroutines are used and that threads, atomic variables, mutexes and condition variables are just implementation details.
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...corehard_by
Язык C++, претерпев долгую эволюцию, обрёл ряд черт, характерных для функциональной парадигмы: функции стали полноправными объектами, над которыми могут выполняться операции, а аппарат шаблонов позволяет проводить вычисления на типах на этапе компиляции. Математический фундамент этих двух главных аспектов составляют, соответственно, ламбда-исчисление и теория категорий. Расширение языка этими средствами способствовало реализации на языке C++ ряда инструментов, известных из функционального программирования. Некоторые из этих реализаций вошли в стандартную библиотеку (std::function, std::bind), другие - в сторонние библиотеки, в том числе в коллекцию библиотек Boost (functional, hana). Важную роль в арсенале функционального программирования играют операции свёртки и развёртки, которые очевиднее всего определяются для списков, но также естественным образом обобщаются на другие индуктивные и коиндуктивные структуры данных. Например, суммирование списка чисел можно представить себе как свёртку списка по операции сложения, а построение списка простых множителей заданного целого числа - как развёртку. Обобщения свёртки и развёртки известны как анаморфизмы и катаморфизмы. Также в функциональном программировании находит применение понятие гиломорфизма - композиция развёртки некоторого объекта в коллекцию с последующей свёрткой её в новый объект. В докладе продемонстрировано, что свёртки, развёртки и их композиции допускают довольно простую реализацию на языке C++.
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филоновcorehard_by
Доклад посвящен часто используемому шаблону в моих проектах по анализу данных, когда обучение и настройка моделей происходят с использованием python, а вот их запуск в промышленное использование на языке C++. Предлагается рассмотреть несколько учебных примеров реализации такого подхода, от простой линейной регрессии до обработки изображений с помощью нейронных сетей.
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukićcorehard_by
This talk will be about the design and implementation of a reactive programming model inspired by ranges that allows easy implementation of asynchronous and distributed software systems by writing code that looks like a sequence of ordinary range transformations like filter, transform, etc. This programming model will be demonstrated along with the implementation of a simple asynchronous web service where the whole system logic is defined as a chain of range transformations.
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakovacorehard_by
Macros, templates, compile-time evaluation and code generation, reflection and metaclasses – C++ tends to hide the final code passed to the compiler under the tons of various names and aliases. Add here the preprocessor that shadows the actual running curve of your program with dozens of alternatives mixed in a non-trivial way. While this allows to avoid boilerplate code and reduce copy-paste and other errors, such an approach demands better tooling support to make the debugging process easier. To find an error in such a code, one has to continuously read-fix-run it and compare the results with some etalon, or to debug in order to find actual substitutions. But should you really wait until your code is run or even compiled to debug it? Or how to deal with the situations when the code can’t be run on the local machine? A text editor with code completion won’t help, while a smart IDE that “gets” your code can do a better job. In this talk we’ll see interesting approaches to solving cases like macro and typedef ‘debug’, understanding types when auto/decltype hide them, dealing with different code branches depending on the preprocessor’s pass-through, and other ideas. Some suggestions are already implemented as ready-to-use features in CLion and ReSharper C++, tools for C++ from JetBrains (that means I can show it in action), others are planned for the future. The aim of this talk is to share the workflows supported by the tools that can help C++ developers create better modern C++ code.
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухинcorehard_by
В C++11 добавили новое ключевое слово - constexpr. Выглядит оно весьма невзрачно, да и на первый взгляд кажется, что смысла в нём маловато... Для чего же оно нужно, какие у него есть тайные супер способности и какую роль оно сыграет в дальнейшем развитии языка C++ - обо всём об этом мы и поговорим.
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...corehard_by
Text formatting has been a favorite problem of C++ library authors for a long time. The standard C++ iostreams have been criticized for being difficult to use due to their statefulness and slow due to runtime polymorphism. Despite its age, printf is still popular because of simplicity and speed. The Boost library offers two more alternatives, Boost.Format and Boost.LexicalCast. And finally, the P0645 standard proposal sponsored by Facebook is currently finding its way through the C++ committee. All these approaches are still firmly based on standard containers and iterators. But the Standard Library is changing radically with the advent of ranges, range adaptors and functional style programming in C++. Generating optimized code with metaprogramming is becoming standard fare. In this talk, I want to convince you that the combination of ranges with a bit of metaprogramming makes for a very elegant solution to the text formatting problem. We introduce a form of ranges with internal iteration, which are generating their elements one by one rather than exposing external iterators. We can use these generator ranges to represent the values to be formatted, conceptually turning them into lazily evaluated strings. These can be used just like regular strings are used today: in function returns; as standard algorithm input; embedded into other, equally lazily evaluated strings; and so on, before they are finally expanded for display. By choosing the right interfaces, we can optimize this expansion at compile-time, making it no less pretty to write, but more efficient to expand than any text formatting approaches that rely on format strings that must be parsed at runtime. I believe that this approach is the natural extension of a range-based future standard library to text formatting.
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019corehard_by
Память в компьютере - это не только гигабайты оперативной памяти в слоте, но и занятная абстракция. В докладе мы рассмотрим, как можно эту абстракцию использовать необычным образом для моделирования других абстракций - регистровых файлов периферийных устройств. Доклад будет полезен не только embedded-разработчикам, но и, возможно, заставит переосмыслить свой взгляд на память.
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019corehard_by
Как правило, можно положиться на то, что компилятор оптимизирует результирующий бинарный файл так, чтобы она работала максимально быстро. Но компилятор не знает на каких данных и на каком железе программа будет запущена. Плюс хотелось бы, чтобы компиляция занимала приемлемое время. Из-за этого результат может оказаться субоптимальным. Предлагаю на примерах для LLVM посмотреть как можно подсказать компилятору как оптимизировать программу и сделать результат лучше или хуже.
Мы напишем простейший веб-сервис из клиента и сервера на C++. На этом C++ часть закончится, и пойдет настройка окружения и инфраструктуры. Мы обеспечим детерминируемость сборки и прогона тестов. Облегчим последующее обновление зависимых библиотек. Автоматизируем статические проверки, верификацию кода, прогон тестов. Обеспечим доступность сервиса, настроим инфраструктуру, сбалансируем нагрузку, добавим автоматическое и ручное масштабирование. И под конец мы настроим continious delivery таким образом, что код будет на продакшене через 5 минут после реквеста, при этом даже невалидные изменения и ошибки программиста не смогут повлиять на его работу.
Статичный SQL в С++14. Евгений Захаров ➠ CoreHard Autumn 2019corehard_by
Xочу рассказать про разработку библиотеки ORM для SQLite3 на С++14 (https://github.com/fnc12/sqlite_orm). В докладе хочется поделиться своим опытом в попытке создать ORM с которой можно забыть про текстовые запросы и как это адаптируется в С++ при помощи шаблонов.
3. Метаклассы - что это?
CoreHard. Метаклассы: воплощаем мечты в реальность
02
https://www.youtube.com/watch?v=6nsyX37nsRs
4. Метаклассы - что это?
CoreHard. Метаклассы: воплощаем мечты в реальность
03
https://www.youtube.com/watch?v=6nsyX37nsRs
5. Метаклассы - что это?
● Новая языковая сущность
● Управляет генерацией AST и кода
● “Метапрограммирование” в императивном стиле
● Потенциальная замена макросам и некоторым шаблонам
CoreHard. Метаклассы: воплощаем мечты в реальность
04
7. Метаклассы - зачем?
Основное назначение:
1. Ещё одна степень обобщения: описывать общие свойства целых групп классов
(“interface”, “value”, “property” и т. д.), создавать библиотеки метаклассов
2. “Концепты на стероидах”: позволяют верифицировать свойства классов в
императивном стиле
3. Inplace-расширение компилятора (и языка): непосредственная манипуляция AST
на этапе компиляции с целью привести объявление класса к нужному виду
(задание новых свойств, добавление методов, перегрузка операторов и т. п.
CoreHard. Метаклассы: воплощаем мечты в реальность
06
Базируются на:
1. Static reflection (p0712)
2. Generative metaprogramming: code generation and injection (p0712, Code generation in
C++)
Описано в p0707 (revision 3)
11. Метаклассы - пример
$class interface {
virtual ~interface() {}
constexpr {
compiler.require($interface.variables().empty(), "interfaces may not contain data");
for (auto f : $interface.functions()) {
compiler.require(!f.is_copy() && !f.is_move(),
"interfaces may not copy or move; consider a virtual clone() instead");
if (!f.has_access())
f.make_public();
compiler.require(f.is_public(), "interface functions must be public");
f.make_pure_virtual();
f.parameters().add($f.return_type() *);
f.set_type(HRESULT);
f.bases().push_front(IUnknown);
}
}
};
CoreHard. Метаклассы: воплощаем мечты в реальность
10
12. Метаклассы - пример
$class interface {
virtual ~interface() {}
constexpr {
compiler.require($interface.variables().empty(), "interfaces may not contain data");
for (auto f : $interface.functions()) {
compiler.require(!f.is_copy() && !f.is_move(),
"interfaces may not copy or move; consider a virtual clone()
instead");
if (!f.has_access())
f.make_public();
compiler.require(f.is_public(), "interface functions must be public");
f.make_pure_virtual();
f.parameters().add($f.return_type() *);
f.set_type(HRESULT);
f.bases().push_front(IUnknown);
}
}
};
CoreHard. Метаклассы: воплощаем мечты в реальность
11
interface IEnumerator
{
void Reset();
BOOL MoveNext();
IUnknown* Current();
};
struct IEnumerator : public IUnknown
{
virtual ~IEnumerator() {}
virtual HRESULT Reset() = 0;
virtual HRESULT MoveNext(BOOL* succeeded) = 0;
virtual HRESULT Current(IUnknown** item) = 0;
};
13. Метаклассы - пример
$class interface {
virtual ~interface() {}
constexpr {
compiler.require($interface.variables().empty(), "interfaces may not contain data");
for (auto f : $interface.functions()) {
compiler.require(!f.is_copy() && !f.is_move(),
"interfaces may not copy or move; consider a virtual clone() instead");
if (!f.has_access())
f.make_public();
compiler.require(f.is_public(), "interface functions must be public");
f.make_pure_virtual();
f.parameters().add($f.return_type() *);
f.set_type(HRESULT);
f.bases().push_front(IUnknown);
}
}
};
CoreHard. Метаклассы: воплощаем мечты в реальность
12
В соответствии с p0707r1/p0707r2
14. Метаклассы - пример
template<typename T, typename S>
constexpr void interface(T target, const S source) {
compiler.require(source.variables().empty(), "interfaces may not contain data");
for (auto f : source.member_functions()) {
compiler.require(!f.is_copy() && !f.is_move(), "interfaces may not copy or move; consider a virtual clone() instead");
if (!f.has_access())
f.make_public();
compiler.require(f.is_public(), "interface functions must be public");
auto ret = f.return_type();
if (ret == $void) {
-> (target) class {
virtual HRESULT idexpr(f)(__inject(f.parameters())) = 0;
};
} else {
-> (target) class {
virtual HRESULT idexpr(f)(__inject(f.parameters()), typename(ret)* retval) = 0;
};
}
}
}
CoreHard. Метаклассы: воплощаем мечты в реальность
13
В соответствии с p0707r3
15. Метаклассы - пример
constexpr void basic_enum(meta::type target, const meta::type source) {
value(target, source); // a basic_enum is-a value
compiler.require(source.variables().size() > 0, "an enum cannot be empty");
if (src.variables().front().type().is_auto())
->(target) { using U = int; } // underlying type
else ->(target) { using U = (src.variables().front().type())$; }
for (auto o : source.variables()) {
if (!o.has_access()) o.make_public();
if (!o.has_storage()) o.make_constexpr();
if (o.has_auto_type()) o.set_type(U);
compiler.require(o.is_public(), "enumerators must be public");
compiler.require(o.is_constexpr(), "enumerators must be constexpr");
compiler.require(o.type() == U, "enumerators must use same type");
->(target) o;
}
->(target) { U value; } // the instance value
compiler.require(source.functions().empty(), "enumerations must not have functions");
compiler.require(source.bases().empty(), "enumerations must not have base classes");
}
CoreHard. Метаклассы: воплощаем мечты в реальность
14
16. Метаклассы
Проблемы:
● Базируется на ещё не принятых пропозалах -> предлагаемый синтаксис может
меняться
● Неизвестно, когда всё это примут. По некоторым оценкам - не раньше C++2z
● Не все возможные варианты использования детально рассмотрены в публично
доступных документах
CoreHard. Метаклассы: воплощаем мечты в реальность
15
17. Метаклассы
Проблемы:
● Базируется на ещё не принятых пропозалах -> предлагаемый синтаксис может
меняться
● Неизвестно, когда всё это примут. По некоторым оценкам - не раньше C++2z
● Не все возможные варианты использования детально рассмотрены в публично
доступных документах
CoreHard. Метаклассы: воплощаем мечты в реальность
16
А если хочется раньше?
● Ждать принятия в стандарт и поддержки компиляторами
● Использовать шаблонную магию и макросы
● Реализовать и использовать сторонние утилиты
18. Метаклассы
Проблемы:
● Базируется на ещё не принятых пропозалах -> предлагаемый синтаксис может
меняться
● Неизвестно, когда всё это примут. По некоторым оценкам - не раньше C++2z
● Не все возможные варианты использования детально рассмотрены в публично
доступных документах
CoreHard. Метаклассы: воплощаем мечты в реальность
17
А если хочется раньше?
● Ждать принятия в стандарт и поддержки компиляторами
● Использовать шаблонную магию и макросы
● Реализовать и использовать сторонние утилиты
19. Метаклассы - сторонняя утилита
Достоинства:
● Не требуется особой поддержки со стороны компиляторов
● Реализация в рамках актуальных стандартов
● Может быть легко встроена в сборочный тулчейн
● Может сделать кодовую базу проектов проще и упростить поддержку
CoreHard. Метаклассы: воплощаем мечты в реальность
18
20. Метаклассы - сторонняя утилита
Достоинства:
● Не требуется особой поддержки со стороны компиляторов
● Реализация в рамках актуальных стандартов
● Может быть легко встроена в сборочный тулчейн
● Может сделать кодовую базу проектов проще и упростить поддержку
CoreHard. Метаклассы: воплощаем мечты в реальность
19
Недостатки:
● Не соответствует одной из целей создания метаклассов (“Eliminate the need to
invent non-C++ “side languages” and special compilers, such as Qt moc, COM MIDL, and
C++/CX”)
● Собственный “птичий” язык для описания специальных конструкций
● Не всегда удобное использование предлагаемых возможностей
● Потенциальная несовместимость с итоговым вариантом пропозала
21. Метаклассы - сторонняя утилита
Основные возможности:
● Позволяет объявлять метаклассы
● Позволяет объявлять инстансы конкретных метаклассов
● В метаклассах позволяет проверять свойства инстансов и генерировать
диагностику
● Позволяет внедрять в инстансы метаклассов новый код/изменять существующий
● Всё это в рамках одной кодовой базы
CoreHard. Метаклассы: воплощаем мечты в реальность
20
Требования:
● Совместимость со стандартами C++14/17 (идеально - с C++11)
● Совместимость с популярными компиляторами (gcc/clang/MSVC)
● Лёгкость интеграции в сборочный тулчейн
● Относительная простота использования возможностей
● C++ на входе - C++ на выходе, ничего больше
22. Метаклассы - сторонняя утилита
Основная идея реализации:
CoreHard. Метаклассы: воплощаем мечты в реальность
21
Metaclass declaration
header
Metaclass instance
header
Metaclasses
processing tool
.h-file with processed
metaclass instance
.cpp-file with processed
metaclass instance
23. Метаклассы - использование утилиты
$_metaclass(Interface) {
static void GenerateDecl() {
compiler.message("Hello world from metaprogrammer!");
compiler.require($Interface.variables().empty(), "Interface may not contain data members");
$_inject(public) {
enum {InterfaceId = 100500};
}
for (auto& f : $Interface.functions()) {
compiler.require(f.is_implicit() || (!f.is_copy_ctor() && !f.is_move_ctor()),
"Interface can't contain copy or move constructor");
compiler.require(f.is_public(), "Inteface function must be public");
f.make_pure_virtual();
}
}
};
CoreHard. Метаклассы: воплощаем мечты в реальность
22
24. Метаклассы - использование утилиты
$_metaclass(Interface) {
static void GenerateDecl() {
compiler.message("Hello world from metaprogrammer!");
compiler.require($Interface.variables().empty(), "Interface may not contain data members");
$_inject(public) {
enum {InterfaceId = 100500};
}
for (auto& f : $Interface.functions()) {
compiler.require(f.is_implicit() || (!f.is_copy_ctor() && !f.is_move_ctor()),
"Interface can't contain copy or move constructor");
compiler.require(f.is_public(), "Inteface function must be public");
f.make_pure_virtual();
}
}
};
CoreHard. Метаклассы: воплощаем мечты в реальность
23
Макрос для объявление метакласса
Метод, отвечающий за генерацию декларации
Интерфейс к “компилятору”
Макрос для внедрения нового кода в класс
Ссылка на обрабатываемый инстанс метакласса
26. Метаклассы - использование утилиты
$_class(TestIface, Interface)
{
void TestMethod1();
std::string TestMethod2(int param)
const;
};
CoreHard. Метаклассы: воплощаем мечты в реальность
25
$_metaclass(Interface) {
static void GenerateDecl() {
compiler.message("Hello world from metaprogrammer!");
compiler.require($Interface.variables().empty(), "Interface may not contain data members");
$_inject(public) {
enum {InterfaceId = 100500};
}
for (auto& f : $Interface.functions()) {
compiler.require(f.is_implicit() || (!f.is_copy_ctor() && !f.is_move_ctor()),
"Interface can't contain copy or move constructor");
compiler.require(f.is_public(), "Inteface function must be public");
f.make_pure_virtual();
}
}
};
class TestIface {
public:
enum { InterfaceId = 100500 };
virtual void TestMethod1() = 0;
virtual std::string TestMethod2(int param) const = 0;
protected:
private:
};
27. Метаклассы - использование утилиты
struct TestStruct
{
int a;
std::string b;
template <typename Arch>
void serialize(Arch &ar, unsigned int ver)
{
ar & a;
ar & b;
}
};
CoreHard. Метаклассы: воплощаем мечты в реальность
26
28. Метаклассы - использование утилиты
struct TestStruct
{
int a;
std::string b;
template <typename Arch>
void serialize(Arch &ar, unsigned int ver)
{
ar & a;
ar & b;
}
};
CoreHard. Метаклассы: воплощаем мечты в реальность
27
struct AnotherTestStruct1
{
// Members
template <typename Arch>
void serialize(Arch &ar, unsigned int ver)
{
// Serializer impl
}
};
struct AnotherTestStruct2
{
// Members
template <typename Arch>
void serialize(Arch &ar, unsigned int ver)
{
// Serializer impl
}
};
struct AnotherTestStruct3
{
// Members
template <typename Arch>
void serialize(Arch &ar, unsigned int ver)
{
// Serializer impl
}
};
struct AnotherTestStruct4
{
// Members
template <typename Arch>
void serialize(Arch &ar, unsigned int ver)
{
// Serializer impl
}
};
struct AnotherTestStruct5
{
// Members
template <typename Arch>
void serialize(Arch &ar, unsigned int ver)
{
// Serializer impl
}
};
29. Метаклассы - использование утилиты
$_struct(TestStruct, BoostSerializable)
{
int a;
std::string b;
};
CoreHard. Метаклассы: воплощаем мечты в реальность
28
30. Метаклассы - использование утилиты
$_metaclass(BoostSerializable) {
static void GenerateDecl() {
$_inject(public) [&, name="serialize"](auto& ar, const unsigned int ver) -> void
{
$_constexpr for (auto& v : $BoostSerializable.variables())
$_inject(_) ar & $_v(v.name());
};
}
};
CoreHard. Метаклассы: воплощаем мечты в реальность
29
31. Метаклассы - использование утилиты
$_struct(TestStruct, BoostSerializable)
{
int a;
std::string b;
};
CoreHard. Метаклассы: воплощаем мечты в реальность
30
$_metaclass(BoostSerializable) {
static void GenerateDecl() {
$_inject(public) [&, name="serialize"](auto& ar, const unsigned int ver) -> void
{
$_constexpr for (auto& v : $BoostSerializable.variables())
$_inject(_) ar & $_v(v.name());
};
}
};
class TestStruct {
public:
template <typename T0> void serialize(T0 &ar, const unsigned int ver) {
ar & a;
ar & b;
}
int a;
std::string b;
};
32. Метаклассы - использование утилиты
$_metaclass(BoostSerializableSplitted) {
static void GenerateDecl() {
$_inject(public) [&, name="load"](auto& ar, unsigned int ver) -> void
{
$_constexpr for (auto& v : $BoostSerializableSplitted.variables())
$_inject(_) ar >> $_v(v.name());
};
$_inject(public) [&, name="save", is_const=true](auto& ar, unsigned int ver) -> void
{
$_constexpr for (auto& v : $BoostSerializableSplitted.variables())
$_inject(_) ar << $_v(v.name());
};
$_inject(public) [&, name="serialize"](auto& ar, const unsigned int ver) -> void
{
boost::serialization::split_member(ar, $_safe(*this), ver);
};
}
};
CoreHard. Метаклассы: воплощаем мечты в реальность
31
33. Метаклассы - использование утилиты
class TestStruct {
public:
template <typename T0> void load(T0 &ar, unsigned int ver) {
ar << a;
ar << b;
}
template <typename T0> void save(T0 &ar, unsigned int ver) const {
ar >> a;
ar >> b;
}
template <typename T0> void serialize(T0 &ar, const unsigned int ver) {
boost::serialization::split_member(ar, *this, ver);
}
int a;
std::string b;
protected:
private:
};
CoreHard. Метаклассы: воплощаем мечты в реальность
32
34. Метаклассы - использование утилиты
$_metaclass(Name) - макрос, с помощью которого объявляется метакласс
$_class(Name, MetaclassName) - макрос, с помощью которого объявляется инстанс
метакласса
$_inject(Visibility) - макрос-префикс, который приводит к вставке следующего за ним
блока в тело инстанса метакласса
$_constexpr() - макрос-префикс, помечающий следующий за ним оператор как
вычисляемый на этапе компиляции
$_inject_xxx(Name, Visibility), где XXX - это enum, struct, class или union - макрос-префикс,
который приводит к вставке следующего за ним блока в тело инстанса метакласса в
виде отдельной структуры, enum’а, класса или объединения
$_n(expr) - макрос, который заменяется значением выражения expr, вычисленного на
этапе компиляции
$_t(expr) - макрос, который заменяется типом выражения expr, вычисленного на этапе
компиляции
$_safe(expr) - макрос, который заменяется на expr
CoreHard. Метаклассы: воплощаем мечты в реальность
33
35. Метаклассы - использование утилиты
compiler - экземпляр класса meta::CompilerImpl, предоставляющий доступ к глобальным
методам типа require, error, message и т. п.
meta::TypeInfo - класс, предоставляющий различную информацию о конкретном типе
meta::MemberInfo - класс, предоставляющий различную информацию о конкретном
члене класса
meta::MethodInfo - класс, предоставляющий различную информацию о конкретном
методе класса
meta::ClassInfo - класс, предоставляющий различную информацию о конкретном
классе. Видимые в методах реализации метакласса переменные вида $Interface -
именно этого типа
CoreHard. Метаклассы: воплощаем мечты в реальность
34
36. Метаклассы - использование утилиты
Перечисленные типы (и переменные), по сути - read/write-интерфейс к AST и
компилятору
CoreHard. Метаклассы: воплощаем мечты в реальность
35
39. Интерпретатор C++
1. Детально анализирует AST декларации метакласса
2. Фактически исполняет код декларации метакласса используя в качестве
исходных данных отрефлексированный AST конкретного инстанса
3. Обеспечивает печать диагностических сообщений и проверку предикатов
4. Модифицирует отрефлексированный AST в соответствии с прописанной в
меткалассе логикой
5. Инжектирует в инстанс метакласса заданные фрагменты кода с учётом constexpr-
конструкций
CoreHard. Метаклассы: воплощаем мечты в реальность
38
40. Интерпретатор C++
CoreHard. Метаклассы: воплощаем мечты в реальность
39
Анализатор и интерпретатор операторов
Вычислитель выражений
Интерфейс к внутренней инфраструктуре
44. Интерпретатор C++
compiler.require($Interface.variables().empty(), "Interface may not contain data members");
CoreHard. Метаклассы: воплощаем мечты в реальность
42
1. Интерпретатор операторов определяет, что это выражение
2. Вычислитель определяет, что выражение - это вызов члена класса
3. Объект, к которому применяется вызов метода, отображается на реализацию
интерфейса к компилятору
45. Интерпретатор C++
compiler.require($Interface.variables().empty(), "Interface may not contain data members");
CoreHard. Метаклассы: воплощаем мечты в реальность
43
1. Интерпретатор операторов определяет, что это выражение
2. Вычислитель определяет, что выражение - это вызов члена класса
3. Объект, к которому применяется вызов метода, отображается на реализацию
интерфейса к компилятору
4. Начинают вычисляться параметры
46. Интерпретатор C++
compiler.require($Interface.variables().empty(), "Interface may not contain data members");
CoreHard. Метаклассы: воплощаем мечты в реальность
44
1. Интерпретатор операторов определяет, что это выражение
2. Вычислитель определяет, что выражение - это вызов члена класса
3. Объект, к которому применяется вызов метода, отображается на реализацию
интерфейса к компилятору
4. Начинают вычисляться параметры
5. Первый параметр - вызов члена класса
47. Интерпретатор C++
compiler.require($Interface.variables().empty(), "Interface may not contain data members");
CoreHard. Метаклассы: воплощаем мечты в реальность
45
1. Интерпретатор операторов определяет, что это выражение
2. Вычислитель определяет, что выражение - это вызов члена класса
3. Объект, к которому применяется вызов метода, отображается на реализацию
интерфейса к компилятору
4. Начинают вычисляться параметры
5. Первый параметр - вызов члена класса
6. ‘$Interface’ отображается на дескриптор инстанса метакласса
48. Интерпретатор C++
compiler.require($Interface.variables().empty(), "Interface may not contain data members");
CoreHard. Метаклассы: воплощаем мечты в реальность
46
1. Интерпретатор операторов определяет, что это выражение
2. Вычислитель определяет, что выражение - это вызов члена класса
3. Объект, к которому применяется вызов метода, отображается на реализацию
интерфейса к компилятору
4. Начинают вычисляться параметры
5. Первый параметр - вызов члена класса
6. ‘$Interface’ отображается на дескриптор инстанса метакласса
7. Последовательно вызываются: метод, возвращающий коллекцию переменных, а
затем - ‘empty()’
49. Интерпретатор C++
compiler.require($Interface.variables().empty(), "Interface may not contain data members");
CoreHard. Метаклассы: воплощаем мечты в реальность
47
1. Интерпретатор операторов определяет, что это выражение
2. Вычислитель определяет, что выражение - это вызов члена класса
3. Объект, к которому применяется вызов метода, отображается на реализацию
интерфейса к компилятору
4. Начинают вычисляться параметры
5. Первый параметр - вызов члена класса
6. ‘$Interface’ отображается на дескриптор инстанса метакласса
7. Последовательно вызываются: метод, возвращающий коллекцию переменных, а
затем - ‘empty()’
8. Второй параметр, строковый литерал, конвертируется в строку
50. Интерпретатор C++
compiler.require($Interface.variables().empty(), "Interface may not contain data members");
CoreHard. Метаклассы: воплощаем мечты в реальность
48
1. Интерпретатор операторов определяет, что это выражение
2. Вычислитель определяет, что выражение - это вызов члена класса
3. Объект, к которому применяется вызов метода, отображается на реализацию
интерфейса к компилятору
4. Начинают вычисляться параметры
5. Первый параметр - вызов члена класса
6. ‘$Interface’ отображается на дескриптор инстанса метакласса
7. Последовательно вызываются: метод, возвращающий коллекцию переменных, а
затем - ‘empty()’
8. Второй параметр, строковый литерал, конвертируется в строку
9. Вызывается метод ‘require’, который в зависимости от значения первого
параметра либо выводит диагностическое сообщение, либо нет
51. Интерпретатор C++
Нюансы реализации:
● ОЧЕНЬ СЛОЖНОЕ И ПОДРОБНОЕ AST
● Необходимость следить за областями видимости и, соответственно, временем
жизни объектов и промежуточных результатов вычислений
● Логика вычисления некоторых конструкций нетривиальна. Например, range-based
for loop
● Необходимость отделять то, что нужно интерпретировать, от того, что нужно
инжектировать в результирующий код
CoreHard. Метаклассы: воплощаем мечты в реальность
49
52. Интерпретатор C++
● Связка boost::variant + boost::apply_visitor + C++14 + SFINAE - очень мощная.
Позволяет упростить ряд конструкций.
● Атрибуты, введённые в язык, очень сильно помогают в разметке узлов AST и их
последующем анализе
● Нет видимой необходимости поддерживать весь набор базовых типов в C++
CoreHard. Метаклассы: воплощаем мечты в реальность
50
53. Интеграция с системой сборки
include_directories(
${CODEGEN_DIR}
${CODEGEN_ROOT_DIR}/include
)
set (CODEGEN_DIR ${CMAKE_CURRENT_BINARY_DIR}/codegen)
file (MAKE_DIRECTORY ${CODEGEN_DIR}/generated)
set (METACLASSES_GEN_FILE ${CODEGEN_DIR}/generated/structs.meta.h)
set (CODEGEN_ROOT_DIR "d:/projects/work/Personal/autoprogrammer/autoprogrammer")
set (CODEGEN_TOOL "d:/projects/work/Personal/autoprogrammer/autoprogrammer-build/MSVC2015-Debug/fl-codegen.exe")
add_custom_command(OUTPUT ${METACLASSES_GEN_FILE}
COMMAND ${CODEGEN_TOOL} ARGS -gen-metaclasses -show-clang-diag -ohdr ${METACLASSES_GEN_FILE} -input
${CMAKE_CURRENT_SOURCE_DIR}/structs.h -- clang-cl -std=c++14 -x c++ ${CMAKE_CXX_FLAGS} -I ${CODEGEN_ROOT_DIR}/include -I
${BOOST_ROOT}
MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/structs.h
DEPENDS ${CODEGEN_BIN_NAME} serialization_metaclass.h
COMMENT "Generating metaclasses implementation for ${CMAKE_CURRENT_SOURCE_DIR}/structs.h"
)
add_executable(${PROJECT_NAME} "main.cpp" "serialization_metaclass.h" "structs.h" ${METACLASSES_GEN_FILE})
target_link_libraries(${PROJECT_NAME} Boost::serialization)
CoreHard. Метаклассы: воплощаем мечты в реальность
51
54. Интеграция с системой сборки
include_directories(
${CODEGEN_DIR}
${CODEGEN_ROOT_DIR}/include
)
set (CODEGEN_DIR ${CMAKE_CURRENT_BINARY_DIR}/codegen)
file (MAKE_DIRECTORY ${CODEGEN_DIR}/generated)
set (METACLASSES_GEN_FILE ${CODEGEN_DIR}/generated/structs.meta.h)
set (CODEGEN_ROOT_DIR "d:/projects/work/Personal/autoprogrammer/autoprogrammer")
set (CODEGEN_TOOL "d:/projects/work/Personal/autoprogrammer/autoprogrammer-build/MSVC2015-Debug/fl-codegen.exe")
add_custom_command(OUTPUT ${METACLASSES_GEN_FILE}
COMMAND ${CODEGEN_TOOL} ARGS -gen-metaclasses -ohdr ${METACLASSES_GEN_FILE} -input
${CMAKE_CURRENT_SOURCE_DIR}/structs.h -- clang-cl -std=c++14 -x c++ ${CMAKE_CXX_FLAGS} -I ${CODEGEN_ROOT_DIR}/include -I
${BOOST_ROOT}
MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/structs.h
DEPENDS ${CODEGEN_BIN_NAME} serialization_metaclass.h
COMMENT "Generating metaclasses implementation for ${CMAKE_CURRENT_SOURCE_DIR}/structs.h"
)
add_executable(${PROJECT_NAME} "main.cpp" "serialization_metaclass.h" "structs.h" ${METACLASSES_GEN_FILE})
target_link_libraries(${PROJECT_NAME} Boost::serialization)
CoreHard. Метаклассы: воплощаем мечты в реальность
52
55. Дальнейшие планы
● Доработка основных возможностей интерпретатора
● Отладка и настройка сборки под разные системы и компиляторы
● Докер-образы с уже установленной утилитой
● Расширение возможностей frontend’а:
○ манипуляция с типами
○ возможность генерации не только в .h-файлы, но и в .cpp
○ возможность задания нескольких метаклассов для одного инстанса
○ приведение в соответствие с последней (r4) ревизии p0707
CoreHard. Метаклассы: воплощаем мечты в реальность
53
56. Полезные ссылки
● Пропозал по метаклассам: http://www.open-
std.org/jtc1/sc22/wg21/docs/papers/2018/p0707r3.pdf
● Пропозал по static reflection (один из):http://www.open-
std.org/jtc1/sc22/wg21/docs/papers/2017/p0712r0.pdf
● Доклад Герба Саттера с ACCU 2017: https://www.youtube.com/watch?v=6nsyX37nsRs
● Доклад Герба Саттера с CppCon 2018: https://www.youtube.com/watch?v=80BZxujhY38
● Реализация metaclasses processing tool:
https://github.com/flexferrum/autoprogrammer/tree/metaclasses
● Презентация по “автопрограммисту”:
https://docs.google.com/presentation/d/1v0lJqkQVrDUbaKy7_79Vg67EcrNKpBB9yruZIvo8f0c/e
dit?usp=sharing
CoreHard. Метаклассы: воплощаем мечты в реальность
54