Содержание курса
C23 для системного разработчика
8 уроков
1.
Что мы строим: nestor
↗
2.
Компилятор, стандарт и единица трансляции
↗
3.
main, аргументы и коды возврата
↗
4.
Что изменилось в C23
↗
5.
Объявления, определения, области видимости и связывание
↗
6.
Заголовки и раздельная компиляция
↗
7.
Выражения, операторы, точки следования
↗
8.
Практика: скелет проекта nestor
↗
Типы, объекты и представление данных
9 уроков
1.
Объектная модель C: объект, значение, тип
↗
2.
Целые типы: char, short, int, long, long long
↗
3.
Точные типы из stdint.h и печать их
↗
4.
Преобразования типов и usual arithmetic conversions
↗
5.
Литералы C23: 0b, разделители, суффиксы
↗
6.
constexpr-объекты и enum с фиксированным типом
↗
7.
typeof, typeof_unqual и auto
↗
8.
Выравнивание, alignas, alignof и представление
↗
9.
Практика: типы записи nestor
↗
Целочисленная арифметика и защита от переполнения
9 уроков
1.
Знаковое и беззнаковое переполнение
↗
2.
Что оптимизатор делает с UB
↗
3.
stdckdint.h: ckd_add, ckd_sub, ckd_mul
↗
4.
Биты: сдвиги, маски, битовые поля
↗
5.
stdbit.h: подсчёт битов, степени двойки
↗
6.
_BitInt(N) и точная ширина
↗
7.
Хеш-функции для хранилища
↗
8.
CRC32C и целостность данных
↗
9.
Практика: безопасные размеры и хеш в nestor
↗
Указатели, массивы и время жизни
9 уроков
1.
Указатели: модель, арифметика, сравнение
↗
2.
Массивы, распад и передача в функции
↗
3.
nullptr, nullptr_t и NULL
↗
4.
const, volatile, restrict
↗
5.
Указатели на функции и таблицы диспетчеризации
↗
6.
Массивы переменной длины и variably-modified типы
↗
7.
Время жизни, висячие указатели, escape
↗
8.
Строгий алиасинг и type punning
↗
9.
Практика: слайсы памяти в nestor
↗
Агрегаты: структуры, объединения, компоновка
9 уроков
1.
Структуры: паддинг, размер, порядок членов
↗
2.
Инициализация агрегатов в C23
↗
3.
Объединения и активный член
↗
4.
Гибкий член массива
↗
5.
Помеченные объединения и моделирование вариантов
↗
6.
Непрозрачные типы и инкапсуляция
↗
7.
Компоновка данных для кэша
↗
8.
Сериализация структур на диск
↗
9.
Практика: формат сегмента nestor
↗
Функции, ABI и модульность
9 уроков
1.
Прототипы и объявления функций в C23
↗
2.
Передача параметров, стек и регистры
↗
3.
Вариативные функции
↗
4.
Атрибуты C23 в API
↗
5.
inline, static, extern и связывание
↗
6.
Проектирование C API библиотеки
↗
7.
Обратные вызовы и пользовательские данные
↗
8.
Стек, рекурсия и хвостовые вызовы
↗
9.
Практика: публичный API libnestor
↗
Препроцессор и метапрограммирование
9 уроков
1.
Препроцессор: фазы, включения, замена
↗
2.
Макросы: гигиена и типичные дефекты
↗
3.
Вариативные макросы и __VA_OPT__
↗
4.
_Generic и выбор по типу
↗
5.
X-макросы и кодогенерация
↗
6.
Условная компиляция и определение окружения
↗
7.
#embed: ресурсы в бинарнике
↗
8.
Отладочные и диагностические макросы
↗
9.
Практика: слой логирования nestor
↗
Ошибки, контракты и защитное программирование
9 уроков
1.
Коды возврата вместо исключений
↗
2.
errno и системные ошибки
↗
3.
static_assert и проверки на этапе компиляции
↗
4.
assert, NDEBUG и unreachable()
↗
5.
Освобождение ресурсов: goto cleanup
↗
6.
Атрибут cleanup и RAII-подобные приёмы
↗
7.
Инварианты и контракты в C-коде
↗
8.
Нехватка памяти и деградация
↗
9.
Практика: система ошибок nestor
↗
Строки, байты и кодировки
9 уроков
1.
Строки C: устройство, цена, границы
↗
2.
Замены небезопасных функций
↗
3.
Слайсы вместо нуль-терминированных строк
↗
4.
Форматирование: snprintf, %b и позиционные типы
↗
5.
Разбор чисел и границ
↗
6.
UTF-8, char8_t и многобайтовые строки
↗
7.
Порядок байтов и кодирование чисел
↗
8.
Побайтовые операции и безопасное стирание
↗
9.
Практика: разбор протокола nestor
↗
Динамическая память и аллокаторы
9 уроков
1.
malloc, free и что внутри
↗
2.
calloc, realloc и ловушки C23
↗
3.
Выровненное выделение, free_sized, free_aligned_sized
↗
4.
Арена-аллокатор
↗
5.
Пул объектов фиксированного размера
↗
6.
Владение и передача ответственности
↗
7.
Утечки, двойное освобождение, use-after-free
↗
8.
mmap и работа с виртуальной памятью
↗
9.
Практика: арена и пул в nestor
↗
Файлы, дескрипторы и ввод-вывод POSIX
9 уроков
1.
stdio против системных вызовов
↗
2.
open, read, write и частичные операции
↗
3.
Позиционный ввод-вывод: pread и pwrite
↗
4.
Долговечность: fsync, fdatasync, O_DSYNC
↗
5.
Атомарная замена файла и каталог
↗
6.
mmap для чтения данных
↗
7.
Каталоги, метаданные и обход
↗
8.
Блокировки и режим одного писателя
↗
9.
Практика: сегменты данных nestor
↗
Сборка, компоновка и инструментарий
9 уроков
1.
Этапы трансляции и флаги компилятора
↗
2.
Объектные файлы, символы, разрешение имён
↗
3.
Статические и динамические библиотеки
↗
4.
Видимость символов и ABI
↗
5.
Make: правила, зависимости, инкрементальность
↗
6.
CMake для проекта на C23
↗
7.
Установка, pkg-config, дистрибуция
↗
8.
Переносимость и кросс-компиляция
↗
9.
Практика: сборочная система nestor
↗
Отладка, санитайзеры и профилирование
9 уроков
1.
GDB для системного кода
↗
2.
AddressSanitizer и LeakSanitizer
↗
3.
UndefinedBehaviorSanitizer
↗
4.
ThreadSanitizer и Valgrind
↗
5.
Статический анализ
↗
6.
perf: где уходит время
↗
7.
Кэш, ветвления и микрооптимизация
↗
8.
strace, ltrace и наблюдение за системными вызовами
↗
9.
Практика: диагностируем баг в nestor
↗
Тестирование, фаззинг и CI
9 уроков
1.
Юнит-тесты без фреймворка
↗
2.
Табличные тесты и параметризация
↗
3.
Подмена зависимостей в C
↗
4.
Тесты свойств и генерация данных
↗
5.
Фаззинг
↗
6.
Тесты на отказ: сбои диска и памяти
↗
7.
Бенчмарки и измерение времени
↗
8.
Непрерывная интеграция
↗
9.
Практика: тестовый контур nestor
↗
Конкурентность: потоки, атомики, lock-free
9 уроков
1.
Модель памяти C11/C23
↗
2.
Потоки: threads.h и pthreads
↗
3.
Мьютексы, условные переменные, очередь задач
↗
4.
Атомики и порядки памяти на практике
↗
5.
Lock-free структуры: SPSC-очередь
↗
6.
thread_local, call_once, барьеры
↗
7.
Масштабирование и ложное разделение
↗
8.
Отладка конкурентности
↗
9.
Практика: фоновая компакция nestor
↗
Сеть, событийный цикл и продакшн
9 уроков
1.
Сокеты: bind, listen, accept
↗
2.
Неблокирующий ввод-вывод и epoll
↗
3.
Буферы соединения и backpressure
↗
4.
Протокол nestor
↗
5.
Сигналы, signalfd и graceful shutdown
↗
6.
Конфигурация, логи и метрики
↗
7.
Ограничения ресурсов и защита от перегрузки
↗
8.
Развёртывание
↗
9.
Практика: запускаем nestord под нагрузкой
↗