Перейти к основному содержимому

Zig — итоги

Разработчику Аналитику Тестировщику Архитектору Инженеру

Кратко — что стоит унести из раздела "Zig". Если пункт кажется туманным — откройте указанную главу или оглавление.


FAQ — Часто задаваемые вопросы

Типичные сбои и ситуации, с которыми сталкиваются новички после раздела. Здесь — что делать и где копать в главах; определения терминов — в оглавлении и профильных статьях.

Вопрос. zig в терминале не находится, хотя архив с сайта распакован.

Ответ. Добавьте каталог с zig.exe в PATH и откройте новое окно терминала. На Windows проверьте путь в "Переменные среды", на Linux/macOS — export PATH=... в профиле оболочки. Подробнее здесь — первая программа.

Вопрос. zig run hello.zig падает с ошибкой синтаксиса, хотя код скопирован из статьи.

Ответ. Zig до версии 1.0 меняет API между релизами. Сверьте zig version с пометкой в разделе (0.12+) и release notes. Подробнее здесь — первая программа, основы.

Вопрос. Программа скомпилировалась, но при запуске сразу "Segmentation fault" без текста ошибки.

Ответ. Частые причины — обращение к освобождённой памяти, выход за границы slice или неверный указатель из C. Запустите с -O Debug и проверьте симметрию alloc/free. Подробнее здесь — типы и память, простые приложения.

Вопрос. Забыл вызвать free — компилятор молчит, память "течёт".

Ответ. В Zig нет сборщика мусора — каждый alloc требует явного освобождения или defer. Используйте GeneralPurposeAllocator с defer _ = gpa.deinit() и errdefer при ошибках. Подробнее здесь — основы, простые приложения.

Вопрос. error.OutOfMemory появляется при чтении маленького файла.

Ответ. Проверьте лимит в readFileAlloc — он защищает от случайной загрузки гигабайтов. Увеличьте лимит осознанно или читайте потоком через reader. Подробнее здесь — простые приложения.

Вопрос. try в main — компилятор требует !void, а я написал void.

Ответ. Функции с try возвращают error union — сигнатура main должна быть pub fn main() !void. Альтернатива — обработать каждую ошибку через catch. Подробнее здесь — основы.

Вопрос. Ошибка "error set is missing error X" после добавления новой ветки.

Ответ. Тип !T включает фиксированный набор ошибок. Новую ошибку нужно объявить в error{...} или вернуть из функции, которая уже её экспортирует. Подробнее здесь — основы, функции и comptime.

Вопрос. catch unreachable в учебном коде — коллега говорит, что так нельзя в проде.

Ответ. unreachable означает "сюда управление никогда не дойдёт"; при ошибке программа аварийно завершится. В production обрабатывайте catch явно или пробрасывайте ошибку выше. Подробнее здесь — основы.

Вопрос. Строка из C не совпадает с Zig — лишние символы или обрезка.

Ответ. C-строка — [:0]u8 или [*:0]const u8 с нулевым терминатором; slice []const u8 длины не знает. Конвертируйте через std.mem.span или копируйте в allocator. Подробнее здесь — типы и память, архитектура.

Вопрос. @import("std") работает, а свой модуль @import("utils") — "file not found".

Ответ. Локальные файлы подключают относительным путём или через build.zig как шаг модуля. Для одного файла используйте @import("utils.zig"). Подробнее здесь — основы, архитектура.

Вопрос. zig build ругается на build.zig — "no build root".

Ответ. Команда выполняется из каталога с build.zig. Создайте проект через zig init или скопируйте шаблон из основ. Подробнее здесь — первая программа.

Вопрос. Хочу собрать под Linux на Windows — нужен отдельный toolchain?

Ответ. Zig умеет кросс-компиляцию из коробки: -target x86_64-linux или настройка в build.zig. Отдельный GCC для целевой ОС обычно не нужен. Подробнее здесь — архитектура.

Вопрос. comptime блок не компилируется — "unable to resolve comptime value".

Ответ. В comptime все значения должны быть известны на этапе компиляции. Нельзя читать файлы, аргументы CLI или runtime-данные. Вынесите вычисление в runtime или используйте inline for. Подробнее здесь — функции и comptime.

Вопрос. @TypeOf и generics через comptime — код стал нечитаемым за один вечер.

Ответ. Начните с конкретных типов, обобщайте только после второго дублирования. Для учебных задач достаточно основ без метапрограммирования. Подробнее здесь — функции и comptime.

Вопрос. defer сработал не в том порядке — ресурс закрыли слишком рано.

Ответ. defer выполняется в порядке LIFO при выходе из блока. Вложенные defer и errdefer планируйте как стек. Подробнее здесь — управляющие конструкции.

Вопрос. После ошибки в функции память не освободилась — нужен и defer, и errdefer?

Ответ. errdefer срабатывает только при выходе по ошибке из функции; обычный defer — всегда. Часто комбинируют: defer free() + errdefer rollback(). Подробнее здесь — управляющие конструкции, основы.

Вопрос. @intCast паникует на большом числе — в C просто обрезалось бы.

