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.\