100-tasks-to-study
Список из 100 задач по языку Zig, разделённых на категории и уровни сложности (Базовый, Средний, Продвинутый). Этот список охватывает синтаксис, типы, управление памятью, системное программирование, метапрограммирование, взаимодействие с C и другие важные аспекты Zig.
1. Основы синтаксиса и структуры программы (10 задач)
Базовый
- Напишите программу "Hello, World!".
- Объявите переменные разных типов (
i32, u8, f64, bool, []const u8) и выведите их.
- Используйте
const и var для объявления значений и изменяемых переменных.
- Напишите функцию, принимающую два целых числа и возвращающую их сумму.
- Используйте блоки
if и else для проверки чётности числа.
- Реализуйте цикл
while для вывода чисел от 1 до 10.
- Используйте
for для итерации по массиву из 5 элементов.
- Напишите функцию с необязательным параметром (через
?T).
- Обработайте ошибку с помощью
catch при делении на ноль.
- Используйте
switch для определения дня недели по числу (1–7).
2. Типы данных и структуры (10 задач)
Базовый
- Создайте структуру
Point с полями x, y типа f32.
- Объявите перечисление
Color с тремя значениями и используйте его в switch.
- Создайте массив из 10 целых чисел и найдите максимальное значение.
- Используйте срез (
[]T) для передачи массива в функцию.
- Преобразуйте строку в срез байт и обратно.
Средний
- Реализуйте структуру с методом (функцией, принимающей
self).
- Используйте
union для хранения либо целого, либо строки.
- Создайте tagged union и обработайте все варианты через
switch.
- Напишите функцию, принимающую
anytype и возвращающую его тип через @TypeOf.
- Используйте
comptime для вычисления размера структуры во время компиляции.
3. Управление памятью и аллокаторы (10 задач)
Базовый
- Выделите память под массив из 5
i32 с помощью std.heap.page_allocator.
- Освободите память после использования.
- Используйте
std.ArrayList(i32) для динамического массива.
- Добавьте и удалите элементы из
ArrayList.
Средний
- Реализуйте стек на основе
ArrayList.
- Напишите функцию, принимающую аллокатор и возвращающую строку.
- Используйте
std.StringHashMap для хранения пар "ключ-значение".
- Создайте свой простой аллокатор (обёртку над
page_allocator).
Продвинутый
- Реализуйте arena-аллокатор и продемонстрируйте его работу.
- Напишите программу без использования глобального аллокатора — все выделения через параметры.
4. Обработка ошибок (10 задач)
Базовый
- Напишите функцию, которая возвращает ошибку при отрицательном входе.
- Обработайте ошибку с помощью
catch.
- Используйте
orelse для обработки опциональных значений.
Средний
- Создайте собственный тип ошибки с помощью
error{...}.
- Используйте
try для проброса ошибки из функции.
- Реализуйте цепочку вызовов с обработкой ошибок через
catch |err|.
Продвинутый
- Напишите функцию, возвращающую объединённый тип ошибок (
error{A, B} || MyType).
- Используйте
@errorReturnTrace() для отладки стека ошибок.
- Реализуйте retry-механизм при возникновении ошибки.
- Преобразуйте ошибку в опциональное значение с помощью
catch null.
5. Функции и обобщённое программирование (10 задач)
Базовый
- Напишите шаблонную функцию для обмена двух значений.
- Используйте
anytype для функции, работающей с любыми числами.
Средний
- Напишите функцию, принимающую функцию как параметр (callback).
- Реализуйте
map для ArrayList.
- Используйте
@TypeOf и @typeInfo для анализа типа аргумента.
Продвинутый
- Напишите обобщённую структуру
Pair(T, U).
- Реализуйте
Option(T) в стиле Rust с методами unwrap, isSome.
- Создайте функцию, генерирующую другой код во время компиляции (
comptime).
- Используйте
@call для динамического вызова функции.
- Реализуйте
Result(T, E) тип для обработки ошибок и значений.
6. Взаимодействие с C (10 задач)
Базовый
- Вызовите
printf из C через @cImport.
- Объявите C-совместимую структуру с
extern.
Средний
- Скомпилируйте и вызовите простую C-функцию из Zig.
- Передайте Zig-строку в C-функцию как
[*:0]const u8.
- Получите указатель на данные
ArrayList и передайте в C.
Продвинутый
- Напишите Zig-библиотеку, экспортируемую как C-библиотека (
export).
- Используйте
@cDefine и @cInclude для интеграции с заголовками C.
- Оберните C-библиотеку (например,
libcurl) в Zig-интерфейс.
- Обработайте C-коллбэки из Zig (передача Zig-функции в C).
- Реализуйте FFI-обёртку с автоматическим управлением памятью.
7. Системное программирование (10 задач)
Базовый
- Прочитайте аргументы командной строки через
std.os.argv.
- Запишите строку в файл с помощью
std.fs.
Средний
- Реализуйте простой TCP-клиент с использованием
std.net.
- Создайте HTTP-сервер на одном соединении.
- Используйте
std.ChildProcess для запуска внешней команды.
Продвинутый
- Напишите многопоточный сервер с пулом обработчиков.
- Реализуйте примитивный асинхронный цикл событий.
- Используйте
std.Thread для параллельного вычисления суммы массива.
- Работайте с сырыми сокетами (raw sockets) для отправки ICMP-пакета.
- Напишите минимальный загрузчик (bootloader) на Zig (для x86, в теории).
8. Метапрограммирование и компайл-тайм (10 задач)
Базовый
- Используйте
comptime для вычисления факториала.
- Создайте массив во время компиляции с помощью
comptime var.
Средний
- Реализуйте макрос-подобную функцию для генерации структур.
- Используйте
@compileLog для отладки компайл-тайм кода.
- Проверьте наличие метода у типа с помощью
@hasDecl.
Продвинутый
- Напишите сериализатор, генерируемый во время компиляции.
- Реализуйте reflection-систему для структур (поля → JSON).
- Создайте DSL для конфигурации с помощью
comptime.
- Генерируйте таблицу виртуальных функций (vtable) для полиморфизма.
- Используйте
@import и @embedFile для встраивания ресурсов.
9. Тестирование и отладка (10 задач)
Базовый
- Напишите unit-тест для функции сложения.
- Используйте
std.testing.expect для проверки условий.
Средний
- Напишите тест с выделением памяти через
std.testing.allocator.
- Протестируйте ошибочное поведение с помощью
std.testing.expectError.
- Создайте фикстуру для тестов с временным файлом.
Продвинутый
- Напишите fuzz-тест для парсера.
- Используйте
@panic и std.builtin.Panic для кастомной обработки паник.
- Реализуйте benchmark для сравнения двух алгоритмов.
- Интегрируйте coverage-анализ в тесты (если поддерживается).
- Напишите end-to-end тест для CLI-приложения.
10. Продвинутые темы и проекты (10 задач)
Средний
- Реализуйте простой калькулятор с парсером выражений.
- Напишите JSON-парсер с поддержкой объектов и массивов.
- Создайте библиотеку для работы с векторами (2D/3D).
Продвинутый
- Реализуйте мини-интерпретатор языка (например, LISP-подобного).
- Напишите JIT-компилятор с использованием LLVM через Zig-биндинги.
- Создайте свой язык запросов (query DSL) с компайл-тайм проверкой.
- Реализуйте lock-free очередь на атомарных операциях.
- Напишите драйвер устройства (например, для Raspberry Pi GPIO).
- Создайте WebAssembly-модуль на Zig и запустите в браузере.
- Разработайте полноценный проект: HTTP-фреймворк, базу данных или игру на Zig.