Лекции Технопарка. 1 семестр. С/С++
Мы продолжаем наши еженедельные публикации учебных материалов Технопарка. Предыдущие лекции были посвящены web-технологиям в целом, а также алгоритмам и структурам данных. В третьем блоке лекций рассказывается о языках С и С++.Лекция 1. Язык С. Основы организации и использования оперативной и сверхоперативной памятиЛекция начинается с введения в язык С: рассказывается об истории его появления, особенностях, преимуществах и недостатках, о сферах применения. Описываются основы препроцессорной обработки, рассматриваются вопросы управления памятью (модели управления памятью, области видимости объектов хранения) и производительность программ на языке С. Обсуждается связывание объектов хранения и их инициализация. Затем рассказывается о классах памяти в языке С. Следующая часть лекции посвящена проблематике указателей, а также работе с одномерными массивами. В заключение рассматривается стандарт POSIX и вопросы переносимости.[embedded content]
Лекция 2. Дополнительные вопросы организации и использования оперативной и сверхоперативной памяти Лекция начинается с рассмотрения многомерных массивов. На примере двумерного массива показывается эффективный обход. Разбирается пример задачи об умножении матриц, обсуждаются векторы векторов. Далее рассматривается ряд вопросов, посвящённых указателям: указатели и двумерные массивы; совместимость указателей; указатели на константы и константные указатели; указатели и квалификатор restrict. Затем рассказывается об использовании функций применительно к многомерным массивам, о массивах переменной длины. Далее обсуждается выравнивание и упаковка переменных составных типов, в том числе реорганизация структур данных. Рассматривается оптимизация загрузки кэш-памяти: асимметрия условий, встраивание функций. Заключительная часть лекции посвящена системным аспектам выделения и освобождения памяти. В частности, рассказывается о четырёх частях структуры памяти данных.[embedded content]
Лекция 3. Специальные вопросы инкапсуляции Инкапсуляция — один из трёх базовых принципов объектно-ориентированного проектирования. В первую очередь описывается, что представляет собой инкапсуляция. Даётся определение класса, разбирается его состав, перечисляются существующие виды классов. Подробно рассматриваются объекты класса, в том числе константные, атрибуты и методы класса, битовые поля и вложенные классы. Далее описываются разные виды методов класса (статические и нестатические, встроенные, константные, неустойчивые), а также указатели на них. Затем рассматриваются так называемые дружественные классы и функции. Ближе к концу лекции рассказывается про классы-объединения, анонимные и безымянные объединения, битовые поля в определении классов. Финальная часть лекции посвящена конструкторам и деструкторам.[embedded content]
Лекция 4. Специальные вопросы наследования и полиморфизма. Множественное и виртуальное наследование. Динамическая идентификация типов (RTTI) В начале лекции обсуждаются инициализация без конструктора, конструкторы по умолчанию, конструкторы с параметрами, закрытые и защищённые конструкторы. Далее рассказывается о механизмах почленной инициализации и присваивания, о конструкторах копирования, операциях преобразования, а также о деструкторах, в том числе виртуальных. Обсуждается идиома RAII (Resource acquisition is initialization), явный вызов деструкторов и список инициализации в конструкторе. Рассказывается о переносе в языке С++11, в том числе о семантике и конструкторе переноса. Далее обсуждаются такие базовые принципы ООП, как наследование (раннее и позднее связывание, базовые и производные классы) и полиморфизм (защищённые и закрытые члены класса, перегрузка и перекрытие членов класса). Затем говорится о вызове конструкторов и деструкторов производных классов, списке инициализации при наследовании, виртуальных функциях и абстрактных классах. Рассказывается о виртуальном и множественном наследовании. В завершение лекции обсуждаются такие вопросы, как динамическая идентификация типов времени выполнения (RTTI) и операции приведения типов, производительность и безопасность полиморфизма и средств поддержки RTTI.[embedded content]
Лекция 5. Шаблоны классов и методов. Обработка исключительных ситуаций. Обобщённое и безопасное программирование В начале лекции даётся определение шаблонов классов и рассматриваются их параметры. Объясняется механизм конкретизации шаблонов классов. Рассказывается о методах шаблонов, о дружественных объектах в шаблонах, о статических членах, о специализации шаблонов, в том числе о полной и частичной. В качестве примера метапрограммирования рассматривается рекурсивное определение шаблонов. Объясняется суть новой идиомы, SFINAE (Substitution failure is not an error), в том числе применительно к интроспекции времени компиляции. Солидная часть лекции посвящена всевозможным характеристикам типов. Рассказывается о технологии обработки исключительных ситуаций. Следующий блок информации посвящён безопасному программированию: безопасности классов, методов, конструкторов и деструкторов, критериям безопасности и нейтральности кода. В конце лекции обсуждаются различные исключения в стандартной библиотеке.[embedded content]
Лекция 6. Практическое введение в STL. Функциональное программирование в С++ Сначала рассказывается об истории создания стандартной библиотеки шаблонов (STL): о предпосылках, о предназначении STL и гарантиях производительности. Далее подробно рассказывается обо всех компонентах, входящих в состав STL: последовательных контейнерах (векторах, деках, списках); упорядоченных ассоциативных контейнерах (множествах и мультимножествах, отображениях и мультиотображениях); последовательных алгоритмах; алгоритмах упорядочения; алгоритмах на числах; копирующих, предикатных алгоритмах; алгоритмах, работающих на месте; алгоритмах сортировки. Рассматриваются отношения сравнения в алгоритмах, обратные отношения, операции над множествами и хипами. Затем говорится об итераторах STL, об их видах (в том числе об итераторах вставки и потоковых итераторах), о поддерживаемых итераторами диапазонах и операциях. Ближе к концу лекции обсуждаются стандартные функциональные объекты STL и их базовые классы. Даётся информация об адаптерах (контейнерных, функциональных). В конце затрагивается вопрос применения контейнеров в STL.[embedded content]
Лекция 7. Практическое введение в Boost Лекция начинается с рассказа о лямбда-функциях, основных правилах их оформления, ключевых преимуществах и применении замыканий. Затем обсуждается Boost (набор из нескольких десятков автономных библиотек), его состав и назначение. Основная часть лекции посвящена рассмотрению примеров использования Boost: проверке времени компиляции, характеристикам типов, вариантным контейнерам, «умным» указателям. В заключение рассказывается об использовании средств Boost для повышения производительности и безопасности кода.[embedded content]
Лекция 8. Принципы и шаблоны объектно-ориентированного проектирования. Базовые шаблоны, шаблоны GoF Лекция открывается длительным обсуждением целей, проблем и принципов объектно-ориентированного проектирования. Далее рассказывается о шаблонах проектирования: что это такое, какие бывают виды шаблонов, каковы их преимущества. Рассматриваются базовые шаблоны и их реализации: наследование и композиция; делегирование; неизменяемые объекты; интерфейс. После этого разбираются три группы шаблонов GoF. Порождающие шаблоны: абстрактная фабрика; строитель; фабричный метод; прототип; класс с единственным экземпляром. Структурные шаблоны: адаптер; декоратор; мост; компоновщик; фасад; приспособленец; заместитель. Поведенческие шаблоны: интерпретатор; команда; цепочка ответственности; итератор; хранитель; состояние; наблюдатель; стратегия; посредник; посетитель; шаблонный метод. И в заключение рассказывается о принципах S.O. L.I.D.[embedded content]
Лекция 9. Идиоматика языка С++. Основы рефакторинга и качество исходного кода. Стандарты кодирования и методология разработки ПО Завершающая лекция в рамках данного курса. Сначала даётся определение термина «идиома языка программирования». Рассказывается об идиомах процедурного программирования, об объектно-ориентированных идиомах. Обсуждаются методы управления памятью, относящиеся к идиомам повышенного уровня сложности: контекстно-зависимая перегрузка индексирования; «автоматическая» сборка мусора и подсчёт ссылок; управление памятью заменой операций new и delete; идиома «конверт/письмо» и делегированный полиморфизм. Следующая часть лекции посвящена рефакторингу и статическому анализу исходного кода: даются определения, рассказывается о возможном применении, рассматриваются преимущества, недостатки и сопутствующие риски. Далее разбираются типовые анти-шаблоны, «грязные техники», логико-семантические ошибки. Обсуждаются вопросы оптимизации программ с точки зрения производительности, размера объектного кода и объёма памяти данных. Затем рассматривается понятие «качественного ПО», описываются функциональные и структурные показатели качества кода. Рассказывается о моделях и факторах качества ПО, в том числе о модели МакКола. Далее говорится о сложности кода как об атрибуте качества ПО, о способах управления сложностью и о влиянии на неё модульности. Затем рассматриваются понятие «технического долга», стандарты и стили кода, методологии промышленной разработки (правила организации и способы записи, комментирование и документирование, жизненный цикл разработки ПО, его модели). И в завершение курса даётся обзор SWEBoK (Software engineering body of knowledge).[embedded content]