# Предисловие

Итак, поговорим о системном программировании. Это та часть разработки программного обеспечения, где вы работаете гораздо ближе к аппаратному обеспечению компьютера. От вас ожидается глубокое понимание того, как всё устроено «под капотом», тщательное управление памятью (или, по крайней мере, стремление к этому), а также работа с мельчайшими деталями, которые часто скрыты более простыми в использовании инструментами программирования. Это совершенно иной зверь по сравнению с обычным прикладным программированием и требует более глубокого уровня контроля и понимания.

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

В разработке ПО часто приходится идти на сложные компромиссы. Возможны такие варианты:

  • Высокоуровневая простота: быстро создавать приложения на языках, скрывающих «грязные» детали, часто полагаясь на автоматическое управление памятью (например, сборщик мусора), который может остановить вашу программу в самый неподходящий момент. Просто — пока не начнёт тормозить.
  • Низкоуровневый контроль: напрямую управлять памятью и ресурсами в C или C++, стремясь к максимальной скорости, но при этом тратя массу времени на поиск сложных ошибок, связанных с памятью. Мощно, но рискованно.
  • Постоянный баланс: пытаться совместить безопасность, производительность и простоту, но обычно нельзя идеально сочетать все три аспекта.

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

Информация в этой книге исходит из двух основных источников:

  • Мой собственный опыт работы с Zig, выяснение того, что работает, а что нет.
  • Наблюдение за распространёнными практиками и полезными паттернами, возникающими в сообществе Zig и официальных руководствах — всегда, конечно, с практической точки зрения.

Так почему стоит обратить внимание на Zig? Потому что проблемы, которые он пытается решить, реальны. Добиться стабильной высокой производительности ПО сложно. Писать безопасный низкоуровневый код — заведомо трудно. А работа с системами сборки часто напоминает борьбу с осьминогом. Zig предлагает иной подход: низкий уровень контроля в сочетании с лучшими функциями безопасности и более простыми инструментами по сравнению со «старой гвардией».

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

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

# Для кого эта книга

Эта книга предназначена для разработчиков с опытом профессионального программирования на протяжении примерно двух-трех лет. Вероятно, вы уверенно создаёте приложения на высокоуровневых языках и понимаете базовые концепции программирования: переменные, функции, циклы и, возможно, некоторые объектно-ориентированные идеи. Главное — у вас есть неугомонное любопытство к тому, что действительно происходит «под капотом», и вы готовы (или даже смирились) покинуть тёплые объятия автоматического управления памятью ради изучения работы на более низком уровне. Строго говоря, предварительное знание системного программирования или языка C/C++ не требуется, но готовность разбираться с новыми, иногда сложными концепциями — обязательна.

# Что вы найдете в главах этой книги

  • Глава 1: Безопасность прежде всего закладывает основу для понимания причин появления Zig, проблем, которые он решает, и того, как он обещает производительность без паники, контроль без хаоса и простоту без потери мощности.
  • Глава 2: Настройка вашей площадки помогает подготовить среду разработки: установка Zig, настройка ZLS и отрезвляющий тест для отделения будущих волшебников, владеющих Zig от пещерных людей.
  • Глава 3: Ваша первая программа на Zig разбирает классический «Hello, World!», чтобы научить вас настройке проекта, работе с переменными, базовой отладке и особенному отношению Zig к строкам.
  • Глава 4: Поток управления, циклы и другие формы цифрового доминирования вручает вам книгу заклинаний для управления кодом через условные операторы (if/else/switch), циклы (for/while), исчерпывающие switch-case и работу с опциональными типами — ведь коду нужен моральный компас.
  • Глава 5: Функции для эффективного программиста показывает, как упаковывать повторяющийся код в переиспользуемые единицы: объявление функций, параметры, возвращаемые значения и очень полезный defer, а также управление областью видимости с помощью блоков.
  • Глава 6: Обработка ошибок исследует довольно категоричную философию Zig, где ошибки — полноправные граждане: наборы ошибок (error sets), объединения (unions), tagged unions, try/catch и трассировка ошибок.
  • Глава 7: Тестирование вашего кода на Zig признаёт реальность: ваш код вряд ли идеален. Вводится std.testing, структура юнит-тестирования, утверждения (assertions) и даже измерение покрытия кода тестами с помощью внешних инструментов.
  • Глава 8: Организация данных погружается в базовые техники структурирования данных в Zig: массивы фиксированного размера, гибкие срезы (slices) и пользовательские типы данных с помощью struct.
  • Глава 9: Управление памятью затрагивает иногда пугающую тему указателей: стек и куча (heap), стратегии выделения памяти (allocation strategies), время жизни (lifetime), типы нулевого размера (zero-sized types) и преобразование типов (type conversion/casting).
  • Глава 10: Стандартная библиотека проводит вас по стройной, но мощной std: распространённые структуры данных (ArrayList, HashMap), файловый ввод-вывод (file I/O), форматирование строк (std.fmt), утилиты памяти (std.mem), случайные числа и время.
  • Глава 11: Сборка затягивает вас в явную и мощную систему сборки Zig: zig init, скрипт build.zig, зависимости (build.zig.zon, zig fetch и хэши), кросскомпиляция (cross-compilation), режимы релиза (release modes), кэширование и незаменимый zig build --watch — ведь Makefiles — пережитки тёмных времён.
  • Глава 12: Продвинутые темы даёт вводный обзор более сложных возможностей Zig: магия времени компиляции (comptime), «сырые» потоки ОС (raw OS threads) и синхронизация (synchronization), а также тонкое искусство взаимодействия с C.
  • Глава 13: Zig в реальном мире применяет ваши знания на практике при создании FileGuard — инструмента командной строки для мониторинга файлов: как структурировать реальное приложение, обрабатывать аргументы командной строки (CLI) и взаимодействовать с файловой системой.

