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

Материал из Кафедра математической кибернетики
Перейти к: навигация, поиск
(Информация к экзамену)
(Содержание курса)
(не показаны 43 промежуточных версий 1 участника)
Строка 1: Строка 1:
 
{{DISPLAYTITLE:Проектирование больших систем на С++}}
 
{{DISPLAYTITLE:Проектирование больших систем на С++}}
 
== Информация к экзамену ==
 
Экзамен состоится:
 
* 26 декабря 2020 г. в 13:00 для любой группы
 
* 12 января 2021 г. в 9:00 для '''421''' группы
 
* 15 января 2021 г. в 9:00 для '''518/2''' группы
 
 
Слушателям, сдающим курс в качестве спецкурса по выбору, можно сдавать в любую дату. Студентам из 421 и 518/2 групп для сдачи в день, отличный от назначенного по расписанию, необходимо заранее сообщить о таком намерении.
 
 
'''Внимание!''' Для записи на экзамен 12 января НЕОБХОДИМО заполнить форму по ссылке https://lomonosov-msu.ru/rus/event/request/dashboard/6349 (отправить форму, перейдя в "Запись на экзамен 12 января" по ссылке "Заполнить" и нажав "отправить"). Форму можно заполнить в любое время до начала экзамена. Отменить запись невозможно. Студентам группы 421 заполнять эту форму НЕ нужно.
 
 
Для записи на экзамен 15 января ничего специального делать не нужно.
 
 
Максимальная сумма баллов за экзаменационный тест – 50. Баллы, полученные за выполнение необязательных домашних задач и тестов на занятиях, суммируются с баллами, полученными за экзамен.
 
 
* Оценка '''отлично''': не менее 40 баллов
 
* Оценка '''хорошо''': не менее 30 и не более 39 баллов
 
* Оценка '''удовлетворительно''': не менее 20 и не более 29 баллов
 
