Проектирование больших систем на С++ — различия между версиями

Материал из Кафедра математической кибернетики
Перейти к: навигация, поиск
м (fix title)
 
(не показаны 379 промежуточные версии 4 участников)
Строка 1: Строка 1:
{{DISPLAYTITLE:Проектирование больших систем на С++}}
+
[[Категория:Спецкурсы кафедры МК]]
Курс по магистерской программе Дискретные управляющие системы и их приложения. Занятия проводит [[Участник:KonovodovV|Коноводов В.А.]]
+
[[Категория:Лекционные курсы кафедры МК]]
 +
[[Категория:Магистерская программа Дискретные управляющие системы и их приложения]]
  
В курсе рассматриваются темы, востребованные в промышленном программировании на языке C++. Разбираются вопросы, связанные с обобщенным программированием, интеллектуальными указателями, исключениями, паттернами проектирования и др. Отдельно разбираются возможности современного языка С++, введенные в стандартах C++11/14: вывод типов, семантика перемещения, rvalue-ссылки, поддержка многопоточности, лямбда-выражения и др.  
+
Занятия проводятся по вторникам шестой парой (в 18:00).
 +
 
 +
Курс по магистерской программе Дискретные управляющие системы и их приложения. Занятия проводит [[Участник:ZhukovVV|Владимир Владимирович Жуков.]]
 +
 
 +
В курсе рассматриваются темы, востребованные в промышленном программировании на языке C++. Разбираются вопросы, связанные с метапрограммированием, умными указателями, исключениями, паттернами проектирования, тестированием, отладкой кода и др. Отдельно разбираются возможности современного языка С++, введенные в стандартах C++11/14/17/20: вывод типов, семантика перемещения, rvalue-ссылки, поддержка многопоточности, лямбда-выражения и др.  
  
 
В задачи курса входят актуализация студентами знаний языка С++ и ознакомление с современными принципами проектирования больших систем с использованием языка C++.  
 
В задачи курса входят актуализация студентами знаний языка С++ и ознакомление с современными принципами проектирования больших систем с использованием языка C++.  
 +
 
На занятиях предполагается разбор примеров использования конструкций языка и применения рассматриваемых методов проектирования, а также проведение промежуточных небольших тестов-контрольных.
 
На занятиях предполагается разбор примеров использования конструкций языка и применения рассматриваемых методов проектирования, а также проведение промежуточных небольших тестов-контрольных.
  
 +
[[Media: Pbscpp.pdf|Программа курса (pdf)]]
  
== Содержание курса ==
+
== Занятия в 2024 г. ==
 +
