Системное программирование на языке C — 2018
Содержание
Зачёт
Материалы лекций
- О курсе
- История языка программирования C
- Компиляторы C
- Целые числа
- Вещественные числа
- Прочие типы данных
- Избранные главы C
- Препроцессор
- Стандартная библиотека
- Неопределённое поведение
- Сборка программ на C
- Статические библиотеки
- Системы автоматизации сборки
- Динамические библиотеки
- Сборка под Windows
- Средства отладки
- Архитектура x86-64
- Аллокаторы
- Оптимизации
Практические задачи
- Занятие 2018-11-02
- Занятие 2018-11-09
- Разработческий сервер
- Задача linking
- Задача digest
- Задача debug
- Задача python
Содержание занятий
2018-10-19
Вводная лекция. Рассказывалось об этом курсе и о языке программирования C.
На практическом занятии решали и разбирали тест.
2018-10-26
На лекции сначала рассказывалось про компиляторы C, про фишки при использовании Visual Studio.
Затем разбирали устройство целых типов данных, хранение отрицательных чисел, ...
Далее изучали вещественную арифметику по стандарту IEEE 754.
В конце рассматривали составные типы данных (структуры и объединения).
2018-11-02
Первая часть занятия была практической. Решали задачи совместными усилиями (студенты писали код «на доске»).
На второй части была лекция про отдельные возможности языка C, про историю стандартной библиотеки.
2018-11-09
На первой части занятия была лекция. Сначала выполняли упражнения на чтение сложных объявлений (указатели на функции, const и пр.). Далее разбирали возможности стандартной библиотеки (выделение памяти, строки).
На второй паре проводилось практическое занятие. Решали задачи индивидуально на ноутбуках. Нерешённые задачи можно досдать в iRunner.
2018-11-13
Была одна пара. Вначале доразобрали лекцию про стандартную библиотеку.
В конце пары писали совместными усилиями программки, которые осуществляют ввод-вывод.
2018-11-20
Лекция была посвящена неопределённому поведению.
На практической части занятия рассматривали хитрые примеры UB.
2018-11-27
Вначале разобрали оставшиеся хитрые примеры UB.
Затем начали рассматривать технологию сборки программ на C.
2018-12-04
На занятии разбирали практические примеры компоновки, изучали карту адресного пространства, таблицы символов в объектных файлах и пр.
2018-12-07
Разобрались со статическими библиотеками, с тем, как влияет порядок указания аргументов компоновщика.
Затем изучили основные системы сборки для C. Научились писать Makefile. Собрали свой Midnight Commander последней версии на Linux.
Затем приступили к динамическим библиотекам. Посмотрели, как работает LD_PRELOAD.
2018-12-11
Продолжение изучения динамических библиотек. На примере разобрали, как можно в программе на C использовать внешние библиотеки.
Рассмотрели, как создаётся Position-Independent Code (PIC) на UNIX-системах, чем отличается PIC от метода релокации при загрузке, для чего нужны таблицы GOT, PLT.
Затем были рассмотрены инструменты отладки и диагностики (gdb, valgrind, санитайзеры).
Начали изучение архитектуры x86-64 (история, режимы работы процессора).
2018-12-18
Последнее занятие. Рассматриваются модели памяти на x86-64, механизмы вызова функций.
Рассматривается принцип работы аллокатора (то, откуда берёт память функция malloc).
В качестве последней темы разбираем вопросы оптимизации кода по скорости выполнения.
2018-12-26
Зачёт.
Расписание
- С 19 октября: по пятницам две пары.
- С 13 ноября: по вторникам одна пара.
- 7 декабря (пятница) было проведено 2,5 пары.
- 11 и 18 декабря (вторники) по две пары.
Литература
- Керниган Б., Ритчи Д. Язык программирования Си = The C programming language. — 2-е изд. — М.: Вильямс, 2007. — С. 304.
- Michael Kerrisk. The Linux Programming Interface: A Linux and UNIX System Programming Handbook. — No Starch Press, 2010.
- W. Richard Stevens, Stephen A. Rago. Advanced Programming in the UNIX Environment. — Addison-Wesley, 2013.
- Jeffrey Richter. Windows via C/C++. — Microsoft Press, 2011.
- Agner Fog. Optimizing software in C++: An optimization guide for Windows, Linux and Mac platforms.
- Eli Bendersky's website