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

Ставим Zig, пишем первую программу и разбираем точку входа.

main — точка входа программы на Zig; компилятор сам находит публичную функцию pub fn main и делает её стартом исполнения.

Zig поставляется одним самодостаточным архивом: внутри и компилятор, и стандартная библиотека, и кросс-компилятор C. Скачайте бинарник с официального сайта ziglang.org или поставьте через менеджер пакетов, распакуйте и добавьте в PATH. Никакого рантайма устанавливать не нужно.

Проверяем установку

zig version
# 0.13.0

zig zen   # выводит «дзен» языка — его принципы

Команда zig zen печатает манифест ценностей языка: «Communicate intent precisely», «Edge cases matter», «Favor reading code over writing code». Это не шутка — эти принципы реально пронизывают дизайн.

Первая программа

Создайте файл hello.zig:

const std = @import("std");

pub fn main() void {
    std.debug.print("Привет, Zig!\n", .{});
}

Разберём строку за строкой. @import("std") — встроенная функция, которая подключает стандартную библиотеку и возвращает её как обычное значение, присвоенное константе std. Никаких #include и заголовочных файлов. pub fn main() void объявляет публичную функцию main, ничего не возвращающую. std.debug.print печатает форматную строку; второй аргумент .{} — пустой кортеж аргументов форматирования.

Сборка и запуск

zig build-exe hello.zig   # собирает бинарник hello
./hello

zig run hello.zig         # собрать и сразу запустить

Вывод:

Привет, Zig!

Как работает под капотом

Команда zig run компилирует исходник в нативный исполняемый файл и тут же запускает его — это удобно при разработке, но в результате получается настоящий машинный код, а не интерпретация. Фигурные скобки .{} — это анонимный структурный литерал, и Zig использует его повсюду, где нужно передать набор аргументов: форматирование, инициализация структур, опции конфигурации.

Частые ошибки

Новички забывают pub перед main — без него функция не видна как точка входа, и компилятор ругается. Другая ловушка — попытка написать print("текст") без второго аргумента: в Zig у print два параметра всегда, даже когда подставлять нечего, поэтому пишут .{}. Наконец, строки форматирования используют {} для подстановки, а буквальную фигурную скобку экранируют как {{.

Итог

  • Zig ставится одним архивом — компилятор и стандартная библиотека внутри.
  • @import("std") подключает стандартную библиотеку как обычное значение.
  • Точка входа — pub fn main; без pub программа не соберётся.
  • zig run file.zig компилирует и запускает; zig build-exe только собирает.
Проверьте себя
1. Зачем во втором аргументе std.debug.print пишут .{}?
AЭто комментарий
BЭто пустой кортеж аргументов форматирования — print всегда принимает два аргумента
CЭто указатель на null
DЭто конец строки
2. Что произойдёт, если убрать pub перед fn main?
AНичего, pub необязателен
BКомпилятор не найдёт точку входа и выдаст ошибку
CПрограмма запустится, но молча
Dmain станет приватной, но всё равно стартует