Zig/ru
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. |
debug
|
Build with debug extensions enabled. |
doc
|
Add extra documentation (API, Javadoc, etc). It is recommended to enable per package instead of globally |
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
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) в новых версиях):
Feature | Debug (default) | ReleaseFast | ReleaseSafe | ReleaseSmall |
---|---|---|---|---|
Compilation speed | Fast | Slow | Slow | Slow |
Safety checks at runtime | Enabled | Disabled | Enabled | Disabled |
Optimizations | Disabled | Optimized for speed | Optimized for speed | Optimized for size |
Reproducible | Not guaranteed | Yes | Yes | Yes |
Equivalent in C
(interop. or compiling)[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
См. также
Внешние ресурсы
- Официкальный список сообществ
- Официальный список проектов сообщества и список awesome-zig
- Ziglings — обучение Zig путём исправления маленьких, сломанных программ, вдохновлено Rustlings
- Различия между zig cc и clang
Примечания
- ↑ Integration with C libraries without FFI/bindings, Zig's Overview. Retrieved on February 19th, 2023.
- ↑ Andrew Kelley.
zig cc
: Powerful Drop-In Replacement for GCC/Clang, Andrew Kelley's blog. March 24th, 2020. Retrieved on February 19th, 2023. - ↑ Aro — a C compiler written in Zig. Retrieved on February 19th, 2023.
- ↑ 0.10.0 Release Notes, retrieved on January 26, 2023.
- ↑ Linux Kernel Version Support, retrieved on January 26, 2023.
- ↑ https://github.com/ziglang/zig/blob/b57081f039bd3f8f82210e8896e336e3c3a6869b/src/Compilation.zig#L4416-L4444