* Для получения зачета достаточно набрать количество баллов для оценки "удовлетворительно".
 
 
Экзамен будет проходить в форме электронного теста, ссылка на тест будет доступна в разделе [https://lomonosov-msu.ru/rus/user/event-request/list "Мои заявки"]. Экзаменационный тест состоит из 15-16 вопросов, время на выполнение – 40 минут. Ответ на каждый вопрос – выбор одного из вариантов, либо в виде числа, либо в виде текста. Код писать не нужно. Тест будет открыт для зарегистрированных (по форме выше) участников с 09:00 до 09:45. В 09:45 все результаты будут собраны. Результаты будут размещены в общей таблице в течение часа после окончания теста.
 
 
'''Внимание!''' При переключении вкладки браузера с экзаменом таймер может отставать от реальных значений. Просьба следить за физическим временем!
 
 
Во время экзаменационного теста задать вопросы можно на zoom-конференции по той же ссылке, что и лекционная.
 
 
== Общая информация ==
 
 
Курс по магистерской программе Дискретные управляющие системы и их приложения. Занятия проводит [[Участник:KonovodovV|Коноводов В.А.]]
 
Курс по магистерской программе Дискретные управляющие системы и их приложения. Занятия проводит [[Участник:KonovodovV|Коноводов В.А.]]
  
Строка 36: Строка 9:
 
[[Media: Pbscpp_content2020.pdf|Программа курса 2020(pdf)]]
 
[[Media: Pbscpp_content2020.pdf|Программа курса 2020(pdf)]]
  
== Занятия в 2020г ==
+
== Занятия в 2021 г ==
* Занятия в осеннем семестре 2020 г. завершены.
+
* Занятия проходят по пятницам, 8:45, ауд. '''503'''
* Для прохождения дистанционных тестов и сдачи экзамена необходимо подать заявку на курс https://lomonosov-msu.ru/rus/event/6349/, зарегестрировавшись на сайте при отсутствии учетной записи
+
* Таблица результатов [https://docs.google.com/spreadsheets/d/1NhMc0ffoNr7jjKCTi9ZPJMml5fYOwQdt5lBzljSadXA здесь]
* Видео-записи лекций [https://yadi.sk/d/EEvF2IzHUlYMiQ здесь]
+
* Таблица результатов [https://clck.ru/QpapD здесь]
+
  
 
== Содержание курса ==
 
== Содержание курса ==
'''Занятие 1.'''  Особенности языка C++11. Вывод типов. Ключевые слова decltype и auto. Ключевые слова override и final.
+
'''Занятие 1.'''  Вводный тест. Вывод типов шаблонов и auto.
* [[Media: Lecture_pbscpp_1_2020.pdf|Лекция 1]].
+
 
+
'''Занятие 2.'''  Удаленные функции. Псевдонимы. Scoped enums. Constexpr-выражения и объекты. Шаблоны с переменным числом аргументов. lambda-выражения.
+
* [[Media: Lecture_pbscpp_2_2020.pdf|Лекция 2]].
+
* [https://yadi.sk/i/eTdJ1VNwsZJ4nA Задача 1]. (Больше не принимается)
+
  
'''Занятие 3.'''  Особенности lambda-функций. Неупорядоченные контейнеры hashmap/hashset. Функторы и связыватели. std::bind, std::invoke, std::apply.
+
'''Занятие 2.'''  Модификаторы функций, псевдонимы, scoped enums. Constexpr-выражения и объекты. Шаблоны с переменным числом аргументов.  
* [[Media: Lecture_pbscpp_3_2020.pdf|Лекция 3]].
+
* [https://disk.yandex.ru/i/lgBsbtnWE9UWUQ Лекции 1-2]
* Доп.задача про UB при захвате this. (Больше не принимается)
+
* [https://disk.yandex.ru/i/kptqwBuoFjWEyw Задачи] (больше не принимаются)
  
'''Занятие 4.'''  Указатели на методы внутри класса. Move-семантика и типы ссылок.
+
'''Занятие 3.'''  Структурное связывание. Особенности lambda-функций.  
* [[Media: Lecture_pbscpp_4_2020.pdf|Лекция 4]].
+
* [https://disk.yandex.ru/i/2MEhQT3-HolVJw Лекция 3]
  
'''Занятие 5.'''  Свертывание ссылок. Универсальные ссылки и проблема их перегрузки. Идеальная передача. Генерация компилятором перемещающих операций.  
+
'''Занятие 4.'''  Неупорядоченный контейнеры и std::hash. Методы вызова функций и связывания аргументов. Move-семантика.
* [[Media: Lecture_pbscpp_5_2020.pdf|Лекция 5]].
+
* [https://disk.yandex.ru/i/9qmoM72AarHlnQ Лекция 4]
* [https://yadi.sk/i/L6FP82WCj5VmEw Задачи]. (Больше не принимаются)
+
* [https://disk.yandex.ru/i/NrYk6X4lsKvxAQ Задачи] (больше не принимаются)
  
'''Занятие 6.'''  Операторы new и delete, их перегрузка. Умные указатели.
+
'''Занятие 5.'''  Типы ссылок. std::move и std::forward. Универсальные ссылки. Свёртывание ссылок.
* [[Media: Lecture_pbscpp_6_2020.pdf|Лекция 6]].
+
* [https://disk.yandex.ru/i/fuDaAiUtND72WA Лекция 5]
* [https://yadi.sk/i/3ui6cNkvsQ-7YQ Задача]. (Больше не принимается)
+
* Заметка про happy path: [https://medium.com/@matryer/line-of-sight-in-code-186dd7cdea88 link]
  
'''Занятие 7.''' Владение памятью. Дополнение про умные указатели.
+
'''Занятие 6.''' Проблемы универсальных ссылок. Автоматическая генерация перемещающих операций. Операторы new и delete, перегрузка. Умные указатели.
* [[Media: lec7pbs.pdf|Лекция 7]]
+
* [https://disk.yandex.ru/i/nGH9kePj3BvmYw Лекция 6]
* [https://yadi.sk/i/2q9G29DFmwtVzg Задача]. (Больше не принимается)
+
  
'''Занятие 8.''' Идиомы CRTP и PImpl. Паттерны Bridge и Command.
+
'''Занятие 7.''' Указатели unique_ptr, shared_ptr, weak_ptr.
* [[Media: Lecture_pbscpp_8_2020.pdf|Лекция 8]]
+
* [https://disk.yandex.ru/i/DZfUtRgBngAbPg Лекция 7]
 +
* [https://disk.yandex.ru/i/EyQySGRedNa6ZQ Задача] (больше не принимается)
  
'''Занятие 9.''' Паттерны Singleton, Strategy, Decorator, Observer. Создание объектов с помощью фабрик.
+
'''Занятие 8.''' [дистанционно] Владение памятью. Идиома CRTP.
* [[Media: Lecture_pbscpp_9_2020.pdf|Лекция 9]]
+
* [https://disk.yandex.ru/i/W6RbKwX-gp0jLg Лекция 8]
 +
* [https://disk.yandex.ru/d/Q3i7dMvuQqRKdQ Запись лекции]
 +
* [https://disk.yandex.ru/i/wtQ45daIdVrZIQ Задача] и [https://github.com/konovodov/-cmc_msu_cpp_course2021/tree/main код] к ней. (больше не принимается)
  
'''Занятие 10.''' Паттерн Visitor. Идиома Type Erasure. Правило SFINAE и диспетчеризация дескрипторов.
+
'''Занятие 9.''' Идиома PImpl. Паттерны проектирования. Bridge, Command.
* [[Media: Lecture_pbscpp_10_2020.pdf|Лекция 10]]
+
* [https://disk.yandex.ru/i/UVSI7wcsWiIA1Q Лекция 9]
* [https://yadi.sk/i/HIelFsMSWhXVog Задачи]. (Больше не принимаются)
+
  
'''Занятие 11.''' Тестирование кода. Unit-тесты и библиотека gtest/gmock. Отладка кода и strace.
+
'''Занятие 10.''' Паттерны Singleton, Strategy, Decorator, Observer. Создание объектов с помощью фабрик.
* [[Media: Lecture_pbscpp_11_2020.pdf|Лекция 11]]
+
* [https://disk.yandex.ru/i/MqMsJjt0Miw0kA Лекция 10]
 +
* [https://disk.yandex.ru/i/yVZZGz3WoAOtRA Задача] (больше не принимается)
  
'''Занятие 12.''' Отладочные макроопределения, asserts. Обработка исключений. Гарантии безопасности исключений. ValueOrException. Неопределенное поведение.
+
'''Занятие 11.''' Переопределение аллокаторов. Паттерн Visitor и двойная диспетчеризация. Идиома TypeErasure.
* [[Media: Lecture_pbscpp_12_2020.pdf|Лекция 12]]
+
* [https://disk.yandex.ru/i/E06phqCiiwmYNQ Лекция 11]
  
'''Занятие 13.''' Оптимизация программ на C++.  
+
'''Занятие 12.''' SFINAE. Элементы метапрограммирования. Обработка ошибок и исключения.
* [[Media: Lecture_pbscpp_13_2020.pdf|Лекция 13]]
+
* [https://disk.yandex.ru/i/y_mA_hIQJv1yCA Лекция 12]
* [https://yadi.sk/i/ccDtj0NiB7wkBQ Задача]. (Больше не принимается)
+
* Про template disambiguator: [https://en.cppreference.com/w/cpp/language/dependent_name link]
 +
* [https://disk.yandex.ru/i/JI5wxlkqVn6Mag Задачи]
  
 
== Литература ==
 
== Литература ==

Версия 12:55, 5 декабря 2021

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

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

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

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

Занятия в 2021 г

  • Занятия проходят по пятницам, 8:45, ауд. 503
  • Таблица результатов здесь

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

Занятие 1. Вводный тест. Вывод типов шаблонов и auto.

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

Занятие 3. Структурное связывание. Особенности lambda-функций.

Занятие 4. Неупорядоченный контейнеры и std::hash. Методы вызова функций и связывания аргументов. Move-семантика.

Занятие 5. Типы ссылок. std::move и std::forward. Универсальные ссылки. Свёртывание ссылок.

Занятие 6. Проблемы универсальных ссылок. Автоматическая генерация перемещающих операций. Операторы new и delete, перегрузка. Умные указатели.

Занятие 7. Указатели unique_ptr, shared_ptr, weak_ptr.

Занятие 8. [дистанционно] Владение памятью. Идиома CRTP.

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

Занятие 10. Паттерны Singleton, Strategy, Decorator, Observer. Создание объектов с помощью фабрик.

Занятие 11. Переопределение аллокаторов. Паттерн Visitor и двойная диспетчеризация. Идиома TypeErasure.

Занятие 12. SFINAE. Элементы метапрограммирования. Обработка ошибок и исключения.

Литература

Основная

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

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

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