Системное программирование на языке C — 2018

Зачёт

Вопросы к зачёту


Материалы лекций

Практические задачи

Содержание занятий

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 декабря (вторники) по две пары.

Литература

  1. Керниган Б., Ритчи Д. Язык программирования Си = The C programming language. — 2-е изд. — М.: Вильямс, 2007. — С. 304.
  2. Michael Kerrisk. The Linux Programming Interface: A Linux and UNIX System Programming Handbook. — No Starch Press, 2010.
  3. W. Richard Stevens, Stephen A. Rago. Advanced Programming in the UNIX Environment. — Addison-Wesley, 2013.
  4. Jeffrey Richter. Windows via C/C++. — Microsoft Press, 2011.
  5. Agner Fog. Optimizing software in C++: An optimization guide for Windows, Linux and Mac platforms.
  6. Eli Bendersky's website