В настоящее время навык программирования жизненно необходим для технического специалиста, чтобы автоматизировать или ускорить работу, выполнять её более качественно. Однако, с развитием программных средств возрастает цена ошибочных или непродуманных решений. Практика показывает, что во многих случаях специалисты неправильно или не полностью понимают значение тех или иных методов программирования, некорректно сочетают их, применяют их вне рекомендуемой предметной области, что приводит к громоздким, неподдерживаемым или некорректным решениям. В связи с этим желательно давать будущим специалистам общее представление о распространённых приёмах программирования, областях их применения, а также ознакомить их с примерами правильных и ошибочных программных решений.
Данная программа описывает учебный курс, предназначенный для обучения студентов 2-3 курса современным технологиям программирования. Изучение данного курса позволит освоить широкий класс современных методов программирования сложных систем. Благодаря использованию нескольких языков программирования разных типов учащиеся получат достаточно полное представление о существующих точках зрения на разработку ПО, о типичных моделях программных систем, о взаимодействии компонентов этих моделей на разных уровнях представления. Охват тем позволит студентам в дальнейшем успешнее изучать новые языки программирования, рационально применять и сочетать их выразительные средства. Программа рассчитана на 2 семестра.
Цель курса изучение общих принципов программирования сложных систем, методов выбора типа программной модели системы, получение навыков программирования при создании сложных гетерогенных программных комплексов.
Этот курс является составной частью цикла специальных дисциплин, определяющих подготовку студентов в области современных информационных технологий.
Задачами данного курса являются:
Дисциплина включает в себя разделы, которые могут быть отнесены к базовой и вариативным частям цикла кода УЦ ООП Б3.
Дисциплина базируется на материалах курса бакалавриата: дисциплинах цикла Б2, Б3 "Основы информатики", базовой и вариативных частях курсов "Информатика (языки программирования)" и относится к профессиональному циклу.
Освоение дисциплины направлено на формирование следующих общекультурных и общепрофессиональных интегральных компетенций бакалавра:
В результате освоения курса обучающийся должен:
Структура преподавания дисциплины: дисциплина делится на разделы, в разделах располагаются темы.
Перечень разделов дисциплины и распределение времени
N | Название раздела | Количество часов |
1 | Введение | 2 |
2 | Основные принципы объектно-ориентированного программирования | 24 |
3 | Основные принципы программирования высокопроизводительных вычислительных систем | 24 |
4 | Основные принципы функционального программирования | 24 |
5 | Абстрактное представление программ и данных | 22 |
6 | Сравнение программных моделей | 28 |
7 | Практические аспекты разработки ПО | 4 |
ВСЕГО (зач. ед. (часов)) | 128 |
ВИД ЗАНЯТИЙ: лекции
N | Раздел | Темы | Трудоемкость(количество часов) |
1 | Введение | 1.1. Цели и задачи курса 1.2. Характеристики языка программирования | 2 |
2 | Основные принципы объектно-ориентированного программирования | 2.1 История создания объектно-ориентированного программирования. История создания Smalltalk 2.2 Сообщения 2.3 Классы 2.4 Переменные 2.5 Управляющие конструкции 2.6 Типичные методы взаимодействия объектов 2.7 Контейнеры 2.8 Контейнеры | 10 |
3 | Основные принципы программирования высокопроизводительных вычислительных систем | 3.1 История создания C++ 3.2 Общие сведения о C-подмножестве C++ 3.3 Классы и объекты 3.4 Управление ресурсами 3.5 Особенности создания и уничтожения объектов 3.6Наследование. Полиморфизм 3.7 Виртуальные функции | 10 |
4 | Основные принципы функционального программирования | 4.1 История создания функциональных языков программирования. ML и Ocaml 4.2 Базовый синтаксис 4.3 Тип в Ocaml 4.4 Объектная система 4.5 Система модулей 4.6 Ввод-вывод в функциональных языках | 10 |
5 | Абстрактное представление программ и данных | 5.1 История создания LISP 5.2 Базовый синтаксис и семантика. Абстрактное синтаксическое дерево 5.3 Функции, переменные. Гомогенность программ и данных 5.4 Рекурсия. Связывание переменных. Функции высших порядков | 10 |
6 | Сравнение программных моделей | 6.1 Типизация 6.2 Связывание имён 6.3 Порядок вычислений 6.4 Полиморфизм 6.5 Метапрограммирование 6.6 Модульность 6.7 Управление ресурсами 6.8 Обработка ошибок 6.9 Декларативное программирование 6.10 Логическое программирование 6.11 Автоматное программирование | 22 |
7 | Практические аспекты разработки ПО | - | 0 |
ВСЕГО (часов) | 64 |
ВИД ЗАНЯТИЙ: семинары
N | Раздел | Темы | Трудоемкость (количество часов) |
1 | Введение | - | 0 |
2 | Основные принципы объектно-ориентированного программирования | 2.1 Сообщения. Унарные и бинарные селекторы 2.2 Классы. Задание классов. Методы. Вызов методов через сообщения. Иерархия классов. Метаклассы 2.3 Переменные: временные, переменные экземпляра, переменные класса, глобальные и общие переменные. Псевдопеременные. Булевы величины 2.4 Условные конструкции. Циклические конструкции. Оператор блока 2.5 Создание новых объектов. Наследование и полиморфизм. Рекурсия 2.6 Контейнеры 2.7 Параллельная работа. Синхронизация процессов 2.8 Примеры программ | 5 |
3 | Основные принципы программирования высокопроизводительных вычислительных систем | 3.1 Разработка ПО на C++. Единица трансляции. Препроцессинг, компиляция, связывание 3.2 Повтор сведений о C: функции, указатели, управление памятью, ввод-вывод, структуры 3.3 Классы и объекты. Поля и методы классов. Вызов методов. Области видимости переменных, полей, методов. Дружественные функции 3.4 Управление ресурсами: управление памятью. RAII. Ссылки на переменные 3.5 Создание и уничтожение объектов. Конструкторы, деструкторы 3.6 Наследование. Перегрузка функций, операторов 3.7 Множественное наследование. Виртуальные функции. Абстрактные классы 3.8 Примеры программ | 6 |
4 | Основные принципы функционального программирования | 4.1. Выражения, функции, понятие побочного эффекта и чистоты функции. Ввод-вывод 4.2 Тип выражения, тип функции. Вывод типов. Отсутствие неявных преобразований типов. Сопоставление с образцом 4.3 Объектная система OСaml 4.4 Модули. Интерфейсы модулей 4.5 Примеры программ | 5 |
5 | Абстрактное представление программ и данных | 5.1 Представление выражений в виде абстрактного синтаксического дерева. S-выражения. Исполнение S-выражений в Common Lisp. Стандартная библиотека функций 5.2 Объявление функций, переменных, констант. Лямбда-выражения. Функции для работы со списками. Связывание переменных. Циклы и условия 5.3 Рекурсия. Хвостовая рекурсия. Функции высших порядков 5.4 Примеры программ | 4 |
6 | Сравнение программных моделей | 6.1 Типизация: явная/неявная, статическая/динамическая, строгая/нестрогая. Вывод типов. Явные и неявные преобразования типов. Опасности неявного преобразования типов в C++ 6.2 Связывание имён. Замыкания в CommonLisp 6.3 Порядок вычисления. Понятие ленивых вычислений. Мемоизация. Связь чистоты функций и возможностей оптимизации 6.4 Сравнение полиморфизма в рассматриваемых языках. Статический и динамический полиморфизм. Диспетчеризация в C++, Ocaml, CLOS 6.5 Метапрограммирование в Common Lisp: макросы, особенности реализации и применения. Метапрограммирование в C++: шаблоны функций и классов. Вычисления на этапе компиляции 6.6 Модульность. Пространства имён C++, недостатки концепции "единиц трансляции" 6.7 Управление памятью: ручное выделение, сборка мусора. Стратегии сборки мусора 6.8 Обработка ошибок. Понятие исключения, корректная обработка исключений, влияние на RAII в C++ 6.9 Декларативное программирование. Общие понятия и примеры 6.10 Логическое программирование. Prolog. Общие понятия и примеры. 6.11 Автоматное программирование | 8 |
7 | Практические аспекты разработки ПО | 7.1 Автоматизация сборки и запуска ПО 7.2 Контроль версий. Основные методики контроля и распараллеливания работы 7.3 Тестирование. Юнит-тестирование, интеграционное тестирование 7.4 Таймирование. Средства таймирования в ОС семейства UNIX | 4 |
Всего (часов) | 32 |
ВИД ЗАНЯТИЙ: лабораторные работы
N | Раздел | Темы | Трудоемкость (количество часов) |
1 | Введение | - | 0 |
2 | Основные принципы объектно-ориентированного программирования | 2.1 Арифметические вычисления в Smalltalk 2.2 Иерархии объектов 2.3 Параллелизм | 8 |
3 | Основные принципы программирования высокопроизводительных вычислительных систем | 3.1 Классы 3.2 Иерархии классов 3.3 Метапрограммирование | 8 |
4 | Основные принципы функционального программирования | 4.1 Арифметические вычисления в Ocaml 4.2 Классы и объекты 4.3. Функции высших порядков | 8 |
5 | Абстрактное представление программ и данных | 5.1 Арифметические вычисления в Common Lisp 5.2 Рекурсия 5.3 Метапрограммирование | 8 |
6 | Сравнение программных моделей | - | 0 |
7 | Практические аспекты разработки ПО | - | 0 |
Всего (часов) | 32 |
Содержание дисциплины
Развернутые темы и вопросы по разделам
N | Раздел | Тема‹ | Содержание | Объем | |
1 | Введение | 1.1. Цели и задачи курса 1.2. Характеристики языка программирования | 1.1 Цели и задачи курса. Ограничения, накладываемые языком. Сложность процесса программирования 1.2 Примерный план характеристики языка программирования | 1 1 | 0 |
2 | Основные принципы объектно-ориентированного программирования | 2.1 История создания объектно-ориентированного программирования. История создания Smalltalk 2.2 Сообщения 2.3 Классы 2.4 Переменные 2.5 Управляющие конструкции 2.6 Типичные методы взаимодействия объектов 2.7 Контейнеры 2.8 Параллелизм | 2.1 История создания языка Smalltalk 2.2 Сообщения. Унарные и бинарные селекторы 2.3 Классы. Задание классов. Методы. Вызов методов через сообщения. Иерархия классов. Метаклассы 2.4 Переменные: временные, переменные экземпляра, переменные класса, глобальные и общие переменные. Псевдопеременные. Булевы величины 2.5 Условные конструкции. Циклические конструкции. Оператор блока 2.6 Создание новых объектов. Наследование и полиморфизм. Рекурсия 2.7 Контейнеры 2.8 Параллельная работа. Синхронизация процессов | 1 3 4 4 3 3 3 3 | 0 |
3 | Основные принципы программирования высокопроизводительных вычислительных систем | 3.1 История создания C++ 3.2 Общие сведения о C-подмножестве C++ 3.3 Классы и объекты 3.4 Управление ресурсами 3.5 Особенности создания и уничтожения объектов 3.6 Наследование. Полиморфизм 3.7 Виртуальные функци | 3.1 История создания и развития языка C++ 3.2 Повтор сведений о C: функции, указатели, управление памятью, ввод-вывод, структуры 3.3 Классы и объекты. Поля и методы классов. Вызов методов. Области видимости переменных, полей, методов. Дружественные функции 3.4 Управление ресурсами: управление памятью. RAII. Ссылки на переменные 3.5 Создание и уничтожение объектов. Конструкторы, деструкторы 3.6 Наследование. Перегрузка функций, операторов 3.7 Виртуальные функции. Абстрактные классы | 1 3 4 4 4 4 4 | 10 |
4 | Основные принципы функционального программирования | 4.1 История создания функциональных языков программирования. ML и Ocaml 4.2 Базовый синтаксис 4.3 Тип в Ocaml 4.4 Объектная система 4.5 Система модулей 4.6 Ввод-вывод в функциональных языках | 4.1 История создания языков ML и Ocaml 4.2 Выражения, функции, понятие побочного эффекта и чистоты функции 4.3 Тип выражения, тип функции. Вывод типов. Отсутствие неявных преобразований типов. Сопоставление с образцом 4.4 Объектная система Ocaml 4.5 Модули. Интерфейсы модулей 4.6 Организация ввода вывода: инкапсуляция состояния, типизацияЏ | 1 5 5 5 4 4 | 10 |
5 | Абстрактное представление программ и данных | 5.1 История создания LISP 5.2 Базовый синтаксис и семантика. Абстрактное синтаксическое дерево 5.3 Функции, переменные. Гомогенность программ и данных 5.4 Рекурсия. Связывание переменных. Функции высших порядков |
5.1 История создания языка Lisp. Диалекты Lisp'а 5.2 Представление выражений в виде абстрактного синтаксического дерева. S-выражения. Исполнение S-выражений в Common Lisp. Стандартная библиотека функций 5.3 Объявление функций, переменных, констант. Лямбда-выражения. Функции для работы со списками. Связывание переменных. Циклы и условия 5.4 Рекурсия. Хвостовая рекурсия. Функции высших порядков | 1 7 7 7 | 10 |
6 | Сравнение программных моделей | 6.1 Типизация 6.2 Связывание имён 6.3 Порядок вычислений 6.4 Полиморфизм 6.5 Метапрограммирование 6.6 Модульность 6.7 Управление ресурсами 6.8 Обработка ошибок 6.9 Декларативное программирование 6.10 Логическое программирование 6.11 Автоматное программирование |
6.1 Типизация: явная/неявная, статическая/динамическая, строгая/нестрогая. Вывод типов. Явные и неявные преобразования типов. Опасности неявного преобразования типов в C++ 6.2 Связывание имён. Замыкания 6.3 Порядок вычисления. Понятие ленивых вычислений. Мемоизация. Связь чистоты функций и возможностей оптимизации 6.4 Сравнение полиморфизма в рассматриваемых языках. Статический и динамический полиморфизм. Диспетчеризация в C++, Ocaml, CLOS 6.5 Метапрограммирование в Common Lisp: макросы, особенности реализации и применения. Метапрограммирование в C++: шаблоны функций и классов. Вычисления на этапе компиляции 6.6 Модульность. Пространства имён C++, недостатки концепции "единиц трансляции" 6.7 Управление памятью: ручное выделение, сборка мусора. Стратегии сборки мусора 6.8 Обработка ошибок. Понятие исключения, корректная обработка исключений, влияние на RAII в C++ 6.9 Общее понятие о декларативных методах программирования. Примеры моделей, использование в предметно-ориентированных языках 6.10 Логическое программирование. Сферы применения, примеры 6.11 Автоматное программирование: спектр проблем, методы, способы реализации | 3 3 3 3 3 3 2 2 2 2 2 | 0 |
7 | Практические аспекты разработки ПО | 7.1 Сборка. Контроль зависимостей 7.2 Контроль версий 7.3 Автоматизация тестирования 7.4 Измерение производительности | 7.1 Автоматизация сборки и запуска ПО 7.2 Контроль версий. Основные методики контроля и распараллеливания работы 7.3 Тестирование. Юнит-тестирование, интеграционное тестирование 7.4 Таймирование. Средства таймирования в ОС семейства UNIX | 1 1 1 1 | 0 |
Итого: | 128 | 0 |
N | Вид занятия | Форма проведения занятий | Цель |
1 | лекция | изложение теоретического материала | получение теоретических знаний по дисциплине |
2 | лекция | изложение теоретического материала с помощью презентаций | повышение степени понимания материала |
3 | семинары | закрепление знаний путём разбора примеров | осознание связей между теорией и практикой, а также взаимозависимостей разных дисциплин |
4 | лабораторные работы | решение задач по заданию преподавателя – решаются задачи, выданные преподавателем по итогам лекционных занятий и сдаются в конце семестра, используются конспект (электронный) лекций, учебники, рекомендуемые данной программой, а также учебно-методические пособия | получение навыков практического применения знаний по дисциплине |
Контрольные вопросы к зачету:
Необходимое оборудование для лекций и практических занятий: компьютер и мультимедийное оборудование (проектор).
Необходимое программное обеспечение: трансляторы рассматриваемых языков, средства контроля версий, автоматизации тестирования, таймирования.
Обеспечение самостоятельной работы – предполагается наличие у студентов персональных компьютеров с доступом в Сеть и возможностью установки на нем необходимого программного обеспечения.