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

Материал из Кафедра математической кибернетики
Перейти к: навигация, поиск
(Задание 3)
(не показаны 45 промежуточные версии 1 участника)
Строка 1: Строка 1:
 +
{{DISPLAYTITLE:Проектирование больших систем на С++}}
 
Курс по магистерской программе Дискретные управляющие системы и их приложения. Занятия проводит [[Участник:KonovodovV|Коноводов В.А.]]
 
Курс по магистерской программе Дискретные управляющие системы и их приложения. Занятия проводит [[Участник:KonovodovV|Коноводов В.А.]]
  
Занятия проходят по пятницам, с 8:45, в ауд. '''609'''.
+
Занятия в осеннем семестре 2018 г. завершены.
  
 
+
В курсе рассматриваются темы, востребованные в промышленном программировании на языке C++. Разбираются вопросы, связанные с обобщенным программированием, интеллектуальными указателями, исключениями, паттернами проектирования, тестированием и отладкой кода, и др. Отдельно разбираются возможности современного языка С++, введенные в стандартах C++11/14/17: вывод типов, семантика перемещения, rvalue-ссылки, поддержка многопоточности, лямбда-выражения и др.  
----
+
'''Внимание!'''
+
 
+
Просьба студентам, которые собираются сдавать курс в качестве спецкурса, сообщить об этом '''до 15 декабря''' в произвольной форме по e-mail vkonovodov@gmail.com, указав ФИО и номер группы.
+
 
+
----
+
 
+
 
+
В курсе рассматриваются темы, востребованные в промышленном программировании на языке C++. Разбираются вопросы, связанные с обобщенным программированием, интеллектуальными указателями, исключениями, паттернами проектирования и др. Отдельно разбираются возможности современного языка С++, введенные в стандартах C++11/14: вывод типов, семантика перемещения, rvalue-ссылки, поддержка многопоточности, лямбда-выражения и др.  
+
  
 
В задачи курса входят актуализация студентами знаний языка С++ и ознакомление с современными принципами проектирования больших систем с использованием языка C++.  
 
В задачи курса входят актуализация студентами знаний языка С++ и ознакомление с современными принципами проектирования больших систем с использованием языка C++.  
 
На занятиях предполагается разбор примеров использования конструкций языка и применения рассматриваемых методов проектирования, а также проведение промежуточных небольших тестов-контрольных.
 
На занятиях предполагается разбор примеров использования конструкций языка и применения рассматриваемых методов проектирования, а также проведение промежуточных небольших тестов-контрольных.
  
 +
