Что такое Zig?

Zig — это универсальный компилируемый язык программирования, предназначенный для создания надёжного, оптимального и многократно используемого программного обеспечения. Он был создан Эндрю Келли и впервые появился в 2015 году. Zig часто рассматривают как современную альтернативу C, унаследовавшую часть его синтаксиса, но включающую несколько современных функций и улучшений.

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

  • Статическая типизация: Zig является статически типизированным языком, что означает проверку типов переменных во время компиляции, а не во время выполнения.
  • Ручное управление памятью: В отличие от языков с автоматической сборкой мусора, Zig требует ручного управления памятью, подобно C и C++.
  • Оценка во время компиляции: Zig обладает мощными возможностями оценки во время компиляции, позволяя выполнять код на этапе компиляции с помощью ключевого слова comptime.
  • Обработка ошибок: Zig имеет уникальную систему обработки ошибок, основанную на явных типах ошибок и объединениях ошибок, что помогает создавать надёжный и безошибочный код.

Установка Zig

Чтобы начать работать с Zig, необходимо установить компилятор Zig. Его можно загрузить с официального сайта Zig или использовать менеджеры пакетов, такие как Homebrew на macOS.

# На macOS с использованием Homebrew
brew install zig

Простая программа «Hello, World!» на Zig

Вот простая программа «Привет, мир!» на Zig для начала работы:

const std = @import("std");

pub fn main() !void {
    const stdout = std.io.getStdOut().writer();
    try stdout.print("Hello, World!\n", .{});
}

Здесь используется функция std.io.getStdOut() для получения средства записи для стандартного вывода. Затем с помощью метода print() выводится сообщение «Привет, мир!».

Импорт модулей

В Zig импорт модулей прост. Вот как можно импортировать и использовать пользовательский модуль:

// models/user.zig
pub const User = struct {
    power: u64,
    name: []const u8,
};

// main.zig
const std = @import("std");
const User = @import("models/user.zig").User;

pub fn main() void {
    const user = User{
        .power = 9001,
        .name = "Пётр",
    };
    std.debug.print("{s} обладает силой {d}\n", .{user.name, user.power});
}

Этот пример определяет структуру User, которая затем импортируется в файл main.zig и используется для создания экземпляра в функции main(), выводящего информацию о пользователе.

Оценка во время компиляции

Одной из мощных особенностей Zig является возможность выполнения кода во время фазы компиляции с использованием ключевого слова comptime. Пример:

const std = @import("std");

pub fn main() void {
    comptime var x: u32 = 10;
    std.debug.print("Compile-time value: {d}\n", .{x});
}

Здесь значение переменной x определяется во время компиляции и затем выводится во время выполнения программы.

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

Система обработки ошибок в Zig основана на явных типах и объединениях ошибок. Пример:

const std = @import("std");

pub fn main() !void {
    const result = divide(10, 0);
    if (result) |value| {
        std.debug.print("Result: {d}\n", .{value});
    } else |err| {
        std.debug.print("Error: {s}\n", .{@errorName(err)});
    }
}

fn divide(a: i32, b: i32) !i32 {
    if (b == 0) return error.DivisionByZero;
    return a / b;
}

Функция divide() может возвращать либо значение, либо ошибку. В функции main() проверяется результат вызова функции divide(), и в зависимости от результата обрабатывается либо успешное выполнение, либо ошибка.

Это лишь некоторые основные аспекты языка программирования Zig. Для более глубокого изучения рекомендуется обратиться к официальной документации.