• A
  • A
  • A
  • АБB
  • АБB
  • АБB
  • А
  • А
  • А
  • А
  • А
Обычная версия сайта
Бакалавриат 2021/2022

Язык программирования C++ (углубленный курс)

Лучший по критерию «Полезность курса для Вашей будущей карьеры»
Лучший по критерию «Новизна полученных знаний»
Направление: 01.03.02. Прикладная математика и информатика
Когда читается: 2-й курс, 1, 2 модуль
Формат изучения: без онлайн-курса
Охват аудитории: для своего кампуса
Преподаватели: Кот Михаил Евгеньевич, Кускаров Тагир Фаридович, Кутенин Данила Михайлович, Латышева Александра Владимировна, Скворцов Сергей Михайлович, Хасанова Алия Азатовна, Хорошанский Лев Александрович, Чулков Андрей Сергеевич
Язык: русский
Кредиты: 4

Программа дисциплины

Аннотация

Студенты на первом курсе изучали язык C++ с самых его основ - синтаксиса, постигали объектно ориентированное программирование и сдавали много тренирующих задач. Тем не менее, меньше времени уделялось “боевой” разработке, которая проходит в больших проектах. Мы постараемся в этом курсе углубиться в сложные темы как move семантика, мультипоточность, метапрограммирование, инструменты, которые не были рассмотрены или только поверхностно на первом курсе, рассказать текущее место C++ в мире, чем он хуже или лучше других языков, дать много больших задач и сделать курс более практическим, чтобы набить руку и не бояться писать даже на таком сложном языке как C++.
Цель освоения дисциплины

Цель освоения дисциплины

  • На очень глубоком уровне понимать концепты move семантики
  • Понимать, как работают аллокаторы памяти
  • Концепты обработки ошибок
  • Знать про паттерны PImpl, Fabric, Singleton, Type Erasure, Rule of X и антипаттерны, которых стоит избегать
  • Метапрограммирование, концепты
  • Знать про многопоточность
  • Компиляторы, библиотеки, системы сборки
  • Познакомиться с C++20 Познакомиться с C++20
Планируемые результаты обучения

Планируемые результаты обучения

  • Понимание концептов move семантики
  • Понимать, как работают аллокаторы памяти
  • Узнать, что понимание лямбда функций даёт понимание приличной части C++.
  • Знать про паттерны и антипаттерны, которых стоит избегать
  • Знать о метапрограммировании, концептах
  • Знать о компиляторорах, библиотеках, системах сборки
Содержание учебной дисциплины

Содержание учебной дисциплины

  • Умные указатели, move семантика (сравнение с Rust), perfect forwarding, RAII, lifetime
  • Разделение view от хранения объекта, memory pool, как память работает при этих парадигмах, stack vs heap.
  • Лямбда функции, концепты, как они реализованы
  • Обработка ошибок, исключения, ошибки, new (std::nothrow_t), почему C++ не был одобрен в Linux
  • Паттерны, наследования, pimpl, command, фабрика, singleton, type erasure, rule of X, RVO, CRTP
  • Антипаттерны, неопределённое поведение, инициализация, almost always auto, almost always avoid auto, видимость объектов, глобальные переменные, порядок инициализации, макросы. Как избежать их
  • Метапрограммирование
  • Мультипоточность
  • С++20, модули, ranges, будущие направление C++23
  • Компилятор, атрибуты, архитектура LLVM, санитайзеры, фаззинг
  • Как работает сборка C++ в случае многих файлов, cmake
  • Перфоманс C++, что делает C++ быстрым
  • Ответы на вопросы, истории о C++, будущее С++, комитет, экосистема
Элементы контроля

Элементы контроля

  • неблокирующий Маленькие домашние задания
    Выдаются каждую неделю и направлены на закрепление лекционного и семинарского материалов.
  • неблокирующий Большое домашнее задание 1
    Умные указатели. Пишем свои unique_ptr, shared_ptr, weak_ptr
  • неблокирующий Большое домашнее задание 2
    Schema. Пишем парсер языка программирования lisp.
  • неблокирующий Пересдача
    Сдача больших домашних заданий со штрафом в 30%.
  • неблокирующий Большое домашнее задание 3
    Jpeg-decoder. Пишем парсер jpeg.
Промежуточная аттестация

Промежуточная аттестация

  • Промежуточная аттестация (2 модуль)
    Мин(Округление(0.6 * Большие_дз + 0.4 * Маленькие_дз + Б), 10), где Б — бонус.
Список литературы

Список литературы

Рекомендуемая основная литература

  • David Vandevoorde, Nicolai M. Josuttis, & Douglas Gregor. (2017). C++ Templates : The Complete Guide. Addison-Wesley Professional.
  • Scott Meyers. (2014). Effective Modern C++ : 42 Specific Ways to Improve Your Use of C++11 and C++14. O’Reilly Media.
  • Язык программирования С++. Вводный курс, Липпман, С.Б., 2003

Рекомендуемая дополнительная литература

  • Anthony Williams. (2019). C++ Concurrency in Action. Manning Publications.