# Как получить максимум от этой книги

Книга предполагает, что вы уже знаете основы программирования — переменные, циклы, функции и тому подобное. Мы не учим вас программировать с нуля. Вы также должны быть достаточно уверены в работе с компьютером для установки ПО (например, самого Zig) и не бояться покопаться в командной строке или переменной PATH вашей системы без риска случайно вызвать цифрового демона. Вам не нужна степень PhD по C++ или ассемблеру; любые знания системного программирования — бонус, а не требование. Главное — терпение, готовность думать иначе о памяти и контроле и принятие того факта, что сложные концепции мы будем разбирать шаг за шагом. Сначала нужно научиться ползать — прежде чем бегать (или писать код, который только выглядит так, будто может вызвать segfault).

Программное/аппаратное обеспечение Требования к операционной системе
Zig (последняя стабильная версия) Windows/macOS/Linux
Стандартный текстовый редактор/IDE Windows/macOS/Linux
Git (для получения зависимостей) Windows/macOS/Linux

Вам потребуется установить Zig и настроить Language Server (ZLS) для комфортной разработки. Вместо того чтобы отправлять вас самостоятельно искать инструкции по установке, мы подготовили подробное руководство SETUP_YOUR_ENV.md прямо в репозитории GitHub этой книги. Внимательно следуйте этим шагам для правильной настройки среды — это ваше первое упражнение в точном следовании инструкциям.

Имейте в виду: Zig всё ещё относительно молодой язык (на момент написания книги — до версии 1.0). Хотя он удивительно стабилен и пригоден к использованию, между релизами могут происходить изменения. Основные концепции останутся актуальными, но всегда сверяйтесь с официальной документацией для последних деталей.

# Примечание о версиях Zig и обновлениях кода

На момент написания и публикации этой книги последней стабильной версией Zig была 0.15. Язык развивается; будущие релизы могут внести изменения в примеры кода из книги.

Для самых свежих примеров кода и корректировок под конкретные версии обращайтесь к официальному репозиторию GitHub:

https://github.com/PacktPublishing/Learning-Zig

Если вы используете цифровую версию книги — рекомендуем набирать код вручную или брать его из репозитория GitHub книги (ссылка будет далее). Это поможет избежать ошибок при копировании-вставке.

# Скачать файлы примеров кода

Вы можете скачать файлы примеров кода для этой книги с GitHub по адресу https://github.com/PacktPublishing/Learning-Zig. Если код обновится — изменения появятся в этом репозитории.

У нас также есть другие пакеты кода из нашего каталога книг и видео на https://github.com/PacktPublishing/. Ознакомьтесь!

# Скачать цветные изображения

Мы также предоставляем PDF-файл с цветными изображениями снимков экрана/диаграмм из книги. Скачать его можно здесь: https://packt.link/gbp/9781835085127.

# Используемые соглашения

В книге используется ряд текстовых соглашений.

CodeInText: указывает кодовые слова в тексте: имена таблиц базы данных, папок/файлов/расширений файлов/путей/URL-адресов/ввода пользователя/Twitter/X-хэндлов. Например: «Смонтировать скачанный файл образа WebStorm-10*.dmg как ещё один диск в вашей системе».

Блок кода оформляется так:

const std = @import("std");

pub fn main() !void {
    var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
    defer arena.deinit();
    const allocator = arena.allocator();

    const message = try std.fmt.allocPrint(allocator,
        "Hello, {s}!", .{"world"});
    defer allocator.free(message);

    try std.io.getStdOut().writer().print("{s}\n", .{message});
}

Любой ввод или вывод командной строки пишется так:

$ zig build run
Hello, world!

Жирный шрифт: обозначает новый термин или важное слово либо слова на экране (например: «Если вам нужно включить маркер порядка байтов UTF-8 (BOM), Zig его тихо проигнорирует»).

# Связаться с нами

Мы всегда рады обратной связи от читателей.

Общие вопросы: если у вас есть вопросы о любой части книги или общие замечания — напишите нам на customercare@packt.com с названием книги в теме письма.

Ошибки: несмотря на все старания обеспечить точность содержания книги, ошибки случаются. Если вы нашли ошибку — сообщите нам через http://www.packt.com/submit-errata.

Пиратство: если вы обнаружили нелегальные копии наших работ в интернете — сообщите нам адрес или название сайта на copyright@packt.com со ссылкой на материал.

Если вы хотите стать автором: если у вас есть экспертиза по теме и вы хотите написать или внести вклад в книгу — посетите http://authors.packt.com/.

# Поделитесь мнением

Прочитав Learning Zig — расскажите о своих впечатлениях! Перейдите на страницу отзывов Amazon для этой книги по ссылке ниже.

Ваш отзыв важен для нас и технического сообщества; он поможет нам поддерживать высокое качество контента.