Zig
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>
| ; 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`:
}
<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.;
}; Критично: 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
</syntaxhighlight> Тип `MyError!u32` означає: або помилка, або `u32`.;</syntaxhighlight> Integer types</syntaxhighlight> Практична роль: structs є собою базовим способом опису власних типів і структурованих даних у Zig.;== Operating systems ==
</syntaxhighlight> Це можливо завдяки наявності: std.debug.print("Counter: {}\n", .{counter.value});
const allocator = arena.allocator(); Див.; додатково`u` означає unsigned integer.; value: u32,
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 ==
} Сценарії: Використання: '''істотно:''' мережевий код на 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;
* компонентів системи.;
</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
|}
} Коли варто використовувати Zigconst і varzig 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;">
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]]
* [[Налагодження коду]]
* [[Логування]]
* [[Безпека застосунків]]
* [[Приватність даних]]