Языки программирования

Учебник Zig для начинающих

28 уроков · 9 разделов · бесплатно, без регистрации

Zig — молодой системный язык программирования, который ставит во главу угла явность: никаких скрытых аллокаций памяти, никакого скрытого потока управления, никаких макросов. Этот курс рассчитан на тех, кто уже знаком с C, C++ или Rust и хочет понять, чем Zig отличается и зачем он нужен. Мы разберём ручное управление памятью через аллокаторы, обработку ошибок без исключений, опциональные типы вместо null, и главную суперсилу языка — comptime, выполнение кода на этапе компиляции, которое заменяет и шаблоны, и макросы. Курс глубокий: вы выйдете с пониманием того, как Zig устроен изнутри и в каких задачах он сильнее своих предшественников.

Курс «Zig: современный системный язык» состоит из 9 разделов и 28 уроков: Введение в Zig, Основы языка, Память и указатели, Обработка ошибок, Типы данных, Управление памятью, comptime и метапрограммирование, Стандартная библиотека и практика и Сборка, C и место Zig. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.

Программа курса

  1. 1 Введение в Zig

    1. Что такое Zig и зачем он нужен

      Zig — системный язык как замена C: без скрытых аллокаций, без скрытого потока управления, с comptime вместо макросов.

    2. Установка Zig и первая программа

      Как установить Zig, структура hello world, точка входа main и команда zig build-exe для сборки бинарника.

    3. Философия явности: что отличает Zig от C

      Дзен Zig: явность вместо магии, отсутствие скрытого потока управления, читаемость кода важнее краткости написания.

  2. 2 Основы языка

    1. Переменные: const и var

      Объявление переменных в Zig: const для неизменяемых, var для изменяемых, явные типы и запрет неинициализированных значений.

    2. Числовые типы и арифметика

      Целые типы точной разрядности i32/u8/u64, типы с плавающей точкой и обнаружение переполнения в Zig.

    3. Условия, циклы и блоки

      Управляющие конструкции Zig: if/else, while, for по срезам, блоки как выражения и switch без проваливания.

  3. 3 Память и указатели

    1. Указатели и срезы

      Указатели *T, многоуказатели [*]T и срезы []T в Zig: почему срез безопаснее голого C-массива.

    2. Опциональные типы вместо null

      Опциональные типы ?T в Zig: безопасная замена null, проверка через if-захват и оператор orelse.

    3. Массивы и многоуказатели

      Массивы фиксированного размера в Zig, sentinel-завершённые указатели для C-строк и разница между массивом и срезом.

  4. 4 Обработка ошибок

    1. Error unions и try

      Типы-объединения ошибок !T в Zig, наборы ошибок, оператор try для проброса и обработка без исключений.

    2. catch и обработка на месте

      Оператор catch в Zig: обработка ошибки на месте, значение по умолчанию и захват кода ошибки через switch.

    3. errdefer и безопасный откат

      errdefer в Zig: освобождение ресурсов только при ошибке, защита от утечек памяти при частичной инициализации.

  5. 5 Типы данных

    1. Структуры

      Структуры в Zig: объявление struct, методы, значения полей по умолчанию и анонимные структурные литералы.

    2. Перечисления и объединения

      Перечисления enum и объединения union в Zig, tagged union для безопасных вариантных типов и разбор через switch.

    3. Функции и параметры

      Функции в Zig: передача параметров по значению, неизменяемость аргументов, передача структур и срезов.

  6. 6 Управление памятью

    1. Аллокаторы: явное управление памятью

      Аллокаторы в Zig: почему нет скрытых аллокаций, как функции принимают allocator и освобождение через defer.

    2. Виды аллокаторов из стандартной библиотеки

      Аллокаторы std в Zig: GeneralPurposeAllocator с детекцией утечек, ArenaAllocator, FixedBufferAllocator и page_allocator.

    3. Сравнение с ручной памятью C и Rust

      Управление памятью: Zig против malloc/free в C и borrow checker в Rust — явность и ручная безопасность.

  7. 7 comptime и метапрограммирование

    1. comptime: код на этапе компиляции

      Основы comptime в Zig: вычисления на этапе компиляции, comptime-параметры и почему типы — это значения.

    2. Дженерики через comptime-типы

      Дженерики в Zig через comptime: функции и структуры, принимающие тип параметром, без отдельного синтаксиса шаблонов.

    3. Метапрограммирование без макросов

      Метапрограммирование в Zig: интроспекция типов через @typeInfo, генерация кода на comptime и условная компиляция.

  8. 8 Стандартная библиотека и практика

    1. Строки и работа с UTF-8

      Строки в Zig — это срезы байтов []const u8, литералы UTF-8 и почему длина в байтах не равна числу символов.

    2. Коллекции: ArrayList и HashMap

      Динамические коллекции Zig: ArrayList и HashMap из std, явная передача аллокатора и освобождение через deinit.

    3. Встроенное тестирование

      Тестирование в Zig: блоки test прямо в исходниках, команда zig test, expect и testing allocator против утечек.

  9. 9 Сборка, C и место Zig

    1. Система сборки и кросс-компиляция

      Сборка Zig: файл build.zig на самом языке, команда zig build и кросс-компиляция под любую цель через -target.

    2. Взаимодействие с C

      Zig и C: прямой импорт заголовков через @cImport, вызов C-функций без обёрток и почему Zig — отличный сосед для C.

    3. Zig против C, Rust и C++

      Сравнение Zig с C, Rust и C++: что Zig чинит в C, чем проще Rust без borrow checker и без скрытой магии C++.

    4. Кому и зачем Zig: применение в реальном мире

      Где применяют Zig: системное и embedded-программирование, замена C, инструментарий, проекты Bun и TigerBeetle.