Перейти до вмісту

Zig

Матеріал з K2 ERP Wiki

errdefer allocator.free(memory);

pub fn add(a: u32, b: u32) u32 {

Рядки

Команда `zig build` запускає build script.; return a + b;

return value;

</syntaxhighlight> Суть прикладу: Zig-код виглядає близько до C-подібних мов, але має власну модель типів, помилок і compile-time можливостей.; while (i < 5) : (i += 1) {

std.debug.print("{}\n", .{i});

} </syntaxhighlight>

const Value = union(enum) {

  • викликати функцію;
  • якщо вона повернула помилку — повернути її з поточної функції;
  • якщо успіх — отримати значення.; };
* швидких web-застосунків;
* AI/ML;
* data science;
* frontend;
* великих enterprise-команд без systems-досвіду;
* задач, де потрібна величезна кількість готових бібліотек;
* проєктів, де memory safety важливіша за простоту й краще підходить Rust;
* команд, які не готові до manual memory management;
* прототипів, які швидше зробити на Python, Go або JavaScript.;<syntaxhighlight lang="zig">
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
Allocator передається явно, щоб код не приховував memory allocation.; const math = @import("math.zig");

* контролю пам’яті;
* відсутності прихованого runtime;
* pointers;
* inline assembly у відповідних сценаріях;
* cross-compilation;
* direct binary layout;
* low-level ABI control;
* простій інтеграції з C ABI.; Приклад:
== Zig і C++ ==
 .active = true,

<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">

<syntaxhighlight lang="zig">

<syntaxhighlight lang="zig">

== Structs ==

!; Приклад:

Pointers

`catch` надає можливість обробити помилку.;== C interop ==
counter.increment();

Висновок

{{SEO


  • логами;
  • temporary files;
  • ключами;
  • tokens;
  • credentials;
  • binary dumps;
  • crash reports;
  • memory buffers;
  • network payloads;
  • telemetry;
  • configuration files.; counter.increment();
text: [] const u8,
Приклад:

defer allocator.free(buffer);

<syntaxhighlight lang="zig">

 const result = add(2, 3);
== Приватність даних ==

const Status = enum { Zig добре підходить для: </syntaxhighlight>

Приклад:

const ptr = &value;

Optional type означає, що значення має змогу бути відсутнім.; Приклад:
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
 const name = "Alice";

 .blocked => "Blocked",

Але додатково вимагає дисципліни:

* використовувати `const` за замовчуванням;
* явно передавати allocator;
* звільняти пам’ять через `defer`;
* використовувати `errdefer` для partial initialization;
* писати тести;
* перевіряти edge cases;
* не приховувати помилки через необдуманий `catch`;
* обмежувати unsafe casts;
* контролювати lifetime pointers;
* документувати ownership;
* використовувати slices замість raw pointer + length, коли можливо;
* перевіряти binary input;
* профілювати перед оптимізацією;
* збирати в різних build modes;
* тестувати cross-platform behavior.;

</syntaxhighlight> </syntaxhighlight>

Comptime застосовується для:

std.debug.print("Name: {s}, count: {}\n", .{ name, count });

Приклад:

Обмеження Zig

</syntaxhighlight>

fn max(comptime T: type, a: T, b: T) T {
Запуск:

== Networking ==

 @cInclude("stdio.h");
};
</div>
const name = "Alice";
'''Перевага:''' Zig надає можливість писати низькорівневий код із явним контролем пам’яті, без garbage collector і без прихованих runtime-залежностей.; Tagged union поєднує union з enum tag.; closed,
const Counter = struct {
Це корисно для partial initialization.;== Undefined behavior ==
Union надає можливість зберігати одне з кількох можливих значень.; Файл зазвичай називається:
'''Практична роль:''' floating point потрібен для графіки, симуляцій, математики, сигналів і частини game development задач.;
const value = try getValue(true);
var value: u32 = 10;

</div>

const testing = std.testing;
{| class="wikitable"

var counter: u32 = 0;
</div>
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">

 .new => "New",
var maybe_value: ?u32 = null;
zig build-exe main.zig -target x86_64-linux

Помилка: вважати Zig “безпечним C без відповідальності”.; Перевага: enum робить допустимі стани явними й обмеженими відомим набором значень.; Критерій

Methods у struct

Zig має вбудовану підтримку тестів.; це сучасна системна мова програмування, розроблена; додатково реалізовано контролю пам’яті, передбачуваного виконання, cross-compilation, embedded-систем, інтеграції з C і створення продуктивного програмного забезпечення без прихованої магії виступає ключовою рисою низькорівневої розробки забезпечується через Zig.; Її сила — у системному, низькорівневому й продуктивному коді.; * відсутності GC;

  • явному контролю пам’яті;
  • cross-compilation;
  • функціональні можливості працювати без стандартного runtime;
  • low-level pointers;
  • контролю layout;
  • comptime;
  • інтеграції з C;
  • малим binary у відповідних режимах.;
  • `@import`;
  • `@This`;
  • `@TypeOf`;
  • `@sizeOf`;
  • `@alignOf`;
  • `@compileError`;
  • `@intCast`;
  • `@bitCast`;
  • `@ptrCast`.; Помилки є собою частиною типу.;

</syntaxhighlight>

std.debug.print("Result: {}\n", .{result});

Практична порада: Zig варто обирати, коли потрібен контроль над пам’яттю, платформою, binary і build-процесом.;</syntaxhighlight>

Перевага синтаксису: Zig робить багато речей явними: пам’ять, помилки, типи, compile-time логіку й platform-specific поведінку.; Перевага: тести є собою частиною стандартного Zig workflow, а не зовнішньою надбудовою.; Приклад:

Error union

fn run() !void {

Поширені типи:

std.debug.print("No value\n", .{});

</syntaxhighlight>

Unions

Якщо значення не має змінюватися, краще використовувати `const`.; Zig

defer file.close();

істотно: Zig сильний у своїй ніші, але не є собою універсальною заміною всім мовам для всіх типів проєктів.; Якщо потрібна пам’ять — allocator має бути явним.;== Game development ==

const part = numbers [1..4];

  • cross-compilation C-проєктів;
  • спрощення toolchain;
  • збірки залежностей;
  • embedded targets;
  • portable builds;
  • CI/CD.; pub fn main() void {

}

Приклад:

};

Доступ: Zig має сильну інтеграцію з C.; Практична роль: Zig цікавий для game tooling і engine-level коду, де важливі контроль ресурсів і продуктивність.; zig build-exe main.zig -target x86_64-windows Zig має змогу використовуватися в game development, особливо для:

std.debug.print("Error: {}\n", .{err});

Тематичні мітки

Приклади:

  • native binary;
  • швидкий запуск;
  • cross-compilation;
  • контроль залежностей;
  • невеликий runtime;
  • продуктивність;
  • прості deployment artifacts.; Практична роль: Zig modules прості: імпорт файлів і явний `pub` для публічного API.; const y = identity([] const u8, "hello");

Zig має C-подібний, але більш строгий і явний синтаксис.; * Zig Language Reference.; Zig часто розглядають як альтернативу C для частини системних задач.; Програміст сам контролює виділення й звільнення пам’яті.;</syntaxhighlight> const std = @import("std");

!; * Документація щодо embedded development, systems programming, memory management і low-level security practices.;
 const value = try getValue(true);
 if (!found) return MyError.NotFound;

Zig-програми можуть бути CLI-утилітами, сервісами, embedded-компонентами або системними інструментами, які працюють із чутливими даними.; zig build run
 }
fn identity(comptime T: type, value: T) T {
<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">

fn multiply(a: u32, b: u32) u32 {

const value = getValue(false) catch |err| {
=== Додавання чисел ===
Приклад ідеї:

const std = @import("std");

== Типові помилки початківців ==

'''Практична роль:''' builtins дають доступ до можливостей компілятора, типів, memory layout і compile-time перевірок.;<syntaxhighlight lang="zig">

const std = @import("std");
Використання:
 } else {

<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">

* generics;
* code generation;
* type reflection;
* configuration;
* compile-time validation;
* optimized abstractions;
* replacement for macros/templates у частині задач.; '''Практична роль:''' Zig добре підходить для проєктів, де потрібно працювати з існуючим C-кодом, а не переписувати все одразу.; '''Висновок:''' Python зручний для швидкої розробки й автоматизації, а Zig  для продуктивних native-компонентів і низькорівневого коду.; Zig

 int_value: i64,
== Zig і Rust ==
Structs використовуються для:

const price: f64 = 19.99;

 InvalidInput,

== Загальний характеристика ==

== Loops ==
Zig має чітку систему типів.; try testing.expect(add(2, 3) == 5);

 if (maybe_value) |value| {

Zig як C compiler

const MyError = error { Виклик:

var counter = Counter { .value = 0 };

Zig і C

return if (a > b) a else b;

</syntaxhighlight>

</syntaxhighlight>

Allocators

</syntaxhighlight>

} fn greet(name: [] const u8) void { const std = @import("std"); } else {

</div>
 }

Zig має обмеження.; Явний тип:
!;

test "addition works" {

 active,
</div>

const message = switch (status) {

</div>
const User = struct {
Умови в Zig є собою виразами.;== Джерела ==

* `@import("std")` підключає стандартну бібліотеку;
* `pub fn main()` оголошує точку входу;
* `void` означає, що функція не повертає значення;
* `std.debug.print` виводить текст;
* `.{}`  tuple literal для аргументів форматування.; Zig
== переважні аспекти Zig ==
Приклад:

}

Практична роль: arrays корисні, коли розмір відомий на етапі компіляції.; * Zig Standard Library documentation.; Enum описує набір іменованих значень.; const active: bool = true; Використання:

|- | Типізація | Статична | Динамічна |- | Виконання | Native compiled | Інтерпретований runtime |- | Основна ніша | Systems programming | Automation, web, data science, AI, scripting |- | Пам’ять | Manual | Garbage-collected |- | Прототипування | Повільніше | Дуже швидке |}

Zig має змогу бути не найкращим вибором для:

Zig і Python

const status = Status.active;

Приклад:

const memory = try allocator.alloc(u8, 1024);

  • простий системний синтаксис;
  • відсутність garbage collector;
  • явні allocators;
  • сильна cross-compilation;
  • C interop;
  • comptime;
  • вбудований build system;
  • error handling без exceptions;
  • optional values;
  • контроль memory layout;
  • придатність для embedded;
  • native binaries;
  • корисний tooling;
  • зрозуміла модель низькорівневого коду;
  • можливість поступової інтеграції з C.; Приклад ідеї:

fn add(a: u32, b: u32) u32 {

Manual memory management

!; `&value` отримує pointer.; * молода програмний пакет;

  • менше бібліотек, ніж у C, C++, Rust, Go або Python;
  • менша кількість розробників;
  • потреба в manual memory management;
  • не така сильна compile-time memory safety, як у Rust;
  • API мови й стандартної бібліотеки можуть змінюватися;
  • не найкращий вибір для web CRUD;
  • не основна мова для AI/ML;
  • вищий поріг входу для тих, хто не працював із системним кодом;
  • відповідальність за lifetime і ownership залишається на програмісті.;</syntaxhighlight>

Для чисел із плаваючою комою використовуються `f32` і `f64`.; Приклад ідеї:

value: u32,

}

if і switch

  • імпортувати C headers;
  • викликати C-функції;
  • лінкувати C-бібліотеки;
  • компілювати C-код через Zig toolchain;
  • поступово замінювати C-компоненти;
  • писати wrappers.; Zig часто порівнюють із C.; * Zig build system documentation.; _ = c.printf("Hello from C\n");

const max_users = 100;

 blocked,

<syntaxhighlight lang="zig">
<syntaxhighlight lang="zig">
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">

 NotFound,
 var count: u32 = 10;
'''Критично:''' Zig дає сильний контроль над пам’яттю, але не звільняє програміста від відповідальності за lifetime і ownership.; Критерій

</div>

'''Практична роль:''' Zig не приховує розмір числових типів, що істотно для embedded, binary formats і системного коду.; fn getValue(found: bool) MyError!u32 {

Приклад параметра:

</div>
!;
Build system застосовується для: const x: f32 = 1.5; const first = values [0]; Slices часто використовуються для:
; const age: u32 = 25;

Особливості синтаксису:

<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">

<syntaxhighlight lang="bash">

</div>

Приклад `if`:
'''Практична порада:''' у Zig варто за замовчуванням використовувати `const`, а `var`  лише тоді, коли значення справді змінюється.; Тип рядкового літерала пов’язаний із байтовими даними, а для багатьох функцій застосовують, коли потрібно `[] const u8`.; var counter = Counter { .value = 0 };

Zig можна використовувати для мережевого програмування.;<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
== Modules ==
 self.value += 1;

== Slices ==

}

{| class="wikitable"
name: [] const u8,
'''Практична роль:''' `switch` добре поєднується з enums і tagged unions, роблячи обробку станів явно структурованою.;</div>
</div>

`switch`:
'''істотно:''' Zig не є собою мовою для “оперативно написати будь-який застосунок”.; Функція явно показує, що має змогу завершитися помилкою.; Типові режими:
'''істотно:''' Zig цікавий не лише як мова, а й як інструментальна платформа для збірки й cross-compilation.; Вона не має garbage collector, не використовує exceptions, робить allocations явними й пропонує потужний `comptime` для compile-time виконання й generic-коду.; `defer` виконує код при виході з scope.; Її сила  у явності, comptime, allocators, C interop і передбачуваній системній розробці.;</div>

const value = Value { .int_value = 42 }; var gpa = std.heap.GeneralPurposeAllocator(.{}){};

Приклад:

Module має змогу експортувати functions, structs, constants.; Головна сила Zig: compile-time code execution надає можливість створювати гнучкі abstractions без окремої macro-системи.;
Array у Zig має фіксований розмір, який є собою частиною типу.; Підказка: у Zig-прикладах істотно дивитися на типи, allocator, lifetime, error handling і те, що саме відбувається на compile time.;

Типи даних

Zig має `while` і `for`.; defer arena.deinit();

`defer` часто застосовується для:

self.value += 1;

Підключення: const letter: u8 = 'A'; Головна думка: Zig — це мова для програмістів, які хочуть низькорівневий контроль без зайвої складності.; Arena allocator виділяє багато об’єктів і звільняє їх усі разом.;== Zig і Go ==

};

<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">

<syntaxhighlight lang="bash">

* створення системних бібліотек;
* написання CLI-інструментів;
* embedded firmware;
* cross-compilation;
* заміна C у невеликих або критичних компонентах;
* високопродуктивні сервери;
* парсери;
* мережеві утиліти;
* компілятори;
* tools для build і deployment;
* експерименти з operating systems;
* memory-sensitive software;
* WASM-модулі;
* game development infrastructure.; counter += 1;

ptr.* = 20;

Приклади:

 .closed => "Closed",

</div>
Zig має змогу використовуватися для WebAssembly.;<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">
<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">
'''Практична роль:''' `try` робить поширення помилок явним, але компактним.;== Floating point ==
Zig має різні режими оптимізації й перевірок, які впливають на safety checks і продуктивність.; Вона не намагається приховати низькорівневі деталі.; }

Основні переважні аспекти Zig:

pub fn main() void {

zig build-exe main.zig -target aarch64-macos

* системного програмування;
* embedded development;
* low-level libraries;
* runtime-компонентів;
* CLI tools;
* компіляторів;
* game engines;
* network services;
* operating system experiments;
* драйверів і firmware;
* інструментів розробника;
* cross-platform software;
* заміни окремих C-компонентів;
* інтеграції з C-бібліотеками;
* performance-critical modules.; Критерій
 std.debug.print("Hello, {s}\n", .{name});

Приклад `while`:
`GeneralPurposeAllocator` часто використовують під час розробки, бо він має змогу допомагати виявляти проблеми пам’яті.; Водночас Zig потребує дисципліни: manual memory management, allocator ownership, lifetime, pointers і unsafe interop залишаються відповідальністю програміста.;
}
<div style="background:#fef2f2; border-left:6px solid #ef4444; padding:12px; margin:12px 0;">
'''Практична роль:''' Zig має змогу бути хорошим вибором для утиліт, які потрібно поширювати як один native executable.; pub fn increment(self: *Counter) void {

 std.debug.print("No value\n", .{});
У Zig пам’ять часто виділяється через explicit allocator.; if (!found) return MyError.NotFound;
Zig застосовується в експериментах із operating system development і low-level runtime.; Zig

'''Практична роль:''' вибір режиму збірки впливає на перевірки, швидкість, розмір binary і поведінку при помилках.; Приклад:
<div style="background:#eef2ff; border-left:6px solid #4f46e5; padding:12px; margin:12px 0;">
Типові задачі:

const numbers = [_] u32 { 1, 2, 3, 4, 5 };

<syntaxhighlight lang="zig">

const user = User {

Приклад:
== Синтаксис ==
<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">

== Generics через comptime ==
Zig має змогу збирати код для різних target platforms.; '''Головна ідея пам’яті:''' Zig не виділяє heap-пам’ять непомітно.; Приклад:
'''Головне правило:''' хороший Zig-код має бути явним у пам’яті, помилках, ownership, build-налаштуваннях і platform assumptions.; Вона підходить для задач, де важливі продуктивність, контроль ресурсів, передбачуваність і можливість працювати близько до операційної системи або апаратного забезпечення.; pub fn main() void {

'''Практична роль:''' optional values роблять відсутність значення явною частиною типу, а не прихованою домовленістю.; Zig має змогу допомогти з частиною помилок, але безпека залежить від архітектури й дисципліни.; '''Практична роль:''' `errdefer` сприяє коректно звільняти ресурси, якщо ініціалізація об’єкта або операції не завершилися успішно.;</div>
<syntaxhighlight lang="zig">
== catch ==

!; '''Практична роль:''' Zig має змогу бути корисним у firmware, microcontroller experiments, bare-metal і низькорівневих embedded-компонентах.;</div>
'''Увага:''' Zig не приховує, що рядки  це байти.; * Матеріали щодо comptime, allocators, error handling, C interop і cross-compilation.; }
</div>
=== Обробка optional value ===

'''Увага:''' pointers дають низькорівневий контроль, але вимагають уважності до lifetime, mutability і aliasing.; const size = @sizeOf(u64);

== Safety modes ==

const std = @import("std");

* TCP/UDP utilities;
* HTTP parsers;
* proxy components;
* custom protocols;
* network services;
* binary protocol handling;
* high-performance I/O;
* observability agents.; '''Zig'''  це сучасна системна мова програмування, орієнтована на простоту, явність, контроль пам’яті, cross-compilation, C interop і низькорівневу розробку.;</div>
Zig не має garbage collector.;</div>
const size: usize = 1024;
!; Не варто приховувати помилку значенням за замовчуванням без причини.; '''Практична роль:''' Zig build system зменшує залежність від окремих build tools і надає можливість описувати build логіку самою мовою Zig.;
  • статусів;
  • режимів;
  • token types;
  • parser states;
  • protocol states;
  • команд;
  • finite state machines.; У Zig methods зазвичай є собою функціями всередині struct, які приймають `self`.;</syntaxhighlight>

}; Критично: Zig зменшує частину ризиків C-подібного коду, але не робить низькорівневе програмування автономно безпечним.; !; Це корисно для: for (numbers) |number| {

'''Практична роль:''' GeneralPurposeAllocator корисний для звичайних застосунків і debugging memory issues.; Можливі проблеми:
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);

const testing = std.testing;

<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">

* engine components;
* memory allocators;
* asset pipelines;
* tools;
* rendering experiments;
* physics modules;
* performance-critical systems;
* C library integration;
* cross-platform builds.; }
</div>
 const maybe_value: ?u32 = 42;

Struct із method

  • не розуміти різницю між array і slice;
  • забувати звільняти пам’ять;
  • неправильно використовувати allocator;
  • повертати pointer на локальні інформаційні дані;
  • ігнорувати error unions;
  • зловживати `catch unreachable`;
  • плутати optional і error union;
  • не враховувати lifetime slices;
  • робити небезпечні casts без потреби;
  • не тестувати release modes;
  • очікувати високорівневий runtime;
  • писати Zig як C без використання можливостей мови;
  • не документувати ownership.;== Build system ==
  • parsing;
  • temporary data;
  • request lifecycle;
  • compiler phases;
  • batch processing;
  • ситуацій, де всі об’єкти мають однаковий lifetime.; Zig намагається робити небезпечні речі більш явними, але низькорівневий код усе одно має змогу мати undefined або platform-specific поведінку.;

</syntaxhighlight>

Тип `MyError!u32` означає: або помилка, або `u32`.;</syntaxhighlight>

Integer types

</syntaxhighlight>

Практична роль: structs є собою базовим способом опису власних типів і структурованих даних у Zig.;== Operating systems ==

  • Debug;
  • ReleaseSafe;
  • ReleaseFast;
  • ReleaseSmall.; Практична роль: `zig build` є собою стандартною точкою входу для збірки, тестування й запуску Zig-проєкту.; * Офіційна документація Zig.; Критерій

</syntaxhighlight>

Це можливо завдяки наявності:

std.debug.print("Counter: {}\n", .{counter.value});

const allocator = arena.allocator();

Див.; додатково

`u` означає unsigned integer.; value: u32,

  • компіляції;
  • тестів;
  • targets;
  • optimization modes;
  • cross-compilation;
  • linking;
  • dependencies;
  • build steps;
  • custom commands.; });
zig build test
 .name = "Alice",

<syntaxhighlight lang="zig">

<syntaxhighlight lang="zig">

const MyError = error {
 active: bool,
'''Практична роль:''' tagged unions зручні для AST, parser results, protocol messages і значень різних типів.; Go
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">

<syntaxhighlight lang="zig">

== defer ==
  • memory leaks;
  • use-after-free;
  • buffer overflows;
  • integer overflows;
  • pointer casts;
  • unsafe C interop;
  • input validation;
  • binary parsing;
  • network input;
  • race conditions;
  • secret handling;
  • file permissions;
  • build dependencies;
  • platform-specific behavior.;

} Сценарії:

Використання:

'''істотно:''' мережевий код на Zig вимагає уважної роботи з буферами, помилками, timeout, partial reads і безпекою input.; }

const x = identity(u32, 42);
== Arrays ==

переважні аспекти:

zig test main.zig var i: u32 = 0;

pub fn main() !void { У цьому прикладі:

const allocator = std.heap.page_allocator;

const y: f64 = 3.1415926535;

pub fn main() void {

Використання:

 new,
<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">

</syntaxhighlight>

const buffer = try allocator.alloc(u8, 1024);
 return 42;
Приклад:
'''Struct''' групує поля.;== zig test ==
</div>
== Коли Zig має змогу бути невдалим вибором ==

У Zig файл має змогу бути module.; '''Головна ідея:''' у Zig помилки не приховані.;== Перша програма на Zig ==
== Безпека Zig-коду ==
<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">

zig build

</div>
</div>
}

'''істотно:''' fallback через `catch` має бути свідомим.; '''Практична роль:''' Zig не має класичної OOP-моделі, але structs із функціями дозволяють організовувати пов’язану логіку.; const values: [3] u8 = .{ 10, 20, 30 };
Простий приклад:
Перевірка:
Приклади:
};
'''Головна перевага:''' Zig робить cross-compilation значно простішою для багатьох системних і CLI-проєктів.; '''Висновок:''' Go частіше зручний для backend і cloud tooling, а Zig  для низькорівневого контролю, embedded і системних компонентів.; Вона надає можливість виконувати код на етапі компіляції.; !;== try ==
 NotFound,

const allocator = gpa.allocator();
== Хороші практики Zig ==
<div style="background:#fff7ed; border-left:6px solid #fb923c; padding:12px; margin:12px 0;">
}
Типові сценарії використання Zig:
== Cross-compilation ==

}

* доменних об’єктів;
* конфігурацій;
* state;
* parsed data;
* binary layouts;
* API structures;
* embedded data;
* компонентів системи.;
Slice має pointer і length.;
Правило: у системному коді приватні інформаційні дані можуть залишатися в пам’яті, логах або core dumps, з цієї причини їх потрібно обробляти свідомо.;

</syntaxhighlight>

Приклад:

Zig добре підходить для CLI-утиліт, embedded, системних бібліотек, performance-critical компонентів, binary protocols, WebAssembly, operating system experiments і поступової заміни частини C-коду.; const numbers = [_] u32 { 1, 2, 3, 4, 5 };

Ризики:

age: u32,

</syntaxhighlight>

std.debug.print("Hello, world!\n", .{});
return;
return a + b;
<syntaxhighlight lang="zig">
const c = @cImport({
<syntaxhighlight lang="zig">

Рекомендовано:

Zig має built-in функції, які починаються з `@`.;<syntaxhighlight lang="zig">

Поширені помилки:
Приклад:
<div style="background:#eef2ff; border-left:6px solid #4f46e5; padding:12px; margin:12px 0;">
== Error handling ==

== CLI tools ==

* закриття файлів;
* звільнення пам’яті;
* cleanup;
* release locks;
* rollback локальних ресурсів.;

}

; Unicode, encoding і text processing потрібно обробляти свідомо.; C++
{| class="wikitable"
{| class="wikitable"
Zig добре підходить для CLI-утиліт.; Потрібно обережно працювати з:
<syntaxhighlight lang="text">

'''Практична роль:''' Zig generics є собою compile-time механізмом, який надає можливість писати reusable код без runtime overhead.; !; Zig має власну build system, яка описується кодом Zig.; Zig

Приклад `for`:

</div>

</div>
Zig має явні integer types.;== WebAssembly ==
Приклад:
 }

</div>

Zig і Python мають дуже різні ролі.; Zig toolchain має змогу використовуватися як компілятор C/C++ у певних сценаріях.; Rust
|-
| Memory safety
| Більше відповідальності на програмісті, явні allocators
| Ownership і borrow checker
|-
| Складність
| Простіша модель мови
| Складніша платформа типів і ownership
|-
| Runtime
| Без GC
| Без GC
|-
| Generics
| comptime
| traits/generics
|-
| C interop
| Дуже сильний фокус
| додатково сильний, але інша модель
|-
| Ніша
| Простий low-level контроль, C replacement, tooling
| Memory-safe systems programming, concurrent safety
|}

}

Коли варто використовувати Zig

const і var

zig build

</syntaxhighlight>

Основна ніша Systems programming, embedded, low-level Backend services, cloud tools, CLI
Memory management Manual через allocators Garbage collector
Runtime Мінімальний Go runtime
Concurrency Низькорівневіші підходи Goroutines і channels
Deployment Native binary Native binary
<syntaxhighlight lang="zig">
 std.debug.print("Value: {}\n", .{value});

!; Одна з сильних сторін Zig  cross-compilation.; Zig  це мова для systems programming.; if (maybe_value) |value| {

const result = max(u32, 10, 20);

<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">
== Builtins ==
'''Висновок:''' C++ має ширшу екосистему й більше можливостей, але Zig приваблює простішою моделлю й явним low-level підходом.;<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">

* systems programming;
* embedded development;
* CLI tools;
* cross-platform native binaries;
* C interop;
* custom allocators;
* performance-critical components;
* parsers;
* binary protocols;
* runtime libraries;
* build tools;
* operating system experiments;
* WebAssembly modules;
* low-level infrastructure;
* поступової заміни частини C-коду.; float_value: f64,

== Для чого застосовується Zig ==

* неправильні pointers;
* invalid casts;
* out-of-bounds;
* use-after-free;
* data races;
* incorrect alignment;
* integer overflow у певних режимах;
* unsafe interop з C.; Python
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
const std = @import("std");

</div>
'''істотно:''' у системному коді неправильний вибір integer type має змогу призвести до overflow, помилок індексації або platform-specific багів.;<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">

* `const` для незмінних значень;
* `var` для змінних значень;
* явні типи там, де потрібно;
* немає прихованих allocations;
* немає exceptions;
* немає garbage collector;
* помилки є собою частиною типу;
* compile-time execution через `comptime`;
* builtins починаються з `@`.; Zig сприяє, але низькорівневі помилки все одно можливі.; pub fn increment(self: *Counter) void {

<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">
 .age = 25,

};
const numbers = [_] u32 { 1, 2, 3 };
<div style="background:#fdecea; border-left:6px solid #e74c3c; padding:12px; margin:12px 0;">

};

}
pub fn main() void {
`try` повертає помилку вище, якщо вона сталася.;

Zig має pointers і вимагає явної роботи з ними.; Приклад ідеї: const std = @import("std");

`usize` застосовується для розмірів і індексів, пов’язаних з адресним простором платформи.;
* не забувати `free`;
* уникати use-after-free;
* контролювати ownership;
* не повертати pointer на тимчасові інформаційні дані;
* тестувати leaks;
* перевіряти lifetime.;<syntaxhighlight lang="zig">
const std = @import("std");

Comptime

Slice — це view на послідовність елементів.; maybe_value = 42; У Zig generics реалізуються через `comptime` parameters.;</syntaxhighlight>

Optional values

Приклад:

  • `bool`;
  • `u8`, `u16`, `u32`, `u64`;
  • `i8`, `i16`, `i32`, `i64`;
  • `usize`;
  • `isize`;
  • `f32`;
  • `f64`;
  • arrays;
  • slices;
  • structs;
  • enums;
  • unions;
  • optionals;
  • error unions;
  • pointers.; Практична роль: Zig підходить для WASM, коли потрібен низькорівневий контроль і компактний compiled module.; pub fn main() void {

}

Можна:
`errdefer` виконується лише тоді, коли scope завершується помилкою.; Окремо варто відзначити але робить роботу з пам’яттю, помилками, компіляцією й платформами більш явною і контрольованою.; C
 return a * b;
<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">

завдяки наявності '''Практична роль:''' `defer` користувачі можуть не забути cleanup навіть при ранньому виході з функції.;== Приклади задач на Zig ==

У Zig `const` означає незмінне binding, а `var`  змінне.;

</syntaxhighlight>

Висновок: Rust сильніший у compile-time memory safety, а Zig робить ставку на простоту, явність, comptime і контроль без borrow checker.;== Embedded systems == Висновок: C має величезну legacy-екосистему, а Zig пропонує сучасніший підхід до частини системних задач із кращою явністю й tooling.; fn add(a: u32, b: u32) u32 { const b: i32 = -100; Приклад:

Arena зручна для:

!;== Enums ==

'''Практична роль:''' Zig має змогу використовуватися для kernels, bootloaders, runtime-компонентів і low-level experiments.; * контроль продуктивності;
* передбачуваність;
* придатність для embedded;
* відсутність GC-пауз;
* можливість custom allocators;
* явну модель ресурсів.; test "multiply works" {

'''Критично:''' Zig-код, який функціонує з мережею, файлами, binary formats або C-бібліотеками, потребує ретельного security review.;== Arena allocator ==

<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
Enums корисні для:
};
<syntaxhighlight lang="zig">
|-
| Філософія
| Простота, явність, comptime
| Потужна, складна, багатопарадигмальна мова
|-
| OOP
| Немає класичної OOP-моделі
| Класи, inheritance, templates
|-
| Generics
| comptime
| templates/concepts
|-
| Runtime
| Мінімальний, без GC
| Залежить від використаних можливостей
|-
| Складність
| Менша за C++ у багатьох аспектах
| Дуже висока
|}

=== Тест ===
Zig підходить для embedded-сценаріїв завдяки наявності:
const a: u8 = 255;

== GeneralPurposeAllocator ==

build.zig

'''Практична роль:''' цикли Zig прості й передбачувані, що істотно для низькорівневого коду.; !;</div>
<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">
const value = getValue(false) catch 0;
== errdefer ==

</div>

Це дає:

* буферів;
* рядків;
* масивів невідомої довжини;
* function parameters;
* parsing;
* binary data;
* input/output.;<div style="background:#eef2ff; border-left:6px solid #4f46e5; padding:12px; margin:12px 0;">
У Zig немає exceptions.; Це короткий спосіб:
</div>
<syntaxhighlight lang="zig">

 .active => "Active",

Потрібно контролювати:

'''істотно:''' arena allocator спрощує cleanup, але має змогу збільшити пікове споживання пам’яті, якщо використовувати його без контролю.; Приклад:

У Zig рядок зазвичай є собою slice байтів.;<syntaxhighlight lang="bash">

 std.debug.print("Value: {}\n", .{value});
const Counter = struct {
const std = @import("std");
}
|-
| Рівень
| Systems programming
| Systems programming
|-
| Пам’ять
| Manual memory management через явні allocators
| Manual memory management через malloc/free та інші підходи
|-
| Помилки
| Error unions без exceptions
| Return codes, errno, custom conventions
|-
| Generics
| Через comptime
| Через macros або manual patterns
|-
| Build / cross-compilation
| Сильна вбудована супровід
| Залежить від toolchain
|-
| програмний пакет
| Молодша
| Дуже велика й історична
|}

const result = if (value > 0) "positive" else "zero or negative";
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
'''Суть slice:''' slice не володіє пам’яттю, а лише посилається на частину існуючих даних.; const T = @TypeOf(42);

<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">

 std.debug.print("{}\n", .{number});
<syntaxhighlight lang="zig">

<div style="background:#fff7ed; border-left:6px solid #fb923c; padding:12px; margin:12px 0;">
 try testing.expect(multiply(3, 4) == 12);
fn getValue(found: bool) MyError!u32 {

Приклад:

</div>
defer _ = gpa.deinit();
</div>

додатково можна задати fallback:

 std.debug.print("Value: {}\n", .{value});

`ptr.*` розіменовує pointer.;

Головна перевага: Zig дає контроль C-подібного рівня, але з більш явною моделлю помилок, пам’яті, типів і компіляції.; Критерій

return 42;
return a + b;
};

`i` означає signed integer.;

}

'''comptime'''  одна з головних можливостей Zig.; '''Основна ідея:''' Zig дає програмісту низькорівневий контроль, але змушує явно працювати з пам’яттю, помилками, типами й етапом компіляції.;<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
Zig і Rust часто порівнюють як сучасні системні мови.;

const file = try std.fs.cwd().openFile("data.txt", .{});

Небезпека: найбільші помилки в Zig часто пов’язані не із синтаксисом, а з lifetime, allocator, ownership і unsafe interop.;

 std.debug.print("Value: {}\n", .{value});

Приклад:

<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">

<syntaxhighlight lang="zig">

* performance-critical browser modules;
* sandboxed computation;
* plugins;
* edge runtime;
* portable computation;
* embedded-like execution;
* integration with JavaScript.;</div>

 count += 1;

</div>

Zig застосовується для:
}
Приклад:

<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">

* [[Програмування]]
* [[Мова програмування]]
* [[Мова програмування C]]
* [[C++]]
* [[Rust]]
* [[Go]]
* [[Python]]
* [[Systems programming]]
* [[Embedded systems]]
* [[Memory management]]
* [[Manual memory management]]
* [[Cross-compilation]]
* [[WebAssembly]]
* [[CLI]]
* [[Operating system]]
* [[Game development]]
* [[C interop]]
* [[Налагодження коду]]
* [[Логування]]
* [[Безпека застосунків]]
* [[Приватність даних]]