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 + +int main(int argc, char **argv) { + printf("Hello world\n"); + return 0; +} +``` + +``` +$ zig build-exe hello.c --library c +$ ./hello +Hello world +``` + +Флаг `--verbose-cc` позволяет увидеть, какие команды компилятора C были выполнены: +``` +$ zig build-exe hello.c --library c --verbose-cc +zig cc -MD -MV -MF .zig-cache/tmp/42zL6fBH8fSo-hello.o.d -nostdinc -fno-spell-checking -isystem /home/andy/dev/zig/build/lib/zig/include -isystem /home/andy/dev/zig/build/lib/zig/libc/include/x86_64-linux-gnu -isystem /home/andy/dev/zig/build/lib/zig/libc/include/generic-glibc -isystem /home/andy/dev/zig/build/lib/zig/libc/include/x86_64-linux-any -isystem /home/andy/dev/zig/build/lib/zig/libc/include/any-linux-any -march=native -g -fstack-protector-strong --param ssp-buffer-size=4 -fno-omit-frame-pointer -o .zig-cache/tmp/42zL6fBH8fSo-hello.o -c hello.c -fPIC +``` + +Отметим, что если выполнить команду снова, она завершится мгновенно и без вывода: +``` +$ time zig build-exe hello.c --library c --verbose-cc + +real 0m0.027s +user 0m0.018s +sys 0m0.009s +``` + +Это возможно благодаря [системе кэширования артефактов сборки](https://ziglang.org/download/0.4.0/release-notes.html#Build-Artifact-Caching). Zig автоматически анализирует файл `.d` и использует надёжную систему кэширования, чтобы избежать выполнения лишней работы. + +Zig может не только компилировать C-код, но есть и веская причина выбрать Zig в качестве компилятора для C: [Zig поставляется с libc](#zig-ships-with-libc). + +### Экспорт функций, переменных и типов для использования в C-коде + +Одним из сценариев использования Zig является экспорт библиотеки через C ABI (Application Binary Interface) для вызова другими языками программирования. Ключевое слово `export` перед функциями, переменными и типами делает их частью интерфейса библиотеки: + +mathtest.zig +[]($code.language('=html').buildAsset('features/23-math-test.zig')) + +Для создания статической библиотеки: +``` +$ zig build-lib mathtest.zig +``` + +Для создания общей библиотеки: +``` +$ zig build-lib mathtest.zig -dynamic +``` + +Вот пример с использованием [системы сборки Zig](#zig-build-system): + +test.c +```c +#include "mathtest.h" +#include + +int main(int argc, char **argv) { + int32_t result = add(42, 1337); + printf("%d\n", result); + return 0; +} +``` + +build.zig +[]($code.language('=html').buildAsset('features/24-build.zig')) + +``` +$ zig build test +1379 +``` + +## Первоклассная поддержка кросс-компиляции + +Zig может создавать сборки для любой целевой платформы из Таблицы поддержки (см. последние релизные заметки) с уровнем поддержки 3 или выше. Никаких "кросс-компиляторов" устанавливать не требуется. Вот пример программы "Hello, World!" для текущей платформы: + +[]($code.language('=html').buildAsset('features/4-hello.zig')) + +Теперь чтобы собрать её для x86_64-windows, x86_64-macos и aarch64-linux: +``` +$ zig build-exe hello.zig -target x86_64-windows +$ file hello.exe +hello.exe: PE32+ executable (console) x86-64, for MS Windows +$ zig build-exe hello.zig -target x86_64-macos +$ file hello +hello: Mach-O 64-bit x86_64 executable, flags: +$ zig build-exe hello.zig -target aarch64-linux +$ file hello +hello: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, with debug_info, not stripped +``` + +Это работает *на любой* платформе с уровнем поддержки 3+ и *для любой* платформы с уровнем поддержки 3+. + +### Zig поставляется с libc + +Доступные целевые платформы libc можно узнать с помощью команды `zig targets`: +``` +... + "libc": [ + "aarch64_be-linux-gnu", + "aarch64_be-linux-musl", + "aarch64_be-windows-gnu", + "aarch64-linux-gnu", + "aarch64-linux-musl", + "aarch64-windows-gnu", + "armeb-linux-gnueabi", + "armeb-linux-gnueabihf", + "armeb-linux-musleabi", + "armeb-linux-musleabihf", + "armeb-windows-gnu", + "arm-linux-gnueabi", + "arm-linux-gnueabihf", + "arm-linux-musleabi", + "arm-linux-musleabihf", + "arm-windows-gnu", + "mips64el-linux-gnuabi64", + "mips64el-linux-gnuabin32", + "mips64el-linux-musl", + "mips64-linux-gnuabi64", + "mips64-linux-gnuabin32", + "mips64-linux-musl", + "mipsel-linux-gnu", + "mipsel-linux-musl", + "mips-linux-gnu", + "mips-linux-musl", + "powerpc64le-linux-gnu", + "powerpc64le-linux-musl", + "powerpc64-linux-gnu", + "powerpc64-linux-musl", + "powerpc-linux-gnu", + "powerpc-linux-musl", + "riscv64-linux-gnu", + "riscv64-linux-musl", + "s390x-linux-gnu", + "s390x-linux-musl", + "sparc-linux-gnu", + "sparcv9-linux-gnu", + "wasm32-freestanding-musl", + "x86-linux-gnu", + "x86-linux-musl", + "x86-windows-gnu", + "x86_64-linux-gnu", + "x86_64-linux-gnux32", + "x86_64-linux-musl", + "x86_64-windows-gnu" + ], + ``` + +Это означает, что `--library c` для этих целевых платформ *не зависит ни от каких системных файлов*! + +Давайте снова посмотрим на пример ["Hello, World!" на C](#zig-is-also-a-c-compiler): +``` +$ zig build-exe hello.c --library c +$ ./hello +Hello world +$ ldd ./hello + linux-vdso.so.1 (0x00007ffd03dc9000) + libc.so.6 => /lib/libc.so.6 (0x00007fc4b62be000) + libm.so.6 => /lib/libm.so.6 (0x00007fc4b5f29000) + libpthread.so.0 => /lib/libpthread.so.0 (0x00007fc4b5d0a000) + libdl.so.2 => /lib/libdl.so.2 (0x00007fc4b5b06000) + librt.so.1 => /lib/librt.so.1 (0x00007fc4b58fe000) + /lib/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007fc4b6672000) +``` + +[glibc](https://www.gnu.org/software/libc/) не поддерживает статические сборки, но [musl](https://www.musl-libc.org/) предоставляет такую возможность: +``` +$ zig build-exe hello.c --library c -target x86_64-linux-musl +$ ./hello +Hello world +$ ldd hello + not a dynamic executable +``` + +В этом примере Zig скомпилировал musl libc из исходного кода и затем провел линковку. Сборка musl libc для x86_64-linux сохраняется благодаря [системе кэширования](https://ziglang.org/download/0.4.0/release-notes.html#Build-Artifact-Caching), что позволяет в любой момент мгновенно получить к ней доступ. + +Данная функциональность доступна на любой платформе. Пользователи Windows и macOS могут компилировать код на Zig и C и связываться с libc для любой из указанных выше целевых платформ. Аналогично, код может быть перекомпилирован для других архитектур: +``` +$ zig build-exe hello.c --library c -target aarch64-linux-gnu +$ file hello +hello: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 2.0.0, with debug_info, not stripped +``` + +В некоторых аспектах Zig является даже лучшим компилятором C, чем сами компиляторы C! + +То, что предлагает Zig, намного шире, чем просто комплект инструментов для кросс-компиляции. Например, общий размер заголовков libc, которые поставляются с Zig, составляет 22 МиБ в распакованном виде. В то же время одни только заголовки для musl libc + linux на платформе x86_64 занимают 8 МиБ, а для glibc — 3.1 МиБ (glibc не включает заголовки linux), и при этом Zig в настоящее время включает 40 библиотек libc. Простое их объединение заняло бы 444 МиБ. Но благодаря инструменту [process_headers](https://github.com/ziglang/zig/blob/0.4.0/libc/process_headers.zig) и [тщательной ручной работе](https://github.com/ziglang/zig/wiki/Updating-libc), архивы с бинарниками Zig занимают приблизительно 30 МиБ, несмотря на поддержку libc для всех этих целевых платформ, а также compiler-rt, libunwind и libcxx, и несмотря на то, что Zig совместим с clang как компилятор C. Для сравнения, бинарная сборка clang версии 8.0.0 для Windows с сайта llvm.org составляет 132 МиБ. + +Имейте в виду, что только целевые платформы с уровнем поддержки 1 были тщательно протестированы. В планах [добавить больше библиотек libc](https://github.com/ziglang/zig/issues/514) (включая для Windows) и [увеличить тестовое покрытие для всех libc](https://github.com/ziglang/zig/issues/2058). + +Мы работаем над [менеджером пакетов для Zig](https://github.com/ziglang/zig/issues/943). В перспективе будет возможность создавать пакеты для библиотек на C, что сделает [систему сборки Zig](#zig-build-system) привлекательной как для разработчиков на Zig, так и для программистов на C. + +## Система сборки Zig + +Zig поставляется с собственной системой сборки, так что вам не понадобятся Make, CMake или другие подобные инструменты. +``` +$ zig init-exe +Created build.zig +Created src/main.zig + +Далее попробуйте `zig build --help` или `zig build run` +``` + +src/main.zig +[]($code.language('=html').buildAsset('features/25-all-bases.zig')) + + +build.zig +[]($code.language('=html').buildAsset('features/26-build.zig')) + + +Давайте посмотрим на меню `--help`. +``` +$ zig build --help +Usage: zig build [steps] [options] + +Steps: + install (default) Copy build artifacts to prefix path + uninstall Remove build artifacts from prefix path + run Run the app + +General Options: + --help Print this help and exit + --verbose Print commands before executing them + --prefix [path] Override default install prefix + --search-prefix [path] Add a path to look for binaries, libraries, headers + +Project-Specific Options: + -Dtarget=[string] The CPU architecture, OS, and ABI to build for. + -Drelease-safe=[bool] optimizations on and safety on + -Drelease-fast=[bool] optimizations on and safety off + -Drelease-small=[bool] size optimizations on and safety off + +Advanced Options: + --build-file [file] Override path to build.zig + --cache-dir [path] Override path to zig cache directory + --override-lib-dir [arg] Override path to Zig lib directory + --verbose-tokenize Enable compiler debug output for tokenization + --verbose-ast Enable compiler debug output for parsing into an AST + --verbose-link Enable compiler debug output for linking + --verbose-ir Enable compiler debug output for Zig IR + --verbose-llvm-ir Enable compiler debug output for LLVM IR + --verbose-cimport Enable compiler debug output for C imports + --verbose-cc Enable compiler debug output for C compilation + --verbose-llvm-cpu-features Enable compiler debug output for LLVM CPU features +``` + +Можно увидеть, что один из доступных шагов — это run. +``` +$ zig build run +All your base are belong to us. +``` + +Вот несколько примеров скриптов сборки: + +- [Скрипт сборки игры OpenGL Tetris](https://github.com/andrewrk/tetris/blob/master/build.zig) +- [Скрипт сборки аркадной игры для Raspberry Pi 3](https://github.com/andrewrk/clashos/blob/master/build.zig) +- [Скрипт сборки самодостаточного компилятора Zig](https://github.com/ziglang/zig/blob/master/build.zig) + +## Конкурентность через асинхронные функции + +В Zig 0.5.0 [появились асинхронные функции](https://ziglang.org/download/0.5.0/release-notes.html#Async-Functions). Они не зависят от операционной системы или даже от памяти в куче. Это значит, что асинхронные функции доступны и для независимых целевых платформ. + +Zig автоматически понимает, является ли функция асинхронной, и позволяет использовать `async`/`await` для неасинхронных функций, что в свою очередь означает, что **библиотеки Zig независимы от блокирующего и асинхронного ввода-вывода**. [Zig избегает окраски функций](http://journal.stuffwithstuff.com/2015/02/01/what-color-is-your-function/). + + + +Стандартная библиотека Zig реализует цикл событий (event loop), который распределяет асинхронные функции по пулу потоков для достижения M:N конкурентности. Безопасность многопоточности и обнаружение гонок находятся в стадии активной разработки и исследования. + +## Широкий спектр поддерживаемых целевых платформ + +Zig применяет систему "уровней поддержки" для обозначения уровня поддержки различных целевых платформ. + +[Таблица поддержки по состоянию на Zig 0.11.0](https://ziglang.org/download/0.11.0/release-notes.html#Support-Table) + +## Дружелюбное отношение к мейнтейнерам пакетов + +Эталонная версия компилятора Zig пока ещё не является полностью самодостаточной, однако для перехода от системного C++ компилятора к полностью самодостаточному компилятору Zig для любой целевой платформы потребуется всего 3 шага. Майя Рашиш отмечает, что [портирование Zig на другие платформы — это увлекательный и быстрый процесс](http://coypu.sdf.org/porting-zig.html). + +[Режимы сборки](https://ziglang.org/documentation/master/#Build-Mode) без отладки воспроизводимы/детерминированы. + +Есть [JSON версия страницы загрузки](https://ziglang.org/download/index.json). + +Несколько членов команды Zig имеют опыт поддержания пакетов. + +- [Daurnimator](https://github.com/daurnimator) поддерживает пакет для [Arch Linux](https://archlinux.org/packages/extra/x86_64/zig/) +- [Marc Tiehuis](https://tiehuis.github.io/) поддерживает пакет для Visual Studio Code. +- [Andrew Kelley](https://andrewkelley.me/) провёл около года, занимаясь [созданием пакетов для Debian и Ubuntu](https://qa.debian.org/developer.php?login=superjoe30%40gmail.com&comaint=yes), и время от времени вносит вклад в [nixpkgs](https://github.com/NixOS/nixpkgs/). +- [Jeff Fowler](https://blog.jfo.click/) поддерживает пакет для Homebrew и начал разработку [пакета для Sublime](https://github.com/ziglang/sublime-zig-language) (ныне поддерживается [emekoi](https://github.com/emekoi)). \ No newline at end of file diff --git a/content/ru-RU/learn/samples.smd b/content/ru-RU/learn/samples.smd new file mode 100644 index 000000000..20c95b9f2 --- /dev/null +++ b/content/ru-RU/learn/samples.smd @@ -0,0 +1,40 @@ +--- +.title = "Примеры", +.author = "", +.date = @date("2024-08-07:00:00:00"), +.layout = "page.shtml", +.custom = { + "mobile_menu_title": "Примеры", + "toc": true, +}, +--- + +# [Вызов функций внешних библиотек]($heading.id('ext')) +Все функции системного API можно вызывать напрямую, без необходимости в дополнительных привязках. + +[]($code.language('=html').buildAsset("samples/0-windows-msgbox.zig")) + +# [Обнаружение утечек памяти]($heading.id('leak')) +Используя `std.heap.GeneralPurposeAllocator`, можно отслеживать двойные освобождения и утечки памяти. + +[]($code.language('=html').buildAsset("samples/1-memory-leak.zig")) + +# [Интероперабельность с C]($heading.id('c-interop')) +Пример импорта заголовочного файла C и связывания с libc и raylib. + +[]($code.language('=html').buildAsset("samples/2-c-interop.zig")) + + +# [Zigg Zagg]($heading.id('zigg-zagg')) +Zig *оптимизирован* для собеседований по программированию (нет). + +[]($code.language('=html').buildAsset("samples/3-ziggzagg.zig")) + +# [Обобщённые типы]($heading.id('generic')) +В языке Zig типы рассматриваются как значения на этапе компиляции. Мы используем функции, возвращающие типы, для реализации обобщённых алгоритмов и структур данных. В этом примере мы создаём простую обобщённую очередь и тестируем её работоспособность. + +[]($code.language('=html').buildAsset("samples/4-generic-type.zig")) + +# [Использование cURL из Zig]($heading.id('curl')) + +[]($code.language('=html').buildAsset("samples/5-curl.zig")) diff --git a/content/ru-RU/learn/tools.smd b/content/ru-RU/learn/tools.smd new file mode 100644 index 000000000..eafeaee44 --- /dev/null +++ b/content/ru-RU/learn/tools.smd @@ -0,0 +1,40 @@ +--- +.title = "Инструменты", +.author = "", +.date = @date("2024-08-07:00:00:00"), +.layout = "page.shtml", +.custom = { + "mobile_menu_title": "Инструменты", + "toc": true, +}, +--- + +# [Языковые серверы]($heading.id('lsp')) +Языковые серверы — это инструменты, независимые от редактора, которые предоставляют подсветку синтаксиса, автодополнение и множество других функций. Рекомендуется использовать языковой сервер вместо простого расширения для подсветки синтаксиса, чтобы улучшить качество взаимодействия со средой разработки. + +- [zigtools/zls](https://github.com/zigtools/zls) + +# [Текстовые редакторы]($heading.id('editors')) +Инструменты, специфичные для редакторов, в основном предназначенные для подсветки синтаксиса. + +## VS Code +- [ziglang/vscode-zig](https://github.com/ziglang/vscode-zig) + +## Sublime Text +- [ziglang/sublime-zig-language](https://github.com/ziglang/sublime-zig-language) + +## Vim +- [ziglang/zig.vim](https://github.com/ziglang/zig.vim) + +## Emacs +- [ziglang/zig-mode](https://github.com/ziglang/zig-mode) + +## Kate +- [ziglang/kde-syntax-highlighting](https://github.com/ziglang/kde-syntax-highlighting) + +## JetBrains (IntelliJ IDEA, Fleet и другие) +- [ZigBrains](https://plugins.jetbrains.com/plugin/22456-zigbrains) +- [ZigLang](https://plugins.jetbrains.com/plugin/17143-ziglang) +- [ZigSupport](https://plugins.jetbrains.com/plugin/18062-zig-support) +- [Zig](https://plugins.jetbrains.com/plugin/10560-zig) + diff --git a/content/ru-RU/learn/why_zig_rust_d_cpp.smd b/content/ru-RU/learn/why_zig_rust_d_cpp.smd new file mode 100644 index 000000000..d98863dec --- /dev/null +++ b/content/ru-RU/learn/why_zig_rust_d_cpp.smd @@ -0,0 +1,98 @@ +--- +.title = "Почему Zig, когда уже есть C++, D и Rust?", +.author = "", +.date = @date("2024-08-07:00:00:00"), +.layout = "page.shtml", +.custom = { + "mobile_menu_title": "Почему Zig?", +}, +--- + +# Нет скрытых потоков управления + +Если код на 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 позволяет разработчикам полностью управлять выделением памяти в куче. В языке отсутствует ключевое слово `new` или другие механизмы, которые бы автоматически использовали кучу (например, оператор объединения строк[1]). Концепция работы с кучей полностью отдана на откуп библиотекам и собственно приложению, а не встроена в сам язык. + +Примеры скрытого выделения памяти: + +* В Go использование `defer` приводит к выделению памяти на локальном стеке функции. Этот подход к управлению потоком может быть неочевидным и способен вызвать ошибки из-за нехватки памяти, особенно если `defer` используется внутри цикла.* В C++ корутины используют память в куче для выполнения своих вызовов. +* В Go вызов функции может вызвать выделение памяти в куче, поскольку горутины используют небольшие стеки, которые увеличиваются по мере углубления стека вызовов. +* Основные API стандартной библиотеки Rust паникуют при нехватке памяти, а альтернативные API, принимающие параметры аллокатора, недостаточно проработаны (см. [rust-lang/rust#29802](https://github.com/rust-lang/rust/issues/29802)). + +Почти все языки программирования с автоматическим управлением памятью имеют скрытые выделения памяти, так как сборщик мусора незаметно управляет ими при очистке, скрывая их от глаз разработчика. + +Основная проблема скрытых выделений памяти в том, что они затрудняют *переиспользование* кода, неоправданно ограничивая количество сред, в которых этот код можно использовать. Проще говоря, существуют случаи, когда важно быть уверенным, что поток управления и вызовы функций не будут иметь побочных эффектов в виде выделения памяти, и язык программирования может удовлетворять этим требованиям только в том случае, если он чётко регулирует, когда и где выделяется память. + +В стандартной библиотеке Zig существуют функции, которые позволяют работать с аллокаторами памяти в куче. Однако эти функции не являются обязательными и не встроены в сам язык. Если вы не инициализируете такой аллокатор, можете быть уверены, что ваша программа не будет выделять память в куче. + +Каждая функция стандартной библиотеки Zig, которая требует выделения памяти в куче, принимает параметр `Allocator`. Это означает, что стандартная библиотека Zig поддерживает и независимые целевые платформы. Так, например, `std.ArrayList` и `std.AutoHashMap` могут использоваться для программирования на голом железе! + +Кастомные аллокаторы упрощают ручное управление памятью. В Zig есть отладочный аллокатор, который обеспечивает безопасность памяти, предотвращая ошибки, такие как использование освобожденной памяти или двойное освобождение. Он автоматически обнаруживает и выводит стек вызовов для утечек памяти. Также существует арена-аллокатор, который позволяет объединять любое количество аллокаций в одну, освобождая их все сразу, вместо того чтобы управлять каждой аллокацией отдельно. Специальные аллокаторы могут быть использованы для повышения производительности или оптимизации использования памяти в зависимости от потребностей конкретного приложения. + +[1]: На самом деле в Zig есть оператор объединения строк (или, более широко, объединения массивов), но он работает только на этапе компиляции и, следовательно, не требует выделения памяти в куче во время выполнения программы. + +# Полноценная поддержка работы без стандартной библиотеки + +Как уже упоминалось, стандартная библиотека в Zig является полностью опциональной. Каждый API стандартной библиотеки компилируется в вашу программу только при его использовании. Zig одинаково поддерживает как связывание с libc, так и работу без него. Этот язык удобен для разработок как на голом железе, так и для создания сложных высокопроизводительных приложений. + +Таким образом, вы получаете лучшее из обоих миров: например, программы WebAssembly на Zig могут использовать стандартную библиотеку и при этом создавать минимальные по размеру бинарные файлы по сравнению с другими языками, поддерживающими компиляцию в WebAssembly. + +# Кроссплатформенный язык для библиотек + +Переиспользование кода является одной из ключевых идей в программировании. Однако на практике часто приходится изобретать велосипед заново, и порой это оправдано: + + * Если у приложения есть требования к работе в реальном времени, то использование библиотек со сборщиком мусора или любым другим недетерминированным поведением недопустимо. + * Когда язык программирования позволяет игнорировать ошибки, возникает риск того, что они не будут корректно обрабатываться в используемых библиотеках. Это может приводить к желанию переписать библиотеку с нуля, чтобы гарантировать надёжную обработку всех ошибок. Однако язык Zig разработан с акцентом на то, чтобы обработка ошибок была наиболее очевидным и простым решением для программиста. Поэтому часто можно быть уверенным в том, что библиотеки, написанные на Zig, обеспечивают надлежащую обработку всех ошибок. + * Сегодня можно с уверенностью сказать, что C — это самый универсальный и кроссплатформенный язык программирования. Любой язык, который не предоставляет возможности взаимодействия с кодом на C, рискует остаться в тени. Zig стремится стать новым стандартом, одновременно упрощая соответствие C ABI (Application Binary Interface) для работы с внешними функциями и внедряя механизмы безопасности, которые помогают избежать типичных ошибок при разработке. + +# Менеджер пакетов и система сборки для существующих проектов + +Zig — это не только язык программирования, но и целый набор инструментов. В его составе есть [система сборки и менеджер пакетов](/learn/build-system/), которые будут полезны даже для традиционных C/C++ проектов. + +Zig можно использовать не только для написания кода вместо C или C++, но и в качестве замены инструментам вроде autotools, CMake, Make, SCons, Ninja и других. Помимо этого, Zig предлагает менеджер пакетов для управления нативными зависимостями, а система сборки Zig актуальна даже в том случае, если весь код вашего проекта полностью написан на C или C++. Например, [портирование ffmpeg на систему сборки Zig](https://github.com/andrewrk/ffmpeg) позволяет компилировать ffmpeg **на любой** платформе для **любой другой** платформы с использованием единственного [исполняемого zig-файла размером 50 МиБ](/download/). Для проектов с открытым исходным кодом такая возможность сборки из исходников — и даже кросс-компиляция — может стать критически важным фактором в привлечении и удержании ценных разработчиков. + +Системные менеджеры пакетов, такие как apt-get, pacman, homebrew и другие, играют ключевую роль в удобстве пользователей, но зачастую не полностью удовлетворяют потребностям разработчиков. Для проектов с открытым исходным кодом сложный процесс сборки может стать серьёзным препятствием. В проектах на C/C++ наличие зависимостей особенно критично – особенно в Windows, где отсутствует централизованный менеджер пакетов. Даже сборка самого Zig часто затруднительна для многих из-за зависимости от LLVM. Zig предлагает способ подключения проектов к нативным библиотекам напрямую, без необходимости полагаться на то, что в системном менеджере пакетов пользователей установлена нужная версия. Этот подход практически гарантирует успешную сборку проектов с первой попытки, независимо от используемой системы и целевой платформы. + +**Другие языки программирования имеют свои менеджеры пакетов, но они не устраняют назойливые системные зависимости так эффективно, как это делает Zig.** + +Zig может заменить систему сборки проекта на более удобный язык с использованием декларативного API. Этот API также обеспечивает управление пакетами, что фактически позволяет зависеть от других библиотек на C. Возможность иметь такие зависимости даёт возможность создавать более высокоуровневые абстракции, что в свою очередь способствует распространению и переиспользованию кода. + +# Простота + +C++, Rust и D настолько насыщены различными функциями, что это может отвлечь от разработки. Вместо того чтобы сосредоточиться на разработке самого приложения, вы можете оказаться погружёнными в изучение тонкостей самих языков. + +В отличие от них, в Zig нет макросов, но это не делает его менее мощным. Этот язык позволяет выразить сложные программы в ясной и ненавязчивой форме. Например, в Rust есть макросы, такие как `format!`, которые требуют поддержки на уровне компилятора. В Zig же аналогичная функция из стандартной библиотеки реализована без какой-либо специальной поддержки на уровне компилятора. + +Таким образом, Zig помогает сосредоточиться на разработке приложения, минимизируя отвлекающие факторы, связанные с освоением языка. + +# Инструментарий + +Zig можно скачать из [раздела загрузок](/download/). Zig предоставляет бинарные архивы для Linux, Windows и macOS. Вот что включает в себя такой архив: + +* устанавливается простым скачиванием и распаковкой архива, не требуя системной конфигурации +* статически скомпилирован, поэтому отсутствуют зависимости во время выполнения +* поддерживает использование LLVM для оптимизированных релизных сборок, одновременно используя собственные бэкенды для более быстрой компиляции +* предоставляет возможность экспортировать код на C +* готов для кросс-компиляции на большинство основных платформ +* содержит исходный код для libc, который будет динамически компилироваться по мере необходимости для любой поддерживаемой платформы +* включает систему сборки с поддержкой конкурентности и кэширования +* компилирует код на C и C++ с поддержкой libc +* обеспечивает полную совместимость с командной строкой GCC/Clang через `zig cc` +* содержит компилятор ресурсов для Windows diff --git a/content/ru-RU/zsf.smd b/content/ru-RU/zsf.smd new file mode 100644 index 000000000..23e70c839 --- /dev/null +++ b/content/ru-RU/zsf.smd @@ -0,0 +1,90 @@ +--- +.title = "Zig Software Foundation", +.author = "", +.date = @date("2024-08-07:00:00:00"), +.layout = "page.shtml", +.custom = { + "mobile_menu_title": "ZSF", +}, +--- +# Спонсирование Zig Software Foundation + +Пожалуйста, рассмотрите возможность регулярного пожертвования. Поддержка и развитие качественного программного обеспечения требуют постоянной работы! + +```=html +
+ Пожертвовать + + + +
+``` + + +# Миссия +Миссия Zig Software Foundation (ZSF) заключается в продвижении, защите и развитии языка программирования Zig, поддержке и укреплении международного сообщества Zig-программистов, а также в предоставлении образовательных и наставнических программ для студентов с целью формирования следующего поколения компетентных и требовательных друг к другу программистов. + +**ZSF является некоммерческой корпорацией 501(c)(3).** Финансовые отчёты, протоколы заседаний и другие детали [общедоступны](https://drive.google.com/drive/folders/1ucHARxVbhrBbuZDbhrGHYDTsYAs8_bMH?usp=sharing). + +# Члены совета + +- [Эндрю Келли](https://andrewkelley.me/) (Президент) +- [Джош Вулф](https://github.com/thejoshwolfe/) (Секретарь) +- [Мейсон Ремали](https://www.masonremaley.com/) (Казначей) + +# Спонсорство + +Жертвуя ZSF, вы финансируете развитие языка программирования Zig и его экосистемы, что, в свою очередь, приносит пользу более широкому сообществу свободного программного обеспечения за пределами ZSF. Участники сообщества Zig внесли ряд исправлений в [LLVM](https://llvm.org/), [Wine](https://winehq.org/), [QEMU](https://qemu.org/), [musl libc](https://musl.libc.org/), [GDB](https://www.gnu.org/software/gdb/) и другие проекты. + +ZSF — небольшая организация, которая эффективно распоряжается своими финансовыми ресурсами. Мы намерены сохранить её такой, и при этом стремимся превратить наших волонтёров в оплачиваемых мейнтейнеров, чтобы помочь со слиянием пулл-реквествов и ускорить продвижение к версии 1.0. Наша цель как некоммерческой организации — приносить пользу людям, поэтому мы считаем важным вознаграждать мейнтейнеров за их труд. + +# Информация о пожертвованиях +Ниже приведена важная информация для тех, кто предпочитает делать пожертвования не через GitHub Sponsors. Рекомендуем также ознакомиться с вашим местным законодательством, чтобы узнать, можно ли вычитать пожертвования из ваших налогов. + +## EIN +84-5105214 + +## Адрес +Zig Software Foundation +1632 1st Ave #21385 +New York, NY 10028 + +## Другие доступные способы пожертвований +- [Every](https://www.every.org/zig-software-foundation-inc/) +- [GitHub Sponsors](https://github.com/sponsors/ziglang) +- [Benevity](https://benevity.com) (рекомендуется, если ваш работодатель предлагает программу софинансирования!) +- Банковские переводы (включая из-за пределов США — можете связаться с нами для получения дополнительной информации) +- Физические чеки (см. адрес для отправки выше) +- [Wise](https://wise.com) + +**Пожалуйста, не стесняйтесь обращаться к нам по адресу donations@ziglang.org, если у вас есть вопросы или особые пожелания.** + +# Корпоративные спонсоры + +## Денежные пожертвования +Следующие компании оказывают прямую финансовую поддержку Zig Software Foundation, жертвуя более $1000 в месяц. +[]($code.language('=html').siteAsset('corporate-sponsors.html')) diff --git a/i18n/ru-RU.ziggy b/i18n/ru-RU.ziggy new file mode 100644 index 000000000..610f7abce --- /dev/null +++ b/i18n/ru-RU.ziggy @@ -0,0 +1,28 @@ +.back = "← Вернуться обратно на", +// index.shtml +.community = "Присоединиться к сообществу", +.source = "Исходный код", +.get_started = "НАЧАТЬ", +.latest_release = "Последний релиз:", +.documentation = "Документация", +.changes = "Изменения", +.overview = "Полный обзор", +.code_samples = "Больше примеров кода", +.all_communities = "Посмотреть все сообщества", +.learn_more = "Узнать больше", +.github_sponsors_update_frequency = "Этот раздел обновляется ежедневно.", +// learn.shtml +.version_unstable = "Нестабильная", +.version_latest_stable = "Последняя стабильная", +// download.shtml +.release_notes = "Примечания к релизу", +.language_reference = "Справочник по языку", +.std_docs = "Документация стандартной библиотеки", +.download_source = "Источник", +.download_os = "ОС", +.download_arch = "Архитектура", +.download_filename = "Имя файла", +.download_sig = "Сигнатура", +.download_size = "Размер", +// locale.shtml +.languages_menu = "Эта страница также доступна на следующих языках:",