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

Материал из Кафедра математической кибернетики
Перейти к: навигация, поиск
 
(не показаны 479 промежуточные версии 4 участников)
Строка 1: Строка 1:
Курс по магистерской программе Дискретные управляющие системы и их приложения.
+
[[Категория:Спецкурсы кафедры МК]]
 +
[[Категория:Лекционные курсы кафедры МК]]
 +
[[Категория:Магистерская программа Дискретные управляющие системы и их приложения]]
  
Чтение курса обеспечивается кафедрой математической кибернетики, лектор — к.т.н. Мелик-Адамян Арег Фрикович (areg@cs.msu.ru).
+
Занятия проводятся по вторникам шестой парой (в 18:00) '''ДИСТАНЦИОННО''', ссылка на видеоконференцию публикуется в [https://t.me/+OlbcW8JHJMdjOGZi чате в Telegram]
  
Рассматриваются вопросы, которые обычно остаются за рамками академических курсов по программированию на С++, но очень востребованы в промышленном программировании. Разбираются  вопросы связанные с обобщенным программированием, шаблонами, перегрузкой, исключениями, множественным наследованием и стандартной библиотекой шаблонов. Отдельно разбираются новые возможности появившиеся в стандарте языка С++ 11 (C++11 Programming Language Standard ISO/IEC 14882:2011 ): семантика переноса и ссылки на временные объекты, внешние шаблоны, списки инициализации, поддержка многопоточности, лямбда выражения и др. Даются примеры использования из реальных САПР во время занятий.
+
Курс по магистерской программе Дискретные управляющие системы и их приложения. Занятия проводит [[Участник:ZhukovVV|Владимир Владимирович Жуков.]]
  
Цель курса — научить приемам и навыкам промышленного программирования и прогаммной инженерии с помощью совереммного языка С++.
+
В курсе рассматриваются темы, востребованные в промышленном программировании на языке C++. Разбираются вопросы, связанные с метапрограммированием, умными указателями, исключениями, паттернами проектирования, тестированием, отладкой кода и др. Отдельно разбираются возможности современного языка С++, введенные в стандартах C++11/14/17/20: вывод типов, семантика перемещения, rvalue-ссылки, поддержка многопоточности, лямбда-выражения и др.  
  
Задачи курса:
+
В задачи курса входят актуализация студентами знаний языка С++ и ознакомление с современными принципами проектирования больших систем с использованием языка C++.  
* актуализировать знание языка С++;
+
* способствовать пониманию студентами принципов и возможностей языка С++ для построения промышленных систем;
+
* ознакомить с технологией построения больших систем с использованием языка С++ на примере программирования современных САПР микроэлектроники.
+
  
Изучение курса основывается на знаниях, полученных студентами при изучении языков программирования ранее, а также приобретенных знаний на спец. курсах уроках по САПР и технологиям программирования.
+
На занятиях предполагается разбор примеров использования конструкций языка и применения рассматриваемых методов проектирования, а также проведение промежуточных небольших тестов-контрольных.
  
Представлено значительное число практических работ. Последовательность изучения материала также способствует облегчению понимания разделов связанных с технологиями программирования и интеграции курса с другими предметами, такими как технологии САПР. В программе уделяется очень большое внимание решению прикладных задач с помощью С++.
+
[[Media: Pbscpp.pdf|Программа курса (pdf)]]
 +
 
 +
== Занятия в 2025 г. ==
 +
 
 +
* [https://docs.google.com/spreadsheets/d/1qxbn-J2YLaPhsL-msDzq8Od13aR1j1lp_JGvFNtwnmk/edit?usp=sharing Таблица результатов]
 +
* [https://t.me/+OlbcW8JHJMdjOGZi Чат в Telegram]
 +
* Первое занятие состоится 2 сентября в 18:00 в ауд. 504.
 +
* Следующие задания проводятся дистанционно.
 +
* Досрочный экзамен: DD.12.2024 HH:MM (ауд. N1)
 +
* Основной экзамен: DD.01.2025 HH:MM (ауд. N2)
 +
 
 +
== Экзамен ==
 +
Экзамен по курсу письменный. Максимальная сумма баллов за экзаменационную работу – 54.
 +
 
 +
* Оценка '''отлично''': не менее 40 баллов
 +
* Оценка '''хорошо''': не менее 30 и не более 39 баллов
 +
* Оценка '''удовлетворительно''': не менее 20 и не более 29 баллов
 +
 
 +
[[Media: Pbs_exam_example_2024.pdf|Пример экзаменационного варианта (pdf)]]
  
 
== Содержание курса ==
 
== Содержание курса ==
'''Занятиe 1.''' Обзор основных возможностей С++ 14. Структура компилятора, структура компоновщка. Система хранения исходных кодов. Примеры.
+
'''Занятие 1.''' Введение. Организационные вопросы. Вводный тест. Стиль кодирования.
 +
* [https://disk.yandex.ru/i/RS2x0iZmCY-NDQ Лекция 1]
 +
* [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]
 +
* Книги Скотта Мейерса на английском языке можно найти на [https://aovst.cs.msu.ru/ сайте практикума 318 группы]
 +
* TODO на 2026 год: добавить в слайды контент на 20 минут. Можно, например, про STL напомнить.
  
'''Занятиe 2.''' Шаблоны. Перегрузка функций. Шаблонные функции. Специализация шаблонных функций. Разрешение конфликтов во время специализации. Классы шаблоны. Инстанциация классов-шаблонов. Правила для классов-шаблонов. Не функции-члены с шаблонными аргументами.
+
'''Занятие 2.''' Категории выражений в C++. Вывод типов параметров шаблонов и auto. Некоторые особенности C++11 (универсальная инициализация, константные выражения, шаблоны с переменным числом аргументов и др.).
 +
* [https://disk.yandex.ru/i/7-DPnwcUrkONYA Лекция 2]
 +
* [https://disk.yandex.ru/d/L19s661Y8JrTyA Задание 1] (результаты см. в таблице успеваемости в отдельной вкладке)
  
'''Занятиe 3.''' Списки инициализации для членов класса. Списки инициализации во время простого наследования, множественного наследования, множественного наследования и композиции. Operator=, конструкторы и композиция. Публичное наследование. Виртуальные функции. Полиморфизм. Чистые виртуальные функции и абстрактные классы. Закрытое наследование, ассоциации.
+
'''Занятие 3.''' Функциональное программирование в C++. Хеш-таблицы. Новые возможности C++17 (инициализация в условных выражениях, std::optional, std::string_view).
 +
* [https://disk.yandex.ru/i/i3EFnpjuyybS6w Лекция 3]
 +
* [https://disk.yandex.ru/i/_p8FUMICX1XnwQ Запись лекции]
  
'''Занятиe 4.''' Множественное наследование. Неопределенности при множественном наследовании. Виртуальный базовый класс. Правило доминирования. Список инициализации членов класса. Простой список. Шаблонный список. Итераторы. Шаблонные итераторы. Шаблоны и наследование.
+
'''Занятие 4.''' Семантика перемещения в C++.
 +
* [https://disk.yandex.ru/i/fC2fUMpHDZ6IOA Лекция 4]
 +
* [https://disk.yandex.ru/i/hflbAyVsoTVwBA Запись лекции]
 +
* TODO на 2026 год: устранить повторения информации в лекциях 2-4. Скукота получается, если одно и то же повторяется. Как будто лекции Машечкина какие-то.
  
'''Занятиe 5.''' Указатели на функции. Передача функций в качестве параметров. Указатели функций в С++. Функции обратного вызова. Функторы в STL. Bind. Boost::function и Boost::bind. Пример класса Cell.
+
'''Занятие 5.''' Операторы new и delete. Умные указатели. Управление владением памяти.
 +
* [https://disk.yandex.ru/i/VIoQHePuAQd7ow Лекция 5]
 +
* [https://disk.yandex.ru/d/eFyL3Xl08USEAg Запись лекции]
  
'''Занятиe 6.''' Исключения. Традиционные подходы к обработке ошибок. try, catch и throw. Множественные блоки catch. Список спецификации исключений. Повторный вызов исключений (rethrow). Очистка. Сопоставление исключений. Аллокация ресурсов. Конструкторы, десктрукторы и исключения. Стандартные исключения.
+
'''Занятие 6.''' Идиомы в C++. Идиома CRTP. Шаблон std::enable_shared_from_this. Умный указатель boost::intrusive_ptr. Идиома PImpl. Идиома Type Erasure.
 +
* [https://disk.yandex.ru/i/AVYcaBknBY2qMA Лекция 6]
 +
* [https://disk.yandex.ru/i/RGy1wEp6qVfICg Запись лекции]
 +
* TODO на 2026 год: добавить хрона на 20 минут
  
'''Занятиe 7.''' Стандартная библиотека шаблонов – STL. Принцип проектирования. Обобщенное программирование. Компоненты STL: алгоритмы, итераторы, контейнеры, функционалы. Адапторы. Примеры использования.  
+
'''Занятие 7.''' Паттерны проектирования в C++. Паттерны проектирования Bridge, Command, Singleton, Strategy, Decorator.
 +
* [https://disk.yandex.ru/i/KoXyTFzqz1COlQ Лекция 7]
 +
* [https://disk.yandex.ru/i/XjJStMwlxdIkkQ Запись лекции]
 +
* [https://mks2.cs.msu.ru/root/pbs_task_2_2025 Задание 2]
 +
* TODO на 2026 год: реструктурировать презентации: сначала порождающие паттерны, потом структурные и поведенческие
  
'''Занятиe 8.''' Ввод/вывод. Манипуляторы. Перегрузка операторов ввода/вывода. Файлы. Чтение и запись объектов. Обработка потоков внутри конструкторов и деструкторов.  Примеры.
+
'''Занятие 8.''' Паттерны проектирования Observer, Factory Method, Abstract Factory, Visitor, Adapter, Facade, Proxy, Builder
 +
* [https://disk.yandex.ru/i/2t-AOTkblnoIUA Лекция 8]
 +
* [https://disk.yandex.ru/d/29jv8mY0b9pgbg Запись лекции]
  
'''Занятиe 9.''' Эволюция языка. C++11. Зачем был нужен новый стандарт? Изменения в ядре языка: семантика переноса и ссылки на временные объекты. Внешние шаблоны. Списки инициализации. Циклы в диапазоне. Лямбда-выражения. Альтернативный синтаксис функций. Явная перегрузка и final. Вариадические шаблоны. Новые литералы. Поддержка многопоточности. Статический утверждения. Обновление STL. Возможности, которые не вошли в новый стандарт. Устаревшие и удаленные возможности.  
+
'''Занятие 9.''' Паттерны проектирования Composite, Template Method, Chain of Responsibility, Prototype, State, Flyweight, Interpreter, Mediator, Memento
 +
* [https://disk.yandex.ru/i/UJy3YqRQctV0xw Лекция 9]
  
'''Занятиe 9.''' Шаблоны программирования. Обобщенное программирование. Применение.
+
== Старое (ну типа лекции-дедульки, по мере добавления свежего контента буду делать им Press F) ==
 +
'''Занятие 9 (2024).''' Идиома TypeErasure. Решение проблем перегрузки универсальных ссылок. Диспетчеризация дескрипторов. Правило SFINAE.
 +
* [https://disk.yandex.ru/i/6Ggf49W6ABX9Ag Лекция 9 (deprecated)]
  
'''Занятиe 10.''' Учебный пример проектирования и программирования системы физического проектирования микроэелктроники. Разбор входного формата. Внутреннее представление. Алгоритмы. Вывод.
+
'''Занятие 10 (2024).''' Обработка исключений. Гарантии безопасности исключений. Неопределенное поведение.
 +
* [https://disk.yandex.ru/i/A0z1X7NJZLPNFQ Лекция 10 (deprecated)]
  
'''Занятия 11, 12.''' Практические занятия с примерами в аудитории. Желательно иметь ноутбук с собой.
+
'''Занятие 11 (2024).''' Тестирование кода, unit-тестирование, устранение зависимостей. Google C++ Testing Framework.
 +
* [https://disk.yandex.ru/i/VX2GqMOB9t76wA Лекция 11 (deprecated)]
 +
* [http://google.github.io/googletest/ Документация по googletest]
 +
 
 +
'''Занятие 12 (2024).''' Отладка и дебаг кода. Оптимизация программ на C++. Строки.
 +
* [https://disk.yandex.ru/i/gzYOfpC0JfJPJw Лекция 12 (deprecated)]
 +
 
 +
'''Занятие 13 (2024).''' Оптимизация алгоритмов, функций, памяти. Плотная упаковка полей. Бинарная сериализация данных. Protobuf.
 +
* [https://disk.yandex.ru/i/A39zehIlyOn3qg Лекция 13 (deprecated)]
 +
 
 +
'''Занятие 14 (2024).''' Новые стандарты языка C++20 и C++23. Корутины, концепты, ranges library.
 +
* [https://disk.yandex.ru/d/8efRlJsZ9ZFA2g Презентации докладов (deprecated)]
  
 
== Литература ==
 
== Литература ==
* ISO/IEC C++ Programming Language Standard 14482:2011.
+
===Основная===
 +
* С. Мейерс, Эффективный и современный С++: 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 правило и рекомендация.
 
* Г. Саттер, А. Александреску, Стандарты программирования на С++. 101 правило и рекомендация.
 
* Б. Страуструп, Язык программирования С++, 4-е издание.
 
* Б. Страуструп, Язык программирования С++, 4-е издание.
 
* Б. Страуструп, Программирование. Принципы и практика использования C++.
 
* Б. Страуструп, Программирование. Принципы и практика использования C++.
* Б. Страуструп, Дизайн и эволюция языка С++.
+
* Вандевурд Д., Джосаттис Н. Шаблоны C++. Справочник разработчика.
* J. Lakos, Large Scale Software Design in C++, Addison-Wesley, 1996.
+
* Курс [https://academy.yandex.ru/handbook/cpp Основы C++] от Академии Яндекса.
* A. Fox, D. Patterson, Engineering Software as a Service: An Agile Approach Using Cloud Computing, Addison-Wesley, 2013.
+
* [http://google.github.io/googletest/ Документация] по Google Test.
* D. Spinellis, G. Gousios, Beautiful Architecture: Leading Thinkers Reveal the Hidden Beauty in Software Design, O’Reilly Media, 2009.
+
* [https://developers.google.com/protocol-buffers/docs/overview?hl=en Документация] protobuf.
* N. Martz, J, Warren, Big Data:Principles and best practices of scalable realtime data systems, Manning, 2013.
+
* [https://github.com/catboost/catboost/blob/master/CPP_STYLE_GUIDE.md Yandex C++ Style Guide].
* J. L. Hennessy and D. A. Patterson, Computer Architecture: A Quantitative Approach, 5th Edition, Morgan Kaufmann Publishing Co., Menlo Park, CA. 2013.  
+
* [https://google.github.io/styleguide/cppguide.html Google C++ Style Guide].
 
+
 
+
[[Категория:Лекционные курсы кафедры МК]]
+
[[Категория:Магистерская программа Дискретные управляющие системы и их приложения]]
+

Текущая версия на 06:03, 26 октября 2025


Занятия проводятся по вторникам шестой парой (в 18:00) ДИСТАНЦИОННО, ссылка на видеоконференцию публикуется в чате в Telegram

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

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

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

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

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

Занятия в 2025 г.

  • Таблица результатов
  • Чат в Telegram
  • Первое занятие состоится 2 сентября в 18:00 в ауд. 504.
  • Следующие задания проводятся дистанционно.
  • Досрочный экзамен: DD.12.2024 HH:MM (ауд. N1)
  • Основной экзамен: DD.01.2025 HH:MM (ауд. N2)

Экзамен

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

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

Пример экзаменационного варианта (pdf)

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

Занятие 1. Введение. Организационные вопросы. Вводный тест. Стиль кодирования.

Занятие 2. Категории выражений в C++. Вывод типов параметров шаблонов и auto. Некоторые особенности C++11 (универсальная инициализация, константные выражения, шаблоны с переменным числом аргументов и др.).

Занятие 3. Функциональное программирование в C++. Хеш-таблицы. Новые возможности C++17 (инициализация в условных выражениях, std::optional, std::string_view).

Занятие 4. Семантика перемещения в C++.

  • Лекция 4
  • Запись лекции
  • TODO на 2026 год: устранить повторения информации в лекциях 2-4. Скукота получается, если одно и то же повторяется. Как будто лекции Машечкина какие-то.

Занятие 5. Операторы new и delete. Умные указатели. Управление владением памяти.

Занятие 6. Идиомы в C++. Идиома CRTP. Шаблон std::enable_shared_from_this. Умный указатель boost::intrusive_ptr. Идиома PImpl. Идиома Type Erasure.

Занятие 7. Паттерны проектирования в C++. Паттерны проектирования Bridge, Command, Singleton, Strategy, Decorator.

Занятие 8. Паттерны проектирования Observer, Factory Method, Abstract Factory, Visitor, Adapter, Facade, Proxy, Builder

Занятие 9. Паттерны проектирования Composite, Template Method, Chain of Responsibility, Prototype, State, Flyweight, Interpreter, Mediator, Memento

Старое (ну типа лекции-дедульки, по мере добавления свежего контента буду делать им Press F)

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

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

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

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

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

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

Литература

Основная

  • С. Мейерс, Эффективный и современный С++: 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.