diff --git a/build.zig b/build.zig index 33cfa46ac..fe662e8e0 100644 --- a/build.zig +++ b/build.zig @@ -148,6 +148,12 @@ pub fn build(b: *std.Build) void { .content_dir_path = "content/en-US", .output_prefix_override = "", }, + .{ + .code = "ru-RU", + .name = "Русский", + .site_title = "Язык программирования Zig", + .content_dir_path = "content/ru-RU", + }, .{ .code = "it-IT", .name = "Italiano", diff --git a/content/ru-RU/download.smd b/content/ru-RU/download.smd new file mode 100644 index 000000000..ed6976130 --- /dev/null +++ b/content/ru-RU/download.smd @@ -0,0 +1,20 @@ +--- +.title = "Скачать", +.author = "", +.date = @date("2024-08-07:00:00:00"), +.layout = "download.shtml", +.custom = { + "mobile_menu_title": "Скачать", + "OSs": ["Windows", "macOS", "Linux", "FreeBSD"], +}, +--- +# Релизы +Вы также можете [установить Zig через менеджеры пакетов](https://github.com/ziglang/zig/wiki/Install-Zig-from-a-Package-Manager). + +Существует [JSON-версия этой страницы]($link.siteAsset('download/index.json')). + +Файлы подписаны с помощью [minisign](https://jedisct1.github.io/minisign/) с использованием этого открытого ключа: + +``` +RWSGOq2NVecA2UPNdBUZykf1CCb147pkmdtYxgb3Ti+JO/wCYvhbAb/U +``` diff --git a/content/ru-RU/index.smd b/content/ru-RU/index.smd new file mode 100644 index 000000000..6230b6a5c --- /dev/null +++ b/content/ru-RU/index.smd @@ -0,0 +1,64 @@ +--- +.title = "Главная", +.author = "", +.date = @date("2024-08-07:00:00:00"), +.layout = "index.shtml", +.custom = { + "mobile_menu_title": "Главная", +}, +--- + +[]($section.id("slogan")) +Zig — это язык программирования общего назначения и набор инструментов для создания **надёжного**, **оптимального** и **переиспользуемого** программного обеспечения. + +[]($section.id("features")) +## ⚡ Простой язык +Сосредоточьтесь на отладке вашего приложения, а не на борьбе с особенностями языка. + +- Нет скрытых потоков управления. +- Нет скрытых выделений памяти. +- Нет препроцессора, нет макросов. + +## ⚡ Comptime +Новый подход к метапрограммированию на основе выполнения кода во время компиляции и ленивых (отложенных) вычислений. + +- Вызов любой функции на этапе компиляции. +- Манипуляция типами как значениями без накладных расходов во время выполнения программы. +- Comptime эмулирует целевую архитектуру. + +## ⚡ Поддерживайте существующий код с помощью Zig +Поэтапно улучшайте кодовую базу на C/C++/Zig. + +- Применяйте Zig в качестве компилятора для C/C++, который поддерживает кросс-компиляцию «из коробки». +- Используйте `zig build` для создания единой среды разработки на всех платформах. +- Интегрируйте Zig в проекты на C/C++, открывая доступ к богатой стандартной библиотеке для всего кода на C/C++. + + +# [Сообщество]($section.id("community").attrs("section-title")) + +## [Сообщество Zig децентрализовано]($section.id("decentralized")) +Любой может создать и поддерживать своё собственное сообщество. +Не существует понятия "официальное" или "неофициальное" — каждое сообщество имеет своих модераторов и правила. + + +## [Разработка]($section.id("main-development")) +Репозиторий Zig можно найти на [https://github.com/ziglang/zig](https://github.com/ziglang/zig), где мы также ведём трекер проблем и обсуждаем предложения. +От участников ожидается соблюдение [Кодекса поведения Zig](https://github.com/ziglang/zig/blob/master/.github/CODE_OF_CONDUCT.md). + + +# [Zig Software Foundation]($section.id("zsf").attrs("section-title")) + +## ZSF — это некоммерческая организация 501(c)(3). + +Zig Software Foundation — это некоммерческая организация, основанная в 2020 году Эндрю Келли, создателем Zig, с целью поддержания развития языка. В настоящее время Zig Software Foundation может предложить оплачиваемую работу на конкурентных ставках небольшому числу ключевых контрибьюторов. Мы надеемся в будущем расширить это предложение для большего круга людей. + +Zig Software Foundation существует за счёт пожертвований. + +# [Спонсоры]($section.id("sponsors").attrs("section-title")) + +## [Корпоративные спонсоры]($section.id("corporate-sponsors")) +Следующие компании оказывают финансовую поддержку Zig Software Foundation. + +## [GitHub-спонсоры]($section.id("github-sponsors")) +Благодаря людям, которые [спонсируют Zig]($link.page('zsf')), проект остаётся подконтрольным open-source сообществу, а не корпоративным акционерам. В частности, эти замечательные люди спонсируют Zig на сумму 200 долларов в месяц или более: + diff --git a/content/ru-RU/learn/build-system.smd b/content/ru-RU/learn/build-system.smd new file mode 100644 index 000000000..fb5cb7326 --- /dev/null +++ b/content/ru-RU/learn/build-system.smd @@ -0,0 +1,393 @@ +--- +.title = "Система сборки Zig", +.author = "", +.date = @date("2024-08-07:00:00:00"), +.layout = "page.shtml", +.custom = { + "mobile_menu_title": "Система сборки Zig", + "toc": true, +}, +--- +# [Когда стоит использовать систему сборки Zig?]($heading.id('build-system')) + +Для выполнения основных задач обычно достаточно команд `zig build-exe`, `zig build-lib`, `zig build-obj` и `zig test`. Тем не менее, в некоторых случаях проекту может понадобиться дополнительный уровень абстракции для более эффективного управления сложностью процесса сборки. + +Система сборки Zig может значительно упростить процесс разработки и сборки в следующих ситуациях: + +- Если команды в терминале становятся слишком громоздкими и сложными для запоминания, использование системы сборки позволит сохранить их в одном месте. +- При наличии множества компонентов или этапов сборки Zig поможет организовать процесс, разбив его на более управляемые части. +- Если вы хотите сократить время сборки, система сборки Zig поддерживает конкурентность и кэширование, что значительно ускоряет процесс. +- Zig позволяет легко задавать параметры конфигурации для вашего проекта, что делает его более гибким и адаптируемым к различным условиям. +- Если процесс сборки варьируется в зависимости от целевой системы или других параметров, Zig поможет вам настроить его под конкретные нужды. +- При наличии зависимостей от других проектов система сборки Zig упростит управление ими и обеспечит правильную интеграцию. +- Если вы стремитесь уменьшить зависимость от таких инструментов, как CMake, Make, Shell, MSVC или Python, Zig поможет сделать ваш проект более универсальным и доступным. +- Если вы хотите упростить процесс создания пакетов для использования другими разработчиками, система сборки Zig обеспечит удобные механизмы для этого. +- С помощью Zig вы сможете предложить стандартизированный подход к сборке проекта, что облегчит интеграцию с различными IDE и инструментами разработки. + +Если хотя бы один из перечисленных пунктов имеет отношение к вашему проекту, применение системы сборки Zig может существенно облегчить процесс разработки. + +# [Начало работы]($heading.id('getting-started')) +## [Простое исполняемое приложение]($heading.id('simple')) +Этот скрипт сборки создаёт исполняемый файл из Zig-файла, который содержит определение публичной функции `main`. + +[]($code.language('=html').buildAsset("build-system/1-simple-executable/hello.zig")) +[]($code.language('=html').buildAsset("build-system/1-simple-executable/build.zig")) + +## [Установка артефактов сборки]($heading.id('installing-artifacts')) + +Система сборки Zig, подобно большинству других систем сборки, моделирует проект как направленный ациклический граф (DAG), где этапы выполняются независимо и параллельно. + +По умолчанию основным этапом в графе является этап **Установки (Install)**, который предназначен для копирования артефактов сборки в их конечное местоположение. Этот этап не имеет зависимостей, поэтому при выполнении команды `zig build` ничего не произойдёт. Скрипт сборки проекта должен дополнительно указать, какие элементы необходимо установить, и именно это делает вызов функции `installArtifact`, представленный выше. + +**Вывод** +``` +├── build.zig +├── hello.zig +├── .zig-cache +└── zig-out + └── bin + └── hello +``` + +В этом выводе можно увидеть две сгенерированные директории: `.zig-cache` и `zig-out`. Первая из них содержит файлы, которые ускоряют последующие сборки. Эти файлы не предназначены для добавления в систему контроля версий, и данную директорию можно удалить в любое время без каких-либо негативных последствий. + +Вторая директория, `zig-out`, является целевой директорией установки. Она соответствует стандартной структуре файловой системы. Выбор этой директории осуществляется не проектом, а пользователем команды `zig build` с помощью флага `--prefix` (сокращенно `-p`). + +Вы, как разработчик проекта, определяете, что будет помещено в эту директорию, но пользователь решает, куда установить её на своём компьютере. Скрипт сборки не должен жёстко задавать пути вывода, так как это может нарушить кэширование, конкурентное выполнение и совместимость, а также вызвать недовольство у конечного пользователя. + +## [Этап запуска приложения]($heading.id('run-step')) + +Обычно этап **Запуска (Run)** добавляют, чтобы упростить процесс запуска основного приложения непосредственно через команду сборки. + +[]($code.language('=html').buildAsset("build-system/convenience-run-step/hello.zig")) +[]($code.language('=html').buildAsset("build-system/convenience-run-step/build.zig")) + +# [Основы]($heading.id('basics')) + +## [Опции, задаваемые пользователем]($heading.id('user-options')) + +Можно использовать `b.option`, чтобы сделать скрипт сборки настраиваемым для конечных пользователей и других проектов, которые используют данный проект в качестве пакета. + +[]($code.language('=html').buildAsset("build-system/2-user-provided-options/build.zig")) +[]($code.language('=html').buildAsset("build-system/2-user-provided-options/example.zig")) + +Обратите внимание на эти строки: + +``` +Project-Specific Options: + -Dwindows=[bool] Target Microsoft Windows +``` + +Эта секция меню помощи создаётся автоматически в результате выполнения `build.zig`, чтобы пользователи могли ознакомиться с параметрами конфигурации скрипта сборки. + +## [Стандартные параметры конфигурации]($heading.id('standard-options')) + +Ранее мы применяли булев флаг для обозначения сборки под Windows. Однако, существует более эффективный подход. + +Большинство проектов стремятся предоставить возможность изменять целевую платформу и параметры оптимизации. Для стандартизации названий этих параметров Zig предлагает вспомогательные функции `standardTargetOptions` и `standardOptimizeOption`. + +Стандартные параметры для выбора целевой платформы позволяют пользователю, выполняющему команду `zig build`, указать, для какой платформы будет осуществляться сборка проекта. По умолчанию поддерживаются все платформы, и если выбор не сделан, проект будет собран для текущей системы. Существуют дополнительные опции для ограничения списка поддерживаемых платформ. + +Параметры оптимизации по умолчанию позволяют пользователю выбрать один из следующих режимов: `Debug`, `ReleaseSafe`, `ReleaseFast` и `ReleaseSmall`. Поскольку ни один из этих режимов по умолчанию не является предпочтительным, пользователю следует самостоятельно решить, какой из них использовать. + +[]($code.language('=html').buildAsset("build-system/3-standard-config-options/hello.zig")) +[]($code.language('=html').buildAsset("build-system/3-standard-config-options/build.zig")) + +Теперь меню `--help` содержит больше пунктов: + +``` +Project-Specific Options: + -Dtarget=[string] The CPU architecture, OS, and ABI to build for + -Dcpu=[string] Target CPU features to add or subtract + -Doptimize=[enum] Prioritize performance, safety, or binary size (-O flag) + Supported Values: + Debug + ReleaseSafe + ReleaseFast + ReleaseSmall +``` + +Хотя эти параметры можно задать напрямую с помощью `b.option`, данный API предоставляет стандартные наименования для часто используемых настроек. + +Обратите внимание на вывод в терминале, где мы указали `-Dtarget=x86_64-windows -Doptimize=ReleaseSmall`. В отличие от первого примера, теперь в целевой директории появляются дополнительные файлы: + +``` +zig-out/ +└── bin + └── hello.exe +``` + +## [Условная компиляция]($heading.id('conditional-compilation')) + +Для передачи параметров из скрипта сборки в Zig-код вашего проекта используйте `Options`. + +[]($code.language('=html').buildAsset("build-system/conditional-compilation/app.zig")) +[]($code.language('=html').buildAsset("build-system/conditional-compilation/build.zig")) + +В этом примере данные, предоставленные через `@import("config")`, известны на этапе компиляции, что предотвращает срабатывание `@compileError`. Если бы мы передали `-Dversion=0.2.3` или пропустили эту опцию, то компиляция `app.zig` завершилась бы ошибкой "too old". + +## [Статические библиотеки]($heading.id('static-library')) + +Этот скрипт сборки создаёт статическую библиотеку из кода на Zig, а затем и исполняемый файл из другого кода на Zig, который использует эту библиотеку. + +[]($code.language('=html').buildAsset("build-system/simple-static-library/fizzbuzz.zig")) +[]($code.language('=html').buildAsset("build-system/simple-static-library/demo.zig")) +[]($code.language('=html').buildAsset("build-system/simple-static-library/build.zig")) + +В этом случае только статическая библиотека будет установлена: + +``` +zig-out/ +└── lib + └── libfizzbuzz.a +``` + +Однако, если присмотреться, можно заметить, что в скрипте сборки есть опция для установки демо-версии. Если дополнительно указать `-Denable-demo`, то в целевой директории мы увидим следующее: + +``` +zig-out/ +├── bin +│ └── demo +└── lib + └── libfizzbuzz.a +``` + +Заметьте, что хотя `addExecutable` вызывается безусловно, система сборки не будет создавать исполняемый файл `demo`, если только его не запросить с помощью параметра `-Denable-demo`. Это возможно благодаря тому, что система сборки использует ориентированный ациклический граф (DAG), который управляет зависимостями. + +## [Динамические библиотеки]($heading.id('dynamic-library')) + +Здесь мы оставляем все файлы такими же, как в примере со [статической библиотекой](#static-library), за исключением изменений в файле `build.zig`. + +[]($code.language('=html').buildAsset("build-system/dynamic-library/build.zig")) + +**Вывод** +``` +zig-out +└── lib + ├── libfizzbuzz.so -> libfizzbuzz.so.1 + ├── libfizzbuzz.so.1 -> libfizzbuzz.so.1.2.3 + └── libfizzbuzz.so.1.2.3 +``` + +Как и в примере со статической библиотекой, чтобы создать исполняемый файл, который будет ссылаться на неё, можем использовать такой код: + +```zig +exe.linkLibrary(libfizzbuzz); +``` + +## [Тестирование]($heading.id('testing')) + +Отдельные файлы можно протестировать напрямую с помощью команды `zig test foo.zig`. + +Для более сложных случаев тестирование можно организовать с помощью скрипта сборки. В этом случае юнит-тесты разделяются на два этапа: **Компиляции (Compile)** и **Запуска (Run)**. + +Важно помнить, что если не вызвать `addRunArtifact`, устанавливающий зависимость между этими двумя этапами, юнит-тесты не будут выполнены. + +Этап *Компиляции (Compile)* настраивается аналогично исполняемым файлам, библиотекам или объектным файлам. Например, его можно [связывать с системными библиотеками](#linking-to-system-libraries) или задавать параметры целевой платформы. + +Этап *Запуска (Run)* настраивается аналогично другим этапам *Запуска (Run)*. Например, можно пропустить выполнение, если текущая платформа не поддерживает запуск исполняемого файла. + +При использовании системы сборки для запуска юнит-тестов сборщик и тестовый раннер взаимодействуют через *stdin* и *stdout*. Это позволяет одновременно запускать несколько наборов юнит-тестов и сообщать о сбоях в тестах понятным способом, избегая смешивания их вывода. + +Одной из причин, по которой [запись в *стандартный вывод* в юнит-тестах является проблематичной](https://github.com/ziglang/zig/issues/15091), является возможность нарушения этого канала связи. С другой стороны, эта механика откроет возможность для новой функции — [возможности юнит-теста ожидать *сбоя*](https://github.com/ziglang/zig/issues/1356). + +[]($code.language('=html').buildAsset("build-system/unit-testing/main.zig")) +[]($code.language('=html').buildAsset("build-system/unit-testing/build.zig")) + +В этом случае будет полезно включить параметр `skip_foreign_checks` для юнит-тестов. + +```diff +@@ -23,6 +23,7 @@ + }); + + const run_unit_tests = b.addRunArtifact(unit_tests); ++ run_unit_tests.skip_foreign_checks = true; + test_step.dependOn(&run_unit_tests.step); + } + } +``` + +[]($code.language('=html').buildAsset("build-system/unit-testing-skip-foreign/build.zig")) + +## [Подключение системных библиотек]($heading.id('linking-system-libraries')) + +Существует два основных способа управления зависимостями: + +1. **Использование системы сборки Zig.** Этот метод позволяет предоставлять библиотеки через встроенные механизмы сборки Zig. Подробности можно найти в разделах [Управление пакетами](#package-management) и [Статические библиотеки](#static-library). +2. **Использование системных библиотек.** В этом случае библиотеки предоставляются операционной системой. + +Для upstream-проектов использование системы сборки Zig для управления зависимостями снижает уровень сложности и предоставляет полный контроль над конфигурацией. Этот подход обеспечивает воспроизводимость и согласованность результатов сборки на всех операционных системах, а также упрощает процесс кросс-компиляции. Кроме того, он даёт возможность точно выбирать версии всех зависимостей, необходимых для проекта. В большинстве случаев данный метод считается предпочтительным для работы с внешними библиотеками. + +Тем не менее, если требуется упаковать программное обеспечение для репозиториев, таких как Debian, Homebrew или Nix, использование системных библиотек становится обязательным. Поэтому в скриптах сборки важно [определить режим сборки](https://github.com/ziglang/zig/issues/14281) и соответствующим образом настроить проект. + +[]($code.language('=html').buildAsset("build-system/system-libraries/build.zig")) + +Пользователи команды `zig build` могут воспользоваться опцией `--search-prefix`, чтобы указать дополнительные директории, которые будут рассматриваться как системные для поиска статических и динамических библиотек. + +# [Генерация файлов]($heading.id('generating-files')) + +## [Запуск системных инструментов]($heading.id('system-tools')) +Эта версия примера с "Hello, World!" ожидает, что в той же папке будет находиться файл `word.txt`. Мы собираемся использовать системный инструмент для его генерации на основе JSON-файла. + +Учтите, что системные зависимости могут усложнить сборку вашего проекта. Например, этот скрипт сборки зависит от программы `jq`, которая по умолчанию отсутствует в большинстве дистрибутивов Linux и может быть незнакома пользователям Windows. + +В следующем разделе мы заменим утилиту `jq` на встроенный инструмент Zig, который уже присутствует в исходном коде. Этот подход предпочтителен, так как он устраняет необходимость в сторонних зависимостях. + +**`words.json`** +```json +{ + "en": "world", + "it": "mondo", + "ja": "世界" +} +``` + +[]($code.language('=html').buildAsset("build-system/10.5-system-tool/src/main.zig")) +[]($code.language('=html').buildAsset("build-system/10.5-system-tool/build.zig")) + +**Вывод** + +``` +zig-out +├── hello +└── word.txt +``` + +Обратите внимание, что функция `captureStdOut` создаёт временный файл с выводом вызова утилиты `jq`. + +## [Запуск инструментов проекта]($heading.id('project-tools')) + +Эта версия программы "Hello, World!" ожидает найти файл `word.txt` в той же директории. Мы планируем сгенерировать его в процессе сборки, используя программу для обработки JSON-файла на Zig. + +**`tools/words.json`** +```json +{ + "en": "world", + "it": "mondo", + "ja": "世界" +} +``` + +[]($code.language('=html').buildAsset("build-system/11-zig-tool/src/main.zig")) + +[]($code.language('=html').buildAsset("build-system/11-zig-tool/tools/word_select.zig")) + +[]($code.language('=html').buildAsset("build-system/11-zig-tool/build.zig")) + +**Вывод** + +``` +zig-out +├── hello +└── word.txt +``` + +## [Создание ресурсов для `@embedFile`]($heading.id('embed-file')) + +В этой версии программы "Hello, World!" планируется использовать `@embedFile` для встраивания ресурса, который будет создан в процессе сборки. Мы будем генерировать этот ресурс с помощью инструмента, написанного на Zig. + +**`tools/words.json`** +```json +{ + "en": "world", + "it": "mondo", + "ja": "世界" +} +``` + +[]($code.language('=html').buildAsset("build-system/12-embedfile/src/main.zig")) + +[]($code.language('=html').buildAsset("build-system/12-embedfile/tools/word_select.zig")) + +[]($code.language('=html').buildAsset("build-system/12-embedfile/build.zig")) + +**Вывод** + +``` +zig-out/ +└── bin + └── hello +``` + +## [Генерация исходного кода Zig]($heading.id('generating-zig')) +В этом файле сборки используется программа на Zig, которая создаёт новый Zig-файл. Сгенерированный файл затем подключается к основной программе в качестве зависимости. + +[]($code.language('=html').buildAsset("build-system/13-import/src/main.zig")) +[]($code.language('=html').buildAsset("build-system/13-import/tools/generate_struct.zig")) +[]($code.language('=html').buildAsset("build-system/13-import/build.zig")) + +**Вывод** + +``` +zig-out/ +└── bin + └── hello +``` + +## [Работа с одним или несколькими сгенерированными файлами]($heading.id('write-files')) + +Этап **WriteFiles** предоставляет возможность генерировать один или несколько файлов, которые имеют общую родительскую директорию. Сгенерированная директория располагается внутри локального `.zig-cache`, и каждый созданный файл доступен как `std.Build.LazyPath`. Кроме того, сама родительская директория также представлена в виде `LazyPath`. + +Этот API позволяет записывать произвольные строки в сгенерированную директорию, а также копировать в неё файлы. + +[]($code.language('=html').buildAsset("build-system/write-files/src/main.zig")) +[]($code.language('=html').buildAsset("build-system/write-files/build.zig")) + +**Вывод** + +``` +zig-out/ +└── project.tar.gz +``` + +## [Мутирование исходных файлов]($heading.id('mutating-source')) + +Хотя это и не является распространённой практикой, иногда проекты сохраняют сгенерированные файлы в системе контроля версий. Это может быть полезно, когда такие файлы обновляются редко и имеют сложные системные зависимости, которые затрудняют процесс обновления, но *только* в рамках самого процесса обновления. + + +Для этой цели этап **WriteFiles** предоставляет необходимый функционал. В будущих версиях Zig эта возможность [будет выделена из **WriteFiles** в отдельный этап сборки](https://github.com/ziglang/zig/issues/14944). + +С этим следует быть осторожным: данный функционал не предназначен для использования в процессе обычной сборки. Он должен применяться как утилита, запускаемая разработчиком с целью обновления исходных файлов, которые затем будут зафиксированы в системе контроля версий. Если использовать эту функцию во время стандартного процесса сборки, это может привести к ошибкам кэширования и конкурентного выполнения. + +[]($code.language('=html').buildAsset("build-system/mutate-source-files/tools/proto_gen.zig")) +[]($code.language('=html').buildAsset("build-system/mutate-source-files/src/main.zig")) +[]($code.language('=html').buildAsset("build-system/mutate-source-files/src/protocol.zig")) +[]($code.language('=html').buildAsset("build-system/mutate-source-files/build.zig")) + +```=html +
$ zig build update-protocol --summary all
+Build Summary: 4/4 steps succeeded
+update-protocol success
+└─ WriteFile success
+ └─ run proto_gen (protocol.zig) success 401us MaxRSS:1M
+ └─ zig build-exe proto_gen Debug native success 1s MaxRSS:183M
+
+```
+
+После выполнения этой команды файл `src/protocol.zig` будет обновлён.
+
+# [Полезные примеры]($heading.id('examples'))
+
+## [Сборка для нескольких целевых платформ с целью создания релиза]($heading.id('release'))
+
+В этом примере мы изменим некоторые стандартные параметры на этапе `InstallArtifact`, чтобы размещать сборку для каждой целевой платформы в отдельной подпапке. Такой подход позволит более эффективно организовать артефакты, созданные для различных платформ, а также упростит их управление и развёртывание в дальнейшем.
+
+[]($code.language('=html').buildAsset("build-system/10-release/build.zig"))
+[]($code.language('=html').buildAsset("build-system/10-release/hello.zig"))
+
+**Вывод**
+
+```
+zig-out
+├── aarch64-linux
+│ └── hello
+├── aarch64-macos
+│ └── hello
+├── x86_64-linux-gnu
+│ └── hello
+├── x86_64-linux-musl
+│ └── hello
+└── x86_64-windows
+ ├── hello.exe
+ └── hello.pdb
+```
diff --git a/content/ru-RU/learn/getting-started.smd b/content/ru-RU/learn/getting-started.smd
new file mode 100644
index 000000000..af97cd0f1
--- /dev/null
+++ b/content/ru-RU/learn/getting-started.smd
@@ -0,0 +1,143 @@
+---
+.title = "Начало работы",
+.author = "",
+.date = @date("2024-08-07:00:00:00"),
+.layout = "page.shtml",
+.custom = {
+ "mobile_menu_title": "Начало работы",
+ "toc": true,
+},
+---
+
+# Релиз или ночная сборка?
+Zig еще не достиг версии 1.0, и текущий цикл релизов связан с новыми версиями LLVM, которые выходят примерно раз в шесть месяцев.
+На практике это означает, что **релизы Zig происходят с большими промежутками и быстро устаревают, учитывая текущую скорость разработки**.
+
+Чтобы оценить Zig, можно воспользоваться релизом, но если вы решите, что вам нравится Zig и захотите в него углубиться, **мы рекомендуем обновиться до ночной сборки**. В основном потому, что таким образом вам будет легче получать помощь: большинство сообществ и такие сайты, как [zig.guide](https://zig.guide), отслеживают ветку `master` по указанным выше причинам.
+
+Хорошая новость заключается в том, что очень легко переключаться с одной версии Zig на другую или даже иметь несколько версий на системе одновременно: релизы Zig — это автономные архивы, которые можно разместить в любом месте вашей системы.
+
+
+# Установка Zig
+## [Прямое скачивание]($heading.id('direct'))
+Это самый простой способ получения Zig: скачайте пакет Zig для вашей платформы со [страницы загрузок](/download), распакуйте его и добавьте в переменную `PATH`, чтобы `zig` можно было вызывать из любого места.
+
+### Настройка PATH в Windows
+Чтобы настроить PATH в Windows, выполните **один** из следующих фрагментов кода в Powershell. Выберите, хотите ли вы применить это изменение на уровне всей системы (необходимо запустить Powershell с правами администратора) или только для текущего пользователя. **Убедитесь, что вы правильно указали расположение вашей копии Zig**. `;` перед `C:` — это не ошибка.
+
+На уровне всей системы (Powershell с правами администратора):
+```
+[Environment]::SetEnvironmentVariable(
+ "Path",
+ [Environment]::GetEnvironmentVariable("Path", "Machine") + ";C:\your-path\zig-windows-x86_64-your-version",
+ "Machine"
+)
+```
+
+Только для текущего пользователя (Powershell):
+```
+[Environment]::SetEnvironmentVariable(
+ "Path",
+ [Environment]::GetEnvironmentVariable("Path", "User") + ";C:\your-path\zig-windows-x86_64-your-version",
+ "User"
+)
+```
+По завершении перезапустите Powershell.
+
+### Настройка PATH в Linux, macOS, BSD
+Добавьте расположение исполняемого файла zig в переменную окружения PATH.
+
+Это обычно делается добавлением строки export в файл инициализации командной оболочки (например, `.profile` или `.zshrc`).
+```bash
+export PATH=$PATH:~/path/to/zig
+```
+По завершении выполните `source` файла инициализации командной оболочки или просто перезапустите командную оболочку.
+
+
+## [Менеджеры пакетов]($heading.id('managers'))
+### Windows
+**WinGet**
+Zig доступен в [WinGet](https://github.com/microsoft/winget-pkgs/tree/master/manifests/z/zig/zig).
+```
+winget install -e --id zig.zig
+```
+
+**Chocolatey**
+Zig доступен на [Chocolatey](https://chocolatey.org/packages/zig).
+```
+choco install zig
+```
+
+**Scoop**
+Zig доступен на [Scoop](https://scoop.sh/#/apps?q=zig&id=7e124d6047c32d426e4143ab395d863fc9d6d491).
+```
+scoop install zig
+```
+Последняя [dev-сборка](https://scoop.sh/#/apps?q=zig&id=921df07e75042de645204262e784a17c2421944c):
+```
+scoop bucket add versions
+scoop install versions/zig-dev
+```
+
+### macOS
+
+**Homebrew**
+Последний релиз:
+```
+brew install zig
+```
+
+**MacPorts**
+```
+port install zig
+```
+### Linux
+Zig также представлен во многих менеджерах пакетов для Linux. [Здесь](https://github.com/ziglang/zig/wiki/Install-Zig-from-a-Package-Manager) можно найти обновлённый список, но имейте в виду, что некоторые пакеты могут содержать устаревшие версии Zig.
+
+## [Сборка из исходников]($heading.id('source'))
+[Здесь](https://github.com/ziglang/zig/wiki/Building-Zig-From-Source)
+можно найти больше информации о том, как собрать Zig из исходников на Linux, macOS и Windows.
+
+# Рекомендуемые инструменты
+## Подсветка синтаксиса и языковые серверы (LSP)
+Все основные текстовые редакторы поддерживают подсветку синтаксиса для Zig. Некоторые поставляются сразу с ним, для других требуется установка соответствующего плагина.
+
+Если вас интересует более глубокая интеграция между Zig и вашим редактором, ознакомьтесь с [zigtools/zls](https://github.com/zigtools/zls).
+
+Если вас интересует, что доступно ещё, ознакомьтесь с разделом [Инструменты](tools).
+
+
+# Запуск Hello, World!
+Если процесс установки прошёл успешно, вы должны иметь возможность вызвать компилятор Zig из вашей командной оболочки.
+Давайте проверим это, создав вашу первую программу!
+
+Перейдите в директорию вашего проекта и выполните:
+```bash
+mkdir hello-world
+cd hello-world
+zig init
+```
+
+Это должно вывести:
+```
+info: created build.zig
+info: created build.zig.zon
+info: created src/main.zig
+info: created src/root.zig
+info: see `zig build --help` for a menu of options
+```
+
+Выполнение команды `zig build run` должно скомпилировать исполняемый файл и запустить его, выведя:
+```
+All your codebase are belong to us.
+Run `zig build test` to run the tests.
+```
+
+Поздравляем, вы успешно установили Zig!
+
+# Следующие шаги
+**Изучите дополнительные ресурсы, представленные в разделе [Изучение](/learn)**. Не забудьте выбрать документацию для вашей версии Zig (для ночных сборок используйте документацию `master`). Также рекомендуется ознакомиться с [zig.guide](https://zig.guide) для более глубокого изучения языка.
+
+Zig — это молодой проект, и, к сожалению, у нас пока нет возможности создать обширную документацию и учебные материалы на все случаи жизни. Поэтому рекомендуется [присоединиться к одному из сообществ Zig](https://github.com/ziglang/zig/wiki/Community), чтобы получать помощь в случае затруднений. Также рекомендуем ознакомиться с такими инициативами, как[Zig SHOWTIME](https://zig.show).
+
+И в заключение, если Zig вызывает у вас интерес и вы хотите внести свой вклад в его развитие, мы будем признательны за любую поддержку. Рассмотрите возможность сделать пожертвование в [Zig Software Foundation](/zsf) , чтобы помочь проекту ещё более активно расти и развиваться.
diff --git a/content/ru-RU/learn/index.smd b/content/ru-RU/learn/index.smd
new file mode 100644
index 000000000..0d91eb178
--- /dev/null
+++ b/content/ru-RU/learn/index.smd
@@ -0,0 +1,70 @@
+---
+.title = "Изучение",
+.author = "",
+.date = @date("2024-08-07:00:00:00"),
+.layout = "learn.shtml",
+.custom = {
+ "mobile_menu_title": "Изучение",
+},
+---
+# [Изучение]($section.id('learn'))
+В этом разделе собраны ресурсы, которые помогут вам пройти путь от полного незнания языка Zig до глубокого понимания его философии и принципов.
+
+
+## [Руководства]($section.id('guides'))
+В этом разделе в будущем будет собрана полная документация стандартной библиотеки Zig. А пока можно просматривать её материалы прямо отсюда.
+
+- [Система сборки Zig](./build-system/)
+Введение в систему сборки Zig.
+
+## Введение
+Данные материалы предназначены для программистов с разным уровнем подготовки и помогут успешно начать изучение языка.
+
+- [Подробный обзор](./overview/)
+Глубокий обзор возможностей Zig с точки зрения системного программирования.
+- [Почему Zig, если уже есть C++, D и Rust?](./why_zig_rust_d_cpp/)
+Введение в Zig для программистов на C++, D и Rust.
+- [Примеры кода](./samples/)
+Список фрагментов кода, чтобы понять, как выглядит код на Zig.
+- [Инструменты](./tools/)
+Список полезных инструментов, которые помогают писать код на Zig.
+
+
+## Начало работы
+Если вы готовы начать программировать на Zig, это руководство поможет настроить среду разработки.
+
+- [Начало работы](./getting-started)
+
+## Онлайн-ресурсы для обучения
+- [zig.guide](https://zig.guide)
+Структурированное введение в Zig от [Sobeston](https://github.com/sobeston).
+- [Ziglings](https://ziglings.org)
+Изучайте Zig, исправляя небольшие ошибки в коде.
+- [Zig на Exercism](https://exercism.org/tracks/zig)
+Изучайте Zig, решая задачи по программированию и получая советы от наставников.
+- [Изучение Zig](https://www.openmymind.net/learning_zig/)
+Краткое введение в Zig, отлично подходящее для разработчиков, переходящих с языков с автоматической сборкой мусора.
+
+## Актуальные видео и блоги
+- [Дорога к Zig 1.0](https://www.youtube.com/watch?v=Gv2I7qTux7g) [видео]
+Видео от [Andrew Kelley](https://andrewkelley.me), представляющее Zig и его философию.
+- [Zig: новая эра взаимодействия с LLVM](https://kristoff.it/blog/zig-new-relationship-llvm/)
+Блог о работе над созданием независимого компилятора Zig, также упомянутый в [статье на lwn.net](https://lwn.net/Articles/833400/).
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/content/ru-RU/learn/overview.smd b/content/ru-RU/learn/overview.smd
new file mode 100644
index 000000000..4834ba3e9
--- /dev/null
+++ b/content/ru-RU/learn/overview.smd
@@ -0,0 +1,517 @@
+---
+.title = "Обзор",
+.author = "",
+.date = @date("2024-08-07:00:00:00"),
+.layout = "page.shtml",
+.custom = {
+ "mobile_menu_title": "Обзор",
+},
+---
+# Ключевые особенности
+## Компактный и простой язык
+
+Сфокусируйтесь на отладке вашего приложения, а не на отладке ваших знаний языка программирования.
+
+Синтаксис Zig полностью описан в [грамматике PEG, состоящей из 580 строк](https://ziglang.org/documentation/master/#Grammar).
+
+В языке **нет скрытых потоков управления**, скрытых выделений памяти, препроцессоров и макросов. Если код на Zig не выглядит так, будто он вызывает функцию, значит, он её не вызывает. Можно быть уверенным, что в приведённом ниже коде вызываются только `foo()`, а затем `bar()` – независимо от типов данных:
+
+```zig
+var a = b + c.d;
+foo();
+bar();
+```
+
+Примеры скрытых потоков управления:
+
+* В языке D есть `@property`-функции, которые вызываются как доступ к полю. Например, в D выражение `c.d` может быть вызовом функции.
+* C++, D и Rust поддерживают перегрузку операторов, в результате чего оператор `+` может вызывать функции.
+* В языках C++, D и Go есть механизм исключений с использованием throw/catch, из-за чего `foo()` может выбросить исключение и помешать вызову `bar()`. (Конечно, даже в Zig вызов `foo()` может привести к взаимной блокировке и помешать `bar()` выполниться, но подобное возможно в любом Тьюринг-полном языке.)
+
+Zig делает код более читабельным и простым, управляя потоком выполнения исключительно при помощи ключевых слов и вызовов функций.
+
+## Производительность или безопасность? И то, и другое
+
+В Zig есть четыре [режима сборки](https://ziglang.org/documentation/master/#Build-Mode), которые можно свободно комбинировать и применять вплоть до [самой мелкой области видимости](https://ziglang.org/documentation/master/#setRuntimeSafety).
+
+| Parameter | [Debug](/documentation/master/#Debug) | [ReleaseSafe](/documentation/master/#ReleaseSafe) | [ReleaseFast](/documentation/master/#ReleaseFast) | [ReleaseSmall](/documentation/master/#ReleaseSmall) |
+|-----------|-------|-------------|-------------|--------------|
+Оптимизации — улучшают скорость, усложняют отладку, увеличивают время компиляции | | -O3 | -O3| -Os |
+Проверки безопасности во время выполнения — снижают скорость, увеличивают размер, приводят к аварийному завершению вместо неопределённого поведения | Включено | Включено | | |
+
+Вот как [переполнение целых чисел (Integer Overflow)](https://ziglang.org/documentation/master/#Integer-Overflow) выглядит во время компиляции, независимо от режима сборки:
+
+[]($code.language('=html').buildAsset('features/1-integer-overflow.zig'))
+
+А вот как это выглядит во время выполнения в сборках с проверкой безопасности:
+
+[]($code.language('=html').buildAsset('features/2-integer-overflow-runtime.zig'))
+
+Эта [трассировка стека совместима со всеми целевыми платформами](#stack-traces-on-all-targets), включая [независимые целевые платформы](https://andrewkelley.me/post/zig-stack-traces-kernel-panic-bare-bones-os.html).
+
+С Zig можно использовать режим сборки с проверкой безопасности, а также отключать её в местах, где это требуется для максимальной производительности. Например, предыдущий пример можно переписать следующим образом:
+
+[]($code.language('=html').buildAsset('features/3-undefined-behavior.zig'))
+
+Zig использует [неопределённое поведение](https://ziglang.org/documentation/master/#Undefined-Behavior) в качестве мощного инструмента для предотвращения ошибок и увеличения производительности.
+
+Говоря о производительности, Zig работает быстрее, чем C.
+
+- Эталонная реализация использует LLVM как бэкенд для современных оптимизаций.
+- То, что в других проектах называют "оптимизацией на этапе линковки", Zig делает автоматически.
+- Благодаря [первоклассной поддержке кросс-компиляции](#cross-compiling-is-a-first-class-use-case), для нативных целевых платформ включены продвинутые функции процессоров (-march=native).
+- Тщательно продуманное неопределённое поведение. Например, в Zig как знаковые, так и беззнаковые целые числа имеют неопределённое поведение при переполнении, в отличие от только знаковых в C. Это [способствует оптимизациям, которые недоступны в C](https://godbolt.org/z/n_nLEU).
+- Zig предоставляет встроенную поддержку [векторных типов SIMD](https://ziglang.org/documentation/master/#Vectors), что упрощает написание кроссплатформенного векторизованного кода.
+
+Обратите внимание, что Zig не является полностью безопасным языком. Тем, кто интересуется развитием безопасности в Zig, рекомендуем подписаться на следующие GitHub Issues:
+
+- [перечислить все виды неопределённого поведения; даже те, которые невозможно проверить на безопасность](https://github.com/ziglang/zig/issues/1966)
+- [сделать режимы Debug и ReleaseSafe полностью безопасными](https://github.com/ziglang/zig/issues/2301)
+
+## Zig конкурирует с C, а не зависит от него
+
+Стандартная библиотека Zig интегрируется с libc, но не зависит от неё. Вот "Hello, World!":
+
+[]($code.language('=html').buildAsset('features/4-hello.zig'))
+
+При компиляции с флагом `-O ReleaseSmall`, без символов отладки и в однопоточном режиме, это создает статический исполняемый файл размером 9.8 КиБ для платформы x86_64-linux:
+```
+$ zig build-exe hello.zig -O ReleaseSmall -fstrip -fsingle-threaded
+$ wc -c hello
+9944 hello
+$ ldd hello
+ not a dynamic executable
+```
+
+Сборка для Windows выходит ещё меньше, всего 4096 байта:
+```
+$ zig build-exe hello.zig -O ReleaseSmall -fstrip -fsingle-threaded -target x86_64-windows
+$ wc -c hello.exe
+4096 hello.exe
+$ file hello.exe
+hello.exe: PE32+ executable (console) x86-64, for MS Windows
+```
+
+## Порядок-независимые объявления на верхнем уровне
+
+Объявления на верхнем уровне, например, глобальные переменные, не зависят от порядка расположения и анализируются по мере необходимости. Инициализирующие значения глобальных переменных [вычисляются на этапе компиляции](#compile-time-reflection-and-compile-time-code-execution).
+
+[]($code.language('=html').buildAsset('features/5-global-variables.zig'))
+
+## Опциональный тип вместо нулевых указателей
+
+В некоторых языках программирования нулевые указатели часто становятся причиной множества ошибок во время выполнения программы, и даже считаются [одной из крупнейших ошибок в области компьютерных наук](https://www.lucidchart.com/techblog/2015/08/31/the-worst-mistake-of-computer-science/).
+
+В Zig указатели, не имеющие дополнительных модификаторов, не могут быть нулевыми:
+
+[]($code.language('=html').buildAsset('features/6-null-to-ptr.zig'))
+
+Однако любой тип может быть превращен в [опциональный тип](https://ziglang.org/documentation/master/#Optionals) с помощью префикса ?:
+
+[]($code.language('=html').buildAsset('features/7-optional-syntax.zig'))
+
+Чтобы получить значение из опционального типа, можно использовать `orelse`, задав значение по умолчанию:
+
+[]($code.language('=html').buildAsset('features/8-optional-orelse.zig'))
+
+Другой вариант — использовать `if`:
+
+[]($code.language('=html').buildAsset('features/9-optional-if.zig'))
+
+Такой же синтаксис используется и с [while](https://ziglang.org/documentation/master/#while):
+
+[]($code.language('=html').buildAsset('features/10-optional-while.zig'))
+
+## Ручное управление памятью
+
+Библиотека, написанная на Zig, может быть использована в любом месте:
+
+- [Десктопные приложения](https://github.com/TM35-Metronome/)
+- Серверы с низкой задержкой
+- [Ядра операционных систем](https://github.com/AndreaOrru/zen)
+- [Встраиваемые системы](https://github.com/skyfex/zig-nrf-demo/)
+- Программное обеспечение реального времени, например, для живых выступлений, самолётов, кардиостимуляторов
+- [В веб-браузерах или других плагинах с WebAssembly](https://shritesh.github.io/zigfmt-web/)
+- С другими языками программирования, используя C ABI (Application Binary Interface)
+
+Для этого разработчики на Zig должны самостоятельно управлять памятью и обрабатывать ошибки при выделении памяти.
+
+Это справедливо и для стандартной библиотеки Zig. Все функции, требующие выделения памяти, принимают параметр аллокатора. Благодаря этому стандартная библиотека Zig может использоваться даже для независимых целевых платформах.
+
+Помимо [нового подхода к обработке ошибок](#a-fresh-take-on-error-handling), Zig предоставляет конструкции [defer](https://ziglang.org/documentation/master/#defer) и [errdefer](https://ziglang.org/documentation/master/#errdefer), чтобы сделать управление ресурсами — не только памятью — простым и легко проверяемым.
+
+Пример использования `defer` можно найти в разделе [Интеграция с библиотеками C без FFI](#integration-with-c-libraries-without-ffibindings). Вот пример применения `errdefer`:
+[]($code.language('=html').buildAsset('features/11-errdefer.zig'))
+
+## Новый подход к обработке ошибок
+
+Ошибки представляют собой значения и не могут быть проигнорированы:
+
+[]($code.language('=html').buildAsset('features/12-errors-as-values.zig'))
+
+Ошибки можно обработать с помощью [catch](https://ziglang.org/documentation/master/#catch):
+
+[]($code.language('=html').buildAsset('features/13-errors-catch.zig'))
+
+Ключевое слово [try](https://ziglang.org/documentation/master/#try) является сокращением для `catch |err| return err`:
+
+[]($code.language('=html').buildAsset('features/14-errors-try.zig'))
+
+Обратите внимание, что это [трассировка возврата ошибки](https://ziglang.org/documentation/master/#Error-Return-Traces), а не [трассировка стека](#stack-traces-on-all-targets). Для создания этой трассировки разворачивание стека не потребовалось, что позволило исключить дополнительные затраты на производительность.
+
+Ключевое слово [switch](https://ziglang.org/documentation/master/#switch), применяемое к ошибке, гарантирует, что все возможные ошибки будут обработаны:
+
+[]($code.language('=html').buildAsset('features/15-errors-switch.zig'))
+
+Ключевое слово [unreachable](https://ziglang.org/documentation/master/#unreachable) служит для того, чтобы заверить, что никаких ошибок не случится:
+
+[]($code.language('=html').buildAsset('features/16-unreachable.zig'))
+
+Это вызывает [неопределённое поведение](#performance-and-safety-choose-two) в небезопасных режимах сборки, поэтому используйте его только при полной уверенности в успехе.
+
+### Трассировки стеков на всех платформах
+
+Трассировки стеков и [трассировки возвратов ошибок](https://ziglang.org/documentation/master/#Error-Return-Traces), показанные на этой странице, работают на всех целевых платформах уровня поддержки 1 и некоторых уровня поддержки 2. [И даже на независимых целевых платформах](https://andrewkelley.me/post/zig-stack-traces-kernel-panic-bare-bones-os.html)!
+
+Стандартная библиотека также предоставляет возможность захватить трассировку стека в любое время и впоследствии вывести её в стандартный поток ошибок:
+
+[]($code.language('=html').buildAsset('features/17-stack-traces.zig'))
+
+Эту технику можно увидеть в действии в [проекте GeneralPurposeDebugAllocator](https://github.com/andrewrk/zig-general-purpose-allocator/#current-status).
+
+## Обобщённые структуры данных и функции
+
+Типы являются значениями, которые должны быть известны на этапе компиляции:
+
+[]($code.language('=html').buildAsset('features/18-types.zig'))
+
+Обобщённая структура данных — это просто функция, которая возвращает `type`:
+
+[]($code.language('=html').buildAsset('features/19-generics.zig'))
+
+## Рефлексия во время компиляции и выполнение кода на этапе компиляции
+
+Встроенная функция [@typeInfo](https://ziglang.org/documentation/master/#typeInfo) предоставляет возможности для рефлексии:
+
+[]($code.language('=html').buildAsset('features/20-reflection.zig'))
+
+Стандартная библиотека Zig использует эту технику для реализации форматированного вывода. Несмотря на то, что Zig является [компактным и простым языком](#small-simple-language), его форматированный вывод полностью реализован на самом Zig. В то же время, в C ошибки компиляции для `printf` жёстко запрограммированы в компиляторе. Аналогично, в Rust макрос для форматированного вывода также встроен в компилятор.
+
+Zig также может выполнять функции и блоки кода на этапе компиляции. В некоторых случаях, например, при инициализации глобальных переменных, выражение неявно вычисляется на этапе компиляции. В других ситуациях можно явно выполнить код на этапе компиляции, используя ключевое слово [comptime](https://ziglang.org/documentation/master/#comptime). Это может быть особенно эффективно в сочетании с утверждениями (assert):
+
+[]($code.language('=html').buildAsset('features/21-comptime.zig'))
+
+## Интеграция с библиотеками C без FFI
+
+[Функция @cImport](https://ziglang.org/documentation/master/#cImport) позволяет напрямую импортировать типы, переменные, функции и простые макросы для использования в Zig. Она даже переводит встроенные функции из C в Zig.
+
+Вот пример генерации синусоидальной волны с использованием [libsoundio](http://libsound.io/):
+
+sine.zig
+[]($code.language('=html').buildAsset('features/22-sine-wave.zig'))
+
+```
+$ zig build-exe sine.zig -lsoundio -lc
+$ ./sine
+Output device: Built-in Audio Analog Stereo
+^C
+```
+
+[Этот код на Zig значительно проще, чем эквивалентный код на C](https://gist.github.com/andrewrk/d285c8f912169329e5e28c3d0a63c1d8), и обеспечивает более высокий уровень безопасности. Всё это достигается благодаря прямому импорту заголовочного файла C – без каких-либо обёрток.
+
+*Zig лучше использует библиотеки C, чем сами C-библиотеки.*
+
+### Zig также является компилятором C
+
+Вот пример сборки C-кода с помощью Zig:
+
+hello.c
+```c
+#include