Zig/ru

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page Zig and the translation is 100% complete.
Other languages:

Zig — это язык программирования общего назначения и инструмент для создания надёжного, оптимального и переиспользуемого ПО. Zig стремится заменить язык C и может использовать или обьявлять функции C, не используя FFI[1] и компилировать код на C и C++, используя libclang.[2] Авторы так же работают над своим собственным компилятором C[3], чтобы эти функции были доступны и без libclang.

Установка

Требования

Предупреждение
Компиляция Zig 0.10.1 требует до 9.6 ГиБ ОЗУ.[4]

Zig поддерживает ядро Linux версии 3.16 и выше.[5] Если Zig компилируется из исходного кода, необходимо использовать тот же компилятор, что и при компиляции LLVM/Clang, иначе могут возникнуть неожиданные проблемы (см. раздел Решение проблем ниже).

USE-флаги

USE flags for dev-lang/zig A robust, optimal, and maintainable programming language

+llvm Build with LLVM backend and extensions enabled.
doc Add extra documentation (API, Javadoc, etc). It is recommended to enable per package instead of globally
test Enable dependencies and/or preparations necessary to run tests (usually controlled by FEATURES=test but can be toggled independently)
verify-sig Verify upstream signatures on distfiles

USE flags for dev-lang/zig-bin A robust, optimal, and maintainable programming language

doc Add extra documentation (API, Javadoc, etc). It is recommended to enable per package instead of globally
verify-sig Verify upstream signatures on distfiles

Emerge

Заметка
Замените в тексте "dev-lang/zig" на "dev-lang/zig-bin", если вы хотите использовать двоичный пакет (при условии наличия на вашей архитектуре).

В настоящее время эти пакеты не стабилизированы ни для какой архитектуры и отмечены как тестируемые на ограниченном наборе архитектур, поэтому пользователю понадобится разрешить тестовую ветку (~arch, замените архитектурой системы) для конкретного пакета:

root #echo "dev-lang/zig ~arch" >> /etc/portage/package.accept_keywords

Затем установите пакет:

root #emerge --ask dev-lang/zig

Конфигурация

ZIG_MCPU и ZIG_TARGET