* [https://docs.google.com/spreadsheets/d/1daYZmqfhzrqL30kgwXsSy0f5zUFXY8yf5jTKFlMicJo/edit?usp=sharing Таблица результатов]
 +
* Первое занятие состоится 3 сентября.
 +
* Тест 1: 17.09.2024
 +
* Тест 2: 24.09.2023
 +
* Тест 3: 01.10.2023
 +
* Тест 4: 08.10.2023
 +
* Тест 5: 15.10.2023
 +
* Тест 6: 29.10.2023
 +
* Тест 7: 05.11.2023
 +
* Тест 8: 12.11.2023
 +
* Досрочный экзамен: DD.MM.YYYY HH:MM (ауд. NN)
 +
* Основной экзамен: DD.MM.YYYY HH:MM (ауд. NN)
  
'''Занятие 1.''' Вводный тест. Вывод типов шаблонов и auto. Ключевое слово decltype. Инициализация с фигурными скобками.
+
== Экзамен ==
 +
Экзамен по курсу письменный. Максимальная сумма баллов за экзаменационную работу – 50.
  
'''[[Media: Lection_pbscpp_2.pdf|Занятие 2]].''' Ключевые слова override и final. Удаленные функции. Псевдонимы. Перечисления с областью видимости. Объекты и функции constexpr.
+
* Оценка '''отлично''': не менее 40 баллов
 +
* Оценка '''хорошо''': не менее 30 и не более 39 баллов
 +
* Оценка '''удовлетворительно''': не менее 20 и не более 29 баллов
  
'''[[Media: Lection_pbscpp_3.pdf|Занятие 3]].''' Лямбда-выражения, функторы и связыватели.
+
За тесты на лекциях и выполнение дополнительных заданий можно получить следующие бонусы:
 +
* Оценка '''отлично''' (автомат)
 +
* Дополнительные баллы на экзамене (до 10 баллов, что является эквивалентом повышения итоговой оценки на 1 балл)
 +
* Возможность участвовать в досрочном экзамене
  
'''Занятие 4.'''  Семантика перемещения, std::move, перемещающие конструкторы и операторы перемещения, типы ссылок.
+
Критерии получения бонусов будут сформулированы позднее.
  
'''[[Media: Lection_pbscpp_4.pdf|Занятие 5]].'''  Универсальные ссылки, прямая передача, свертка ссылок, return value optimization, проблемы перегрузки.
+
[[Media: Pbs_exam_example.pdf|Пример экзаменационного варианта (pdf)]] (на баллы за каждое задание можно не обращать внимание, они будут скорректированы исходя из статистики прошлого года)
  
'''[[Media: Lection_pbscpp_6.pdf|Занятие 6]].''' Операторы new, delete и аллокаторы. Умные указатели. std::unique_ptr.
+
== Содержание курса ==
 +
'''Занятие 1.''' Организационные вопросы. C++ Style Guide. Вводный тест.
 +
* [https://github.com/catboost/catboost/blob/master/CPP_STYLE_GUIDE.md Yandex C++ Style Guide].
 +
* [https://google.github.io/styleguide/cppguide.html Google C++ Style Guide]
  
'''[[Media: Lection_pbscpp_7.pdf|Занятие 7]].'''   Указатели std::shared_ptr, std::weak_ptr, особенности использования make_shared.
+
'''Занятие 2.''' Некоторые особенности C++11, вывод типа. Модификаторы функций, псевдонимы, scoped enums. Constexpr-выражения и объекты. Шаблоны с переменным числом аргументов.
 +
* [https://disk.yandex.ru/i/YgMRuCOO5XNAnw Лекция 2]
 +
* [https://disk.yandex.ru/i/YQRRH-kfxgs_Kw Дополнительные слайды] (исключения вывода типа для auto, value-категории, информация для теста)
 +
* Книги Скотта Мейерса на английском языке можно найти на [https://aovst.cs.msu.ru/ сайте практикума 318 группы]
 +
* [https://disk.yandex.ru/i/dSbYR9vwi8SGQw Задание 1] (больше не принимается)
  
'''[[Media: Lection_pbscpp_8.pdf|Занятие 8]].''' Идиомы CRTP, PIMPL. Примеры паттернов проектирования: Bridge, Command.
+
'''Занятие 3.''' Лямбда-выражения. Связыватели. Некоторые особенности C++17.
 +
* [https://disk.yandex.ru/i/s_xbIq4nUrZ4PA Лекция 3]
 +
* [https://disk.yandex.ru/i/EsnIYzNCQylo9Q Задание 2] (больше не принимается)
  
'''[[Media: Lection_pbscpp_9.pdf|Занятие 9]].''' Паттерны Singleton, Strategy, Decorator, Observer.
+
'''Занятие 4.''' Move-семантика, типы ссылок. Проблема перегрузки универсальных ссылок.
 +
* [https://disk.yandex.ru/i/kzEnu6IkyBDFyg Лекция 4]
  
'''[[Media: Lection_pbscpp_10.pdf|Занятие 10]].''' Создание объектов с помощью фабрик. Паттерн Visitor. Шаблонное метапрограммирование, std::enable_if, решение проблемы перегрузки и универсальных ссылок.
+
'''Занятие 5.''' Особенности перемещающих операций в классах. Умные указатели.
 +
* [https://disk.yandex.ru/i/h-uQEspqzaqR-g Лекция 5]
 +
* [https://disk.yandex.ru/i/wsD6fWbzC5OkmQ Задание 3] (больше не принимается)
 +
* [https://disk.yandex.ru/d/VCOpY0oE6NvgCQ Мемы про Ложкина]
  
'''[[Media: Lection_pbscpp_11.pdf|Занятие 11]].''' Метапрограммирование с шаблонами и X-macro. Идиома Type Erasure.
+
'''Занятие 6.''' Умные указатели и владение памятью. Идиома CRTP.
 +
* [https://disk.yandex.ru/i/1Nl2sBwn6ZTNxw Лекция 6]
 +
* [https://disk.yandex.ru/i/h6TH_DyT4ctS2A Задание 4] (больше не принимается)
 +
* [https://mks2.cs.msu.ru/root/pbs_tree Код для задания 4]
  
'''[[Media: Lection_pbscpp_12.pdf|Занятие 12]].''' Обработка ошибок.
+
'''Занятие 7.''' Идиома PImpl. Паттерны проектирования Bridge, Command, Strategy, Singleton.
 +
* [https://disk.yandex.ru/i/EUs0mYjw8IVKeg Лекция 7]
 +
* [https://mks2.cs.msu.ru/root/pbs_examples_2024 Репозиторий, где пишем код на занятиях]
  
'''[[Media: Lection_pbscpp_13.pdf|Занятие 13]].''' Введение в многопоточность. Примитивы синхронизации.
+
'''Занятие 8.''' Создание объектов с помощью фабрик. Паттерны проектирования Decorator и Visitor.  
 +
* Лекция 8
  
'''[[Media: Lection_pbscpp_14.pdf|Занятие 14]].''' Многопоточность. Некоторые особенности C++14 и C++17.
+
'''Занятие 9.''' Идиома TypeErasure. Решение проблем перегрузки универсальных ссылок. Диспетчеризация дескрипторов. Правило SFINAE.
 +
* Лекция 9
 +
* Задание 5
  
== Задачи ==
+
'''Занятие 10.''' Обработка исключений. Гарантии безопасности исключений. Неопределенное поведение.
'''[[Media: Pbscpp_tasks.pdf|Условия задач]]'''
+
* Лекция 10
  
== Экзамен ==
+
'''Занятие 11.''' Тестирование кода, unit-тестирование, устранение зависимостей. Google C++ Testing Framework.  
Экзамен по курсу письменный. В работе 15 заданий, на выполнение отводится 90 минут. Максимальная сумма баллов – 30.
+
* Лекция 11
 +
* Задача 6
 +
* [http://google.github.io/googletest/ Документация по googletest]
  
* Оценка отлично: не менее 24 баллов
+
'''Занятие 12.''' Отладка и дебаг кода. Оптимизация программ на C++. Строки.
* Оценка хорошо: не менее 18 и не более 23 баллов
+
* Лекция 12
* Оценка удовлетворительно: не менее 12 и не более 17 баллов
+
* Задача 7
  
[[Media: Pbscpp_exam_example.pdf|Примерный вариант экзаменационной работы]].
+
'''Занятие 13.''' Оптимизация алгоритмов, функций, памяти. Плотная упаковка полей. Бинарная сериализация данных. Protobuf.
 
+
* Лекция 13
== Программа курса ==
+
* Задача 8 и пример входного файла (дедлайн DD.MM.YYYY 09:00)
[[Media: Pbscpp_content2017.pdf|Программа курса (pdf)]] (осенний семестр 2017 года)  
+
* Комментарии по проверке находятся в отдельном листе таблицы результатов.
  
 +
'''Занятие 14.''' Новые стандарты языка C++20 и C++23. Корутины, концепты, ranges library.
 +
* Лекция 14
  
 
== Литература ==
 
== Литература ==
 +
===Основная===
 
* С. Мейерс, Эффективный и современный С++: 42 рекомендации по использованию C++11 и C++14, изд. Вильямс, М.: 2017 г.
 
* С. Мейерс, Эффективный и современный С++: 42 рекомендации по использованию C++11 и C++14, изд. Вильямс, М.: 2017 г.
 +
* Ф. Пикус, Идиомы и паттерны проектирования в современном C++. ДМК Пресс, 2019 г.
 +
* CppCoreGuidelines (ред. Б. Страуструп, Г. Саттер) https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines
 +
* Курт Гантерот: Оптимизация программ на C++. Проверенные методы повышения производительности. М.:Диалектика, 2017 г.
 +
 +
===Дополнительная===
 +
* Klaus Iglberger. C++ Software Design: Design Principles and Patterns for High-Quality Software. O'Reilly Media; 1st edition. 2022.
 
* Anthony Williams. C++ Concurrency in Action: Practical Multithreading.  
 
* Anthony Williams. C++ Concurrency in Action: Practical Multithreading.  
 
* А. Александреску, Современное проектирование на C++, изд. Вильямс, М.: 2017 г.
 
* А. Александреску, Современное проектирование на C++, изд. Вильямс, М.: 2017 г.
Строка 62: Строка 119:
 
* Б. Страуструп, Язык программирования С++, 4-е издание.
 
* Б. Страуструп, Язык программирования С++, 4-е издание.
 
* Б. Страуструп, Программирование. Принципы и практика использования C++.
 
* Б. Страуструп, Программирование. Принципы и практика использования C++.
* Б. Страуструп, Дизайн и эволюция языка С++.
+
* Вандевурд Д., Джосаттис Н. Шаблоны C++. Справочник разработчика.
* D. Abrahams, A. Gurtovoy C++ Template Metaprogramming.
+
* Курс [https://academy.yandex.ru/handbook/cpp Основы C++] от Академии Яндекса.
 
+
* [http://google.github.io/googletest/ Документация] по Google Test.
 
+
* [https://developers.google.com/protocol-buffers/docs/overview?hl=en Документация] protobuf.
[[Категория:Лекционные курсы кафедры МК]]
+
* [https://github.com/catboost/catboost/blob/master/CPP_STYLE_GUIDE.md Yandex C++ Style Guide].
[[Категория:Магистерская программа Дискретные управляющие системы и их приложения]]
+
* [https://google.github.io/styleguide/cppguide.html Google C++ Style Guide].

Текущая версия на 08:42, 16 октября 2024


Занятия проводятся по вторникам шестой парой (в 18:00).

Курс по магистерской программе Дискретные управляющие системы и их приложения. Занятия проводит Владимир Владимирович Жуков.

В курсе рассматриваются темы, востребованные в промышленном программировании на языке C++. Разбираются вопросы, связанные с метапрограммированием, умными указателями, исключениями, паттернами проектирования, тестированием, отладкой кода и др. Отдельно разбираются возможности современного языка С++, введенные в стандартах C++11/14/17/20: вывод типов, семантика перемещения, rvalue-ссылки, поддержка многопоточности, лямбда-выражения и др.

В задачи курса входят актуализация студентами знаний языка С++ и ознакомление с современными принципами проектирования больших систем с использованием языка C++.

На занятиях предполагается разбор примеров использования конструкций языка и применения рассматриваемых методов проектирования, а также проведение промежуточных небольших тестов-контрольных.

Программа курса (pdf)

Занятия в 2024 г.

  • Таблица результатов
  • Первое занятие состоится 3 сентября.
  • Тест 1: 17.09.2024
  • Тест 2: 24.09.2023
  • Тест 3: 01.10.2023
  • Тест 4: 08.10.2023
  • Тест 5: 15.10.2023
  • Тест 6: 29.10.2023
  • Тест 7: 05.11.2023
  • Тест 8: 12.11.2023
  • Досрочный экзамен: DD.MM.YYYY HH:MM (ауд. NN)
  • Основной экзамен: DD.MM.YYYY HH:MM (ауд. NN)

Экзамен

Экзамен по курсу письменный. Максимальная сумма баллов за экзаменационную работу – 50.

  • Оценка отлично: не менее 40 баллов
  • Оценка хорошо: не менее 30 и не более 39 баллов
  • Оценка удовлетворительно: не менее 20 и не более 29 баллов

За тесты на лекциях и выполнение дополнительных заданий можно получить следующие бонусы:

  • Оценка отлично (автомат)
  • Дополнительные баллы на экзамене (до 10 баллов, что является эквивалентом повышения итоговой оценки на 1 балл)
  • Возможность участвовать в досрочном экзамене

Критерии получения бонусов будут сформулированы позднее.

Пример экзаменационного варианта (pdf) (на баллы за каждое задание можно не обращать внимание, они будут скорректированы исходя из статистики прошлого года)

Содержание курса

Занятие 1. Организационные вопросы. C++ Style Guide. Вводный тест.

Занятие 2. Некоторые особенности C++11, вывод типа. Модификаторы функций, псевдонимы, scoped enums. Constexpr-выражения и объекты. Шаблоны с переменным числом аргументов.

Занятие 3. Лямбда-выражения. Связыватели. Некоторые особенности C++17.

Занятие 4. Move-семантика, типы ссылок. Проблема перегрузки универсальных ссылок.

Занятие 5. Особенности перемещающих операций в классах. Умные указатели.

Занятие 6. Умные указатели и владение памятью. Идиома CRTP.

Занятие 7. Идиома PImpl. Паттерны проектирования Bridge, Command, Strategy, Singleton.

Занятие 8. Создание объектов с помощью фабрик. Паттерны проектирования Decorator и Visitor.

  • Лекция 8

Занятие 9. Идиома TypeErasure. Решение проблем перегрузки универсальных ссылок. Диспетчеризация дескрипторов. Правило SFINAE.

  • Лекция 9
  • Задание 5

Занятие 10. Обработка исключений. Гарантии безопасности исключений. Неопределенное поведение.

  • Лекция 10

Занятие 11. Тестирование кода, unit-тестирование, устранение зависимостей. Google C++ Testing Framework.

Занятие 12. Отладка и дебаг кода. Оптимизация программ на C++. Строки.

  • Лекция 12
  • Задача 7

Занятие 13. Оптимизация алгоритмов, функций, памяти. Плотная упаковка полей. Бинарная сериализация данных. Protobuf.

  • Лекция 13
  • Задача 8 и пример входного файла (дедлайн DD.MM.YYYY 09:00)
  • Комментарии по проверке находятся в отдельном листе таблицы результатов.

Занятие 14. Новые стандарты языка C++20 и C++23. Корутины, концепты, ranges library.

  • Лекция 14

Литература

Основная

  • С. Мейерс, Эффективный и современный С++: 42 рекомендации по использованию C++11 и C++14, изд. Вильямс, М.: 2017 г.
  • Ф. Пикус, Идиомы и паттерны проектирования в современном C++. ДМК Пресс, 2019 г.
  • CppCoreGuidelines (ред. Б. Страуструп, Г. Саттер) https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines
  • Курт Гантерот: Оптимизация программ на C++. Проверенные методы повышения производительности. М.:Диалектика, 2017 г.

Дополнительная

  • Klaus Iglberger. C++ Software Design: Design Principles and Patterns for High-Quality Software. O'Reilly Media; 1st edition. 2022.
  • Anthony Williams. C++ Concurrency in Action: Practical Multithreading.
  • А. Александреску, Современное проектирование на C++, изд. Вильямс, М.: 2017 г.
  • Э.Гамма, Р.Хелм, Р.Джонсон, Дж. Влиссидес, Приемы объектно-ориентированного проектирования.
  • Г. Саттер, А. Александреску, Стандарты программирования на С++. 101 правило и рекомендация.
  • Б. Страуструп, Язык программирования С++, 4-е издание.
  • Б. Страуструп, Программирование. Принципы и практика использования C++.
  • Вандевурд Д., Джосаттис Н. Шаблоны C++. Справочник разработчика.
  • Курс Основы C++ от Академии Яндекса.
  • Документация по Google Test.
  • Документация protobuf.
  • Yandex C++ Style Guide.
  • Google C++ Style Guide.