Ответ. Zig в Debug проверяет переполнение при приведении типов. Используйте @truncate только если осознанно принимаете потерю данных, или проверяйте диапазон до cast. Подробнее здесь — типы и память.

Вопрос. Сравниваю два slice через == — результат не тот, что ожидал.

Ответ. Для slice == сравнивает элементы по значению, для указателей — адреса. Для C-строк используйте std.mem.eql или order. Подробнее здесь — типы и память.

Вопрос. std.ArrayList после append — старый items slice "битый".

Ответ. После append, который переаллоцирует буфер, ранее сохранённые slice из items недействительны. Храните индексы, а не указатели внутрь списка. Подробнее здесь — простые приложения.

Вопрос. Аргументы CLI: args[1] пустой, хотя передал параметры в командной строке.

Ответ. В Zig имя программы — args[0]; на Windows путь может включать кавычки. Используйте std.process.argsAlloc и проверяйте args.len. Подробнее здесь — простые приложения, первая программа.

Вопрос. zig fmt переставил импорты и отступы — можно отключить?

Ответ. Единый стиль — норма в экосистеме Zig; zig fmt перед коммитом обязателен в большинстве проектов. Настройка "своего" формата не предусмотрена. Подробнее здесь — основы.

Вопрос. zig test находит ноль тестов в файле с test "name" { }.

Ответ. Запускайте из каталога модуля: zig test file.zig или zig build test. Блоки test должны быть на верхнем уровне или в импортируемом файле. Подробнее здесь — функции и comptime.

Вопрос. Линковка с C-библиотекой: "undefined reference to foo".

Ответ. Объявите extern fn foo(...) callconv(.C) и добавьте библиотеку в build.zig через linkSystemLibrary или addObjectFile. Согласуйте calling convention. Подробнее здесь — архитектура.

Вопрос. Пришёл из Rust — жду borrow checker, а компилятор Zig молчит об use-after-free.

Ответ. Zig проверяет память слабее Rust — ответственность на разработчике и тестах. Для безопасности без GC смотрите Rust; Zig ближе к C с лучшими ошибками. Подробнее здесь — история, архитектура.

Вопрос. Пришёл из C — зачем !T, если можно вернуть -1?

Ответ. Error union заставляет обработать сбой на каждом уровне; код ошибки не смешивается с данными. Это замена errno + проверок. Подробнее здесь — основы.

Вопрос. Мини-TCP сервер из статьи не принимает второе подключение.

Ответ. Однопоточный accept обрабатывает клиентов по очереди. Для параллели нужны потоки OS или event loop — это уже архитектурный шаг. Подробнее здесь — простые приложения, архитектура.

Вопрос. Не понимаю, когда брать ArenaAllocator вместо GeneralPurposeAllocator.

Ответ. Arena удобна, когда много мелких аллокаций освобождаются разом (парсинг запроса, обработка файла). Один deinit arena освобождает всё. Подробнее здесь — типы и память, архитектура.

Вопрос. С чего начать после раздела — сразу писать свой OS или игровой движок?

Ответ. Сначала закрепите простые приложения: CLI, файлы, парсинг. Затем архитектура и один pet-project с build.zig. Системные темы — после уверенной работы с allocator и ошибками.

Вопрос. Что такое язык Zig и чем он отличается от C?

Ответ. Zig — системный язык с явной памятью, error union вместо errno и встроенной кросс-компиляцией; синтаксис проще C++, без препроцессора. Подробнее здесь — основы, история.

Вопрос. Zig или Rust — что выбрать новичку в 2025 году?

Ответ. Rust сильнее гарантирует безопасность памяти на этапе компиляции; Zig ближе к C по модели и проще войти, если уже знаете указатели. Сравнение подходов — архитектура, соседний раздел Rust.

Вопрос. Как установить Zig на Windows 10/11 пошагово?

Ответ. Скачайте zip с ziglang.org, распакуйте, добавьте папку в PATH, проверьте zig version в новом терминале. Подробнее здесь — первая программа.

Вопрос. Как скомпилировать Zig в exe без установленного Zig на другом ПК?

Ответ. zig build или zig build-exe даёт один исполняемый файл без внешнего runtime; для релиза укажите -Doptimize=ReleaseFast. Подробнее здесь — основы, архитектура.

Вопрос. Zig error handling — есть ли try catch как в Java?

Ответ. Исключений нет: функции возвращают !T, ошибки обрабатывают через try, catch и именованные error{...}. Подробнее здесь — основы, управляющие конструкции.

Вопрос. Как выделить память в Zig — пример allocator?

Ответ. Передайте std.mem.Allocator в функцию, вызовите allocator.alloc или allocPrint, освободите через free/defer. Шаблон — простые приложения, теория — типы и память.

Вопрос. Что такое comptime в Zig простыми словами?

Ответ. Код в блоке comptime выполняется при компиляции: можно считать типы, генерировать структуры и проверять константы до запуска программы. Подробнее здесь — функции и comptime.

Вопрос. Zig segfault при запуске — как отладить?

Ответ. Соберите с -O Debug, проверьте пару alloc/free, границы slice и указатели из C. Частая причина — use-after-free. Подробнее здесь — типы и память, простые приложения.

