Учебник Zig для начинающих
Zig — молодой системный язык программирования, который ставит во главу угла явность: никаких скрытых аллокаций памяти, никакого скрытого потока управления, никаких макросов. Этот курс рассчитан на тех, кто уже знаком с C, C++ или Rust и хочет понять, чем Zig отличается и зачем он нужен. Мы разберём ручное управление памятью через аллокаторы, обработку ошибок без исключений, опциональные типы вместо null, и главную суперсилу языка — comptime, выполнение кода на этапе компиляции, которое заменяет и шаблоны, и макросы. Курс глубокий: вы выйдете с пониманием того, как Zig устроен изнутри и в каких задачах он сильнее своих предшественников.
Курс «Zig: современный системный язык» состоит из 9 разделов и 28 уроков: Введение в Zig, Основы языка, Память и указатели, Обработка ошибок, Типы данных, Управление памятью, comptime и метапрограммирование, Стандартная библиотека и практика и Сборка, C и место Zig. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.
Программа курса
1 Введение в Zig
- Что такое Zig и зачем он нужен
Zig — системный язык как замена C: без скрытых аллокаций, без скрытого потока управления, с comptime вместо макросов.
- Установка Zig и первая программа
Как установить Zig, структура hello world, точка входа main и команда zig build-exe для сборки бинарника.
- Философия явности: что отличает Zig от C
Дзен Zig: явность вместо магии, отсутствие скрытого потока управления, читаемость кода важнее краткости написания.
- Что такое Zig и зачем он нужен
2 Основы языка
- Переменные: const и var
Объявление переменных в Zig: const для неизменяемых, var для изменяемых, явные типы и запрет неинициализированных значений.
- Числовые типы и арифметика
Целые типы точной разрядности i32/u8/u64, типы с плавающей точкой и обнаружение переполнения в Zig.
- Условия, циклы и блоки
Управляющие конструкции Zig: if/else, while, for по срезам, блоки как выражения и switch без проваливания.
- Переменные: const и var
3 Память и указатели
- Указатели и срезы
Указатели *T, многоуказатели [*]T и срезы []T в Zig: почему срез безопаснее голого C-массива.
- Опциональные типы вместо null
Опциональные типы ?T в Zig: безопасная замена null, проверка через if-захват и оператор orelse.
- Массивы и многоуказатели
Массивы фиксированного размера в Zig, sentinel-завершённые указатели для C-строк и разница между массивом и срезом.
- Указатели и срезы
4 Обработка ошибок
- Error unions и try
Типы-объединения ошибок !T в Zig, наборы ошибок, оператор try для проброса и обработка без исключений.
- catch и обработка на месте
Оператор catch в Zig: обработка ошибки на месте, значение по умолчанию и захват кода ошибки через switch.
- errdefer и безопасный откат
errdefer в Zig: освобождение ресурсов только при ошибке, защита от утечек памяти при частичной инициализации.
- Error unions и try
5 Типы данных
- Структуры
Структуры в Zig: объявление struct, методы, значения полей по умолчанию и анонимные структурные литералы.
- Перечисления и объединения
Перечисления enum и объединения union в Zig, tagged union для безопасных вариантных типов и разбор через switch.
- Функции и параметры
Функции в Zig: передача параметров по значению, неизменяемость аргументов, передача структур и срезов.
- Структуры
6 Управление памятью
- Аллокаторы: явное управление памятью
Аллокаторы в Zig: почему нет скрытых аллокаций, как функции принимают allocator и освобождение через defer.
- Виды аллокаторов из стандартной библиотеки
Аллокаторы std в Zig: GeneralPurposeAllocator с детекцией утечек, ArenaAllocator, FixedBufferAllocator и page_allocator.
- Сравнение с ручной памятью C и Rust
Управление памятью: Zig против malloc/free в C и borrow checker в Rust — явность и ручная безопасность.
- Аллокаторы: явное управление памятью
7 comptime и метапрограммирование
- comptime: код на этапе компиляции
Основы comptime в Zig: вычисления на этапе компиляции, comptime-параметры и почему типы — это значения.
- Дженерики через comptime-типы
Дженерики в Zig через comptime: функции и структуры, принимающие тип параметром, без отдельного синтаксиса шаблонов.
- Метапрограммирование без макросов
Метапрограммирование в Zig: интроспекция типов через @typeInfo, генерация кода на comptime и условная компиляция.
- comptime: код на этапе компиляции
8 Стандартная библиотека и практика
- Строки и работа с UTF-8
Строки в Zig — это срезы байтов []const u8, литералы UTF-8 и почему длина в байтах не равна числу символов.
- Коллекции: ArrayList и HashMap
Динамические коллекции Zig: ArrayList и HashMap из std, явная передача аллокатора и освобождение через deinit.
- Встроенное тестирование
Тестирование в Zig: блоки test прямо в исходниках, команда zig test, expect и testing allocator против утечек.
- Строки и работа с UTF-8
9 Сборка, C и место Zig
- Система сборки и кросс-компиляция
Сборка Zig: файл build.zig на самом языке, команда zig build и кросс-компиляция под любую цель через -target.
- Взаимодействие с C
Zig и C: прямой импорт заголовков через @cImport, вызов C-функций без обёрток и почему Zig — отличный сосед для C.
- Zig против C, Rust и C++
Сравнение Zig с C, Rust и C++: что Zig чинит в C, чем проще Rust без borrow checker и без скрытой магии C++.
- Кому и зачем Zig: применение в реальном мире
Где применяют Zig: системное и embedded-программирование, замена C, инструментарий, проекты Bun и TigerBeetle.
- Система сборки и кросс-компиляция