'''Таблица результатов''' (задачи, тесты на занятиях и т.п.) доступна по [https://goo.gl/Br2zAd ссылке].
  
== Содержание курса ==
+
==Задания по курсу==
 +
===Задание 1===
 +
Срок сдачи задания: 31 октября 2018 г. 23:59.
 +
* [[Media:Pbscpp_problem1_2018.pdf|Условие]].
 +
* [https://github.com/konovodov/cmc_msu_cpp_course/tree/master/problem1 Ссылка на код].
  
'''Занятие 1.''' Вводный тест. Вывод типов шаблонов и auto. Ключевое слово decltype. Инициализация с фигурными скобками.
+
===Задание 2===
 +
Срок сдачи задания: 25 ноября 2018 г. 23:59.
 +
* [[Media:Pbscpp_problem2_2018.pdf|Условие]].
  
'''[[Media: Lection_pbscpp_2.pdf|Занятие 2]].'''  Ключевые слова override и final. Удаленные функции. Псевдонимы. Перечисления с областью видимости. Объекты и функции constexpr.
+
===Задание 3===
 +
Срок сдачи задания: 30 декабря 2018 г. 23:59.
  
'''[[Media: Lection_pbscpp_3.pdf|Занятие 3]].'''  Лямбда-выражения, функторы и связыватели.
+
Тем, кто сдает зачет по курсу, нужно прислать решение до 25 декабря 2018г.
 +
* [[Media:Pbscpp_problem3_2018.pdf|Условие]].
  
'''Занятие 4.''' Семантика перемещения, std::move, перемещающие конструкторы и операторы перемещения, типы ссылок.
+
== Содержание курса ==
 
+
'''Занятие 1.''' Вводный тест. Особенности языка C++11. Вывод типов. Ключевые слова decltype и auto.
'''[[Media: Lection_pbscpp_4.pdf|Занятие 5]].'''  Универсальные ссылки, прямая передача, свертка ссылок, return value optimization, проблемы перегрузки.
+
  
'''[[Media: Lection_pbscpp_6.pdf|Занятие 6]].''' Операторы new, delete и аллокаторы. Умные указатели. std::unique_ptr.
+
'''Занятие 2.''' Ключевые слова override и final. Удаленные функции. Псевдонимы. Перечисления с областью видимости. Объекты и функции constexpr.
  
'''[[Media: Lection_pbscpp_7.pdf|Занятие 7]].'''   Указатели std::shared_ptr, std::weak_ptr, особенности использования make_shared.
+
* [[Media: Pbscpp_task_2018_2.pdf|Задачи к занятию 2]]. ''[c 29.09 решения задач больше не принимаются]''
 +
* [[Media: Lection_pbscpp_1_2_2018.pdf|Лекция 1-2]].
  
'''[[Media: Lection_pbscpp_8.pdf|Занятие 8]].''' Идиомы CRTP, PIMPL. Примеры паттернов проектирования: Bridge, Command.
+
'''Занятие 3.''' Функции constexpr, variadic templates, std::tuple, лямбда-выражения, функторы.
  
'''[[Media: Lection_pbscpp_9.pdf|Занятие 9]].''' Паттерны Singleton, Strategy, Decorator, Observer.
+
* [[Media: Pbscpp_task_2018_3.pdf|Задачи к занятию 3]]. ''[c 28.09 решение задачи больше не принимается]''
 +
* [[Media: Lection_pbscpp_3_2018_part1.pdf ‎|Лекция 3]].
  
'''[[Media: Lection_pbscpp_10.pdf|Занятие 10]].'''  Создание объектов с помощью фабрик. Паттерн Visitor. Шаблонное метапрограммирование, std::enable_if, решение проблемы перегрузки и универсальных ссылок.
+
'''Занятие 4.''' Связыватели. move-семантика.
 +
* [[Media: Pbscpp_task_2018_4.pdf|Задачи к занятию 4]]. ''[с 05.10 решение задачи больше не принимается]''
  
'''[[Media: Lection_pbscpp_11.pdf|Занятие 11]].'''  Метапрограммирование с шаблонами и X-macro. Идиома Type Erasure.
+
'''Занятие 5.''' Типы ссылок. Прямая передача. Проблемы перегрузки универсальных ссылок. Перемещающие операции.
 +
* [[Media: Lection_pbscpp_4_2018.pdf |Лекция 5]].
  
'''[[Media: Lection_pbscpp_12.pdf|Занятие 12]].'''  Обработка ошибок.
+
'''Занятие 6.''' Выделение и распределение памяти. Умные указатели unique_ptr и shared_ptr.
 +
* [[Media: Lection_pbscpp_6_2018.pdf |Лекция 6]].
 +
* [[Media: Pbscpp_task_2018_6.pdf|Задачи к занятию 6]].  ''[с 19.10 решение задачи больше не принимается]''
  
'''[[Media: Lection_pbscpp_13.pdf|Занятие 13]].'''  Введение в многопоточность. Примитивы синхронизации.
+
'''Занятие 7.''' Указатель weak_ptr. enable_shared_from_this как пример CRTP. Идиома PImpl. Паттерн проектирования Bridge.
 +
* [[Media: Lection_pbscpp_7_2018.pdf |Лекция 7]].
 +
* [[Media: Pbscpp_task_2018_7.pdf|Задачи к занятию 7]].  ''[с 01.11 решение задачи больше не принимается]''
  
== Задачи ==
+
'''Занятие 8.''' Паттерны проектирования Command, Singleton, Strategy, Decorator, Observer, Abstract factory.
'''[[Media: Pbscpp_tasks.pdf|Условия задач]]''' (список обновляется).
+
* [[Media: Lection_pbscpp_8_2018.pdf |Лекция 8]].
  
== Об экзамене ==
+
'''Занятие 9.''' Паттерн Visitor. Идиома Type Erasure. Правило SFINAE. Диспетчеризация дескрипторов.
Экзамен по курсу письменный. Критерии оценки и примерный вариант экзаменационной работы будут опубликованы позднее. Присланные правильные решения задач из списка выше дают дополнительные бонусы при сдаче экзамена.
+
* [[Media: Lection_pbscpp_9_2018.pdf ‎|Лекция 9]].
 +
* [[Media: Pbscpp_task_2018_9.pdf|Задачи к занятию 9]]. ''[с 08.11 решение задачи больше не принимается]''
  
== Предварительный план ==
+
'''Занятие 10.''' Шаблонное метапрограммирование. X-macro. Исключения. ValueOrException.
1. Обзор основных особенностей C++11:
+
* [[Media: Lection_pbscpp_10_2018.pdf ‎|Лекция 10]].
* выводы типов, auto, decltype, вывод возвращаемого значения
+
* ranged-based циклы, инициализация с фигурными скобками, override, final, scoped enums, static_assert
+
* lambda-выражения, функторы, связыватели и адаптеры
+
2. Семантика перемещения
+
* типы ссылок и rvalue
+
* std::move, std::forward и их применение
+
3. Умные указатели
+
* перегрузка операторов new, delete, аллокаторы.
+
* необходимость умных указателей и недостатки "голых указателей"
+
* uniq_ptr и исключительное владение
+
* shared_ptr и совместное владение, weak_ptr
+
* идеи intrusive_ptr и других указателей
+
* самостоятельная реализация shared_ptr
+
4. Паттерны проектирования
+
* идиома PImpl, паттерн Bridge
+
* паттерн Singleton
+
* паттерн Fabric Method
+
* паттерн Visitor и двойная диспетчеризация
+
* задача с самостоятельной реализацией
+
  
5. Метапрограммирование
+
'''Занятие 11.''' Гарантии безопасности исключений и noexcept. Основные подходы к тестированию систем. Unit-тесты через google testing framework.
* шаблонное программирование
+
* [[Media: Lection_pbscpp_11_2018.pdf ‎|Лекция 11]].
* метапрограммирование с макросами, x_macro
+
* самостоятельное решение задач
+
* реализация списка типов и использование в фабриках
+
  
6. Обработка исключений. Гарантии безопасности исключений. Задача на класс исключений.
+
'''Занятие 12.''' Mock-объекты в тестировании и gmock. Отладка кода. Инструменты strace и gdb.
 +
* [[Media: Lection_pbscpp_12_2018.pdf ‎|Лекция 12]].
 +
* [https://github.com/konovodov/cmc_msu_cpp_course/tree/master/testing Ссылка на код про тесты с занятия].
  
7. Параллелизм и многопоточность.  
+
'''Занятие 13.''' Многопоточное программирование с использованием std::thread. Примитивы синхронизации. Потокобезопасность.  
* Data race и deadlock
+
* [[Media: Lection_pbscpp_13_2018.pdf ‎|Лекция 13]].
* Способы синхронизации: mutex, atomic variable, condition variable, spin lock
+
  
 +
== Программа курса ==
 +
[[Media: Pbscpp_content2018.pdf|Программа курса (pdf)]]
  
 
== Литература ==
 
== Литература ==
Строка 95: Строка 85:
 
* Б. Страуструп, Язык программирования С++, 4-е издание.
 
* Б. Страуструп, Язык программирования С++, 4-е издание.
 
* Б. Страуструп, Программирование. Принципы и практика использования C++.
 
* Б. Страуструп, Программирование. Принципы и практика использования C++.
* Б. Страуструп, Дизайн и эволюция языка С++.
+
* Курт Гантерот: Оптимизация программ на C++. Проверенные методы повышения производительности.
* D. Abrahams, A. Gurtovoy C++ Template Metaprogramming.
+
* Вандевурд Д., Джосаттис Н. Шаблоны C++. Справочник разработчика.
  
  
 
[[Категория:Лекционные курсы кафедры МК]]
 
[[Категория:Лекционные курсы кафедры МК]]
 
[[Категория:Магистерская программа Дискретные управляющие системы и их приложения]]
 
[[Категория:Магистерская программа Дискретные управляющие системы и их приложения]]

Версия 00:03, 9 декабря 2018

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

Занятия в осеннем семестре 2018 г. завершены.

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

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

Таблица результатов (задачи, тесты на занятиях и т.п.) доступна по ссылке.

Задания по курсу

Задание 1

Срок сдачи задания: 31 октября 2018 г. 23:59.

Задание 2

Срок сдачи задания: 25 ноября 2018 г. 23:59.

Задание 3

Срок сдачи задания: 30 декабря 2018 г. 23:59.

Тем, кто сдает зачет по курсу, нужно прислать решение до 25 декабря 2018г.

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

Занятие 1. Вводный тест. Особенности языка C++11. Вывод типов. Ключевые слова decltype и auto.

Занятие 2. Ключевые слова override и final. Удаленные функции. Псевдонимы. Перечисления с областью видимости. Объекты и функции constexpr.

Занятие 3. Функции constexpr, variadic templates, std::tuple, лямбда-выражения, функторы.

Занятие 4. Связыватели. move-семантика.

Занятие 5. Типы ссылок. Прямая передача. Проблемы перегрузки универсальных ссылок. Перемещающие операции.

Занятие 6. Выделение и распределение памяти. Умные указатели unique_ptr и shared_ptr.

Занятие 7. Указатель weak_ptr. enable_shared_from_this как пример CRTP. Идиома PImpl. Паттерн проектирования Bridge.

Занятие 8. Паттерны проектирования Command, Singleton, Strategy, Decorator, Observer, Abstract factory.

Занятие 9. Паттерн Visitor. Идиома Type Erasure. Правило SFINAE. Диспетчеризация дескрипторов.

Занятие 10. Шаблонное метапрограммирование. X-macro. Исключения. ValueOrException.

Занятие 11. Гарантии безопасности исключений и noexcept. Основные подходы к тестированию систем. Unit-тесты через google testing framework.

Занятие 12. Mock-объекты в тестировании и gmock. Отладка кода. Инструменты strace и gdb.

Занятие 13. Многопоточное программирование с использованием std::thread. Примитивы синхронизации. Потокобезопасность.

Программа курса

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

Литература

  • С. Мейерс, Эффективный и современный С++: 42 рекомендации по использованию C++11 и C++14, изд. Вильямс, М.: 2017 г.
  • Anthony Williams. C++ Concurrency in Action: Practical Multithreading.
  • А. Александреску, Современное проектирование на C++, изд. Вильямс, М.: 2017 г.
  • Э.Гамма, Р.Хелм, Р.Джонсон, Дж. Влиссидес, Приемы объектно-ориентированного проектирования.
  • Г. Саттер, А. Александреску, Стандарты программирования на С++. 101 правило и рекомендация.
  • Б. Страуструп, Язык программирования С++, 4-е издание.
  • Б. Страуструп, Программирование. Принципы и практика использования C++.
  • Курт Гантерот: Оптимизация программ на C++. Проверенные методы повышения производительности.
  • Вандевурд Д., Джосаттис Н. Шаблоны C++. Справочник разработчика.