Вопрос. Можно ли писать на Zig вместо C для embedded и драйверов?

Ответ. Да, Zig таргетит bare-metal и кросс-компиляцию; нужна поддержка целевой платформы в toolchain. Начните с архитектуры и официальных примеров freestanding. Подробнее здесь — история.

Вопрос. Zig совместим с C — как вызвать C библиотеку?

Ответ. Объявите extern fn, подключите заголовок через @cImport или ручные типы, линкуйте в build.zig через linkSystemLibrary. Подробнее здесь — архитектура.

Вопрос. Как сделать HTTP сервер на Zig для начинающих?

Ответ. В std.net есть TCP и HTTP-примитивы; для учебы достаточно accept + чтение запроса. Минимальный сценарий — простые приложения, теория протокола — HTTP в энциклопедии.

Вопрос. Zig std.ArrayList пример — как добавить элемент?

Ответ. var list = std.ArrayList(T).init(allocator); defer list.deinit(); try list.append(item); — элементы в list.items. Подробнее здесь — простые приложения, типы.

Вопрос. Чем Zig отличается от Go для бэкенда?

Ответ. Go даёт GC и горутины "из коробки"; Zig — ручная память, нулевой runtime, максимальный контроль. Go быстрее в старте веб-сервиса, Zig — когда нужен C-подобный бинарник. Соседний раздел — Go.

Вопрос. Готов ли Zig к production — стабильна ли версия 1.0?

Ответ. Язык до 1.0: API между релизами может меняться; в проде фиксируйте версию компилятора и читайте release notes. Контекст — история, практика — архитектура.

Вопрос. Как читать аргументы командной строки в Zig?

Ответ. std.process.argsAlloc(allocator) и цикл по args[1..]; не забудьте argsFree. Пример калькулятора — простые приложения.

Вопрос. Zig fmt — зачем форматировать код перед коммитом?

Ответ. zig fmt — единый стиль без споров в code review, как gofmt в Go. Запускайте в CI и перед push. Подробнее здесь — основы.

Вопрос. Как написать unit test в Zig?

Ответ. Блок test "описание" { try expectEqual(...); } в том же файле, запуск zig test file.zig. Подробнее здесь — функции и comptime.

Вопрос. Zig slice vs array — в чём разница?

Ответ. Массив [N]T фиксированной длины на стеке; slice []T — указатель + длина на произвольный буфер. Подробнее здесь — типы и память.

Вопрос. Сколько времени учить Zig с нуля при знании Python?

Ответ. Базовый CLI и память — несколько недель при ежедневной практике; указатели и ошибки — главный порог. Маршрут — оглавление: 724103.

Вопрос. Есть ли у Zig аналог pip или cargo для пакетов?

Ответ. Зависимости подключают через build.zig.zon и менеджер сборки zig build, экосистема меньше, чем у Rust/npm. Обзор — архитектура, основы.

Вопрос. Zig заменяет CMake — нужен ли отдельный build system?

Ответ. Встроенный zig build описывает цели, зависимости и кросс-компиляцию на языке Zig вместо CMakeLists. Подробнее здесь — основы, архитектура.

Вопрос. Как вывести строку в консоль Zig — print vs std.debug.print?

Ответ. std.debug.print — форматированный вывод для отладки; в библиотеках чаще возвращают данные, а не печатают. Первая программа — 7.md.

Вопрос. Где бесплатно учить Zig на русском?

Ответ. Раздел энциклопедии IT-Universe: от первой программы до comptime с примерами под копирование. Официальная документация — на английском на ziglang.org.


Что запомнить

Zig — системный язык без скрытого runtime и сборщика мусора: память, ошибки и типы видны в коде. Он позиционируется как современная альтернатива C с кросс-компиляцией, comptime и единым toolchain (zig build, zig run, zig fmt, zig test).

Основные особенности Zig:

  • Явные аллокаторы — каждая функция, выделяющая память, получает std.mem.Allocator; defer/errdefer для освобождения.
  • Error union !T — ошибки как значения, без исключений; try, catch, именованные error{...}.
  • comptime — вычисления и генерация кода на этапе компиляции без препроцессора.
  • C-совместимость@import("c"), extern, @export, линковка с существующими библиотеками.
  • Кросс-компиляция — сборка под другую ОС/архитектуру из одного установленного Zig.

Типичный маршрут в разделе: первая программаосновытипы и памятьуправлениефункции и comptimeпростые приложенияархитектура.

Три практических правила:

  1. Каждому alloc — симметричный free или arena deinit.
  2. Каждый !T — явная обработка через try/catch, без unreachable в учебных заглушках.
  3. Перед коммитом — zig fmt и zig test.

Куда идти дальше

ТемаРаздел
Безопасность памяти на этапе компиляцииRust — о разделе
Python-подобный синтаксис, нативная сборкаNim — о разделе
Системное программирование в энциклопедииC++ — о разделе

Практика: простые приложения на Zig.


Основа по протоколу

Базовый разбор HTTP и HTTPS находится в отдельной статье — HTTP как основа веб-интеграций.


См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").