Чтобы настроить целевую систему и процессор, для которого будет собираться пакет dev-lang/zig, существуют переменные ZIG_MCPU и ZIG_TARGET (которые будут переданы как аргументы -target и -mcpu для zig:

ФАЙЛ /etc/portage/make.conf/zigПримеры ZIG_MCPU и ZIG_TARGET
# По умолчанию ZIG_MCPU и ZIG_TARGET равны "native"
# В случае кросс-компиляции ZIG_MCPU равен "baseline"
# и ZIG_TARGET конвертируется из CTARGET или CHOST
# В большинстве случаев пользователю не нужно выставлять специальные значения, кроме случаев, когда "native" или конвертация не работает
#
# ZIG_TARGET содержит следующие обязательные параметры: <архитектура>-<ос>-<abi> (ABI - двоичный интерфейс приложения)
ZIG_TARGET="x86_64-linux-gnu" # Для компьютера на базе AMD64, с ядром Linux и glibc
# И опционально: min_version...max_version для ОС и версия ABI/libc
ZIG_TARGET="x86_64-linux.6.1.12...6.1.12-gnu.2.36" # Для ядра Linux 6.1.12 и glibc 2.36
#
# ZIG_MCPU требует параметр для названия архитектуры
ZIG_MCPU="znver2" # Для процессоров семейства Zen 2
# И опционально возможности для этой архитектуры
# ("+" означает наличие и "-" означает отсутствие этой возможности)
ZIG_MCPU="x86_64+x87-sse" # Для процессоров на базе архитектуры AMD64, с наличием поддержки инструкций X87, но без SSE2

Установка слота по умолчанию

С помощью команды eselect можно настраивать символьную ссылку /usr/bin/zig.

user $eselect zig help
Manage Zig versions
Usage: eselect zig <action> <options>
Standard actions:
  help                      Display help text
  usage                     Display usage information
  version                   Display version information
Extra actions:
  list                      List available Zig versions
  set <target>              Set active Zig version
    target                    Target name or number (from 'list' action)
  show                      Show current Zig version
  update                    Automatically update the zig symlink
    ifunset                   Do not override currently set version
user $eselect zig list
Available Zig versions:
  [1]   zig-0.10.1 *
  [2]   zig-9999
  [3]   zig-bin-0.10.1

Переменные окружения

Заметка
К сожаленью, с помощью переменных окружения нельзя выставить другие аргументы (такие, как целевая система или режим оптимизации), поэтому пользователю нужно указывать их в командной строке.

Аргументы в командной строке имеют приоритет выше, чем следующие переменные окружения:

  • ZIG_GLOBAL_CACHE_DIR - путь к каталогу, где кэшируются объекты, общие для всех компиляций
  • ZIG_LOCAL_CACHE_DIR - путь к каталогу, где кэшируется текущая компиляция, по умолчанию рядом с build.zig
  • ZIG_LIB_DIR - путь к стандартной библиотеке Zig

Использование

Общее

Предупреждение
Множество програм и библиотек, написанных на Zig, используют языковые возможности во время компиляции. Более подробная информация достпуна в справочнике языка, вкратце: во время компиляции Zig может выполнять произвольный код из исходных файлов (build.zig, стандартной библиотеки, самого проекта и т.д.), поэтому будьте осторожны, пожалуйста.
user $zig --help

Большинство команд, сгрупированных вместе, как с ast-check до translate-c, имеют одинаковые параметры командной строки.

Для второй группы, настоятельно рекомендуется использовать параметр -fstrip для уменьшения размера исполняемых файлов, кроме случаев отладки.

Режимы сборки

Zig имеет 4 "режимов сборки" (build modes) (или "режимов оптимизации" (optimize modes) в новых версиях):

Параметр Debug (по умолчанию) ReleaseFast ReleaseSafe ReleaseSmall
Скорость компиляции Высокая Низкая Низкая Низкая
Проверки безопасности во время выполнения (runtime) Включены Отключены Включены Отключены
Оптимизации Отключены Включены, для ускорения Включены, для ускорения Включены, для уменьшения размера
Воспроизводимость результатов Не гарантированно Да Да Да
Эквивалент в C

(во время межъязыкового использования или компиляции)[6]

-D_DEBUG -O0 -DNDEBUG -O2 -O2 -D_FORTIFY_SOURCE=2 -DNDEBUG -Os
Заметка
Проверки безопасности во время выполнения (runtime) могут быть включены или отключены в отдельной зоне видимости или блоке, добавив @setRuntimeSafety. Проверки безопасности во время компиляции всегда включены.

Поддержка LSP

Неофициальный LSP сервер предоставляется пакетом dev-zig/zls из GURU репозитория. Для установки следуйте этому руководству, чтобы включить GURU репозиторий, разрешите тестовую ветвь для этого пакета и введите:

root #emerge --ask dev-zig/zls::guru

Поддержка в текстовых редакторах

Смотрите этот список инструментов от авторов. На данный момент пакетов для этих инструментов не существует.

Freestanding

См. посты Использование Zig для сборки для «голого железа» RISCV32 (англ.) и Сборка приложение для «интернета вещей» с использованием Zig и LoRaWAN (англ.).

Решение проблем

"undefined reference to ..." во время установки

Наиболее возможной причиной является то, что пакеты LLVM и Clang были собраны с другим компилятором C++, чем Zig. Убедитесь, что выставлен одинаковый компилятор и установите пакет снова.

warning: Encountered error: UnexpectedEndOfFile, falling back to default ABI and dynamic linker.

Компилятор Zig зависит от наличия файла /usr/bin/env, чтобы получить стандартную библиотеку C хоста. Он проверяет, является ли файл /usr/bin/env исполняемым ELF файлом, или это символьная ссылка/шебанг на другой исполняемый файл, и повторяет эту операцию рекурсивно, пока не найдёт исполняемый файл. Затем, он пытается извлечь информацию о стандартной библиотеке C из этого ELF файла. Возникновение этого сообщения означает, что Zig не смог найти эту информацию и выберет вариант по умолчанию (например, musl для Linux). Чтобы обойти это, можно добавить следующие аргументы к команде:

user $zig build -Dtarget=<целевая-система>

Или:

user $zig build-exe -target <целевая-система>

Где целевая-система это система, для которой будет компилироваться код, например, native-native-gnu или native-native-musl. Для более подробной информации о формате этого аргумента см. раздел ZIG_MCPU и ZIG_TARGET выше.

Удаление

Unmerge

root #emerge --ask --depclean --verbose dev-lang/zig

См. также

  • Clang — a C/C++/Objective-C/C++, CUDA, and RenderScript language front-end for the LLVM project
  • Rust — a general-purpose, multi-paradigm, compiled, programming language.
  • Go — an open source, statically typed, compiled programming language

Внешние ресурсы

  • Официкальный список сообществ
  • Официальный список проектов сообщества и список awesome-zig
  • Ziglings — обучение Zig путём исправления маленьких, сломанных программ, вдохновлено Rustlings
  • Различия между zig cc и clang

Примечания