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. |
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:
# По умолчанию 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
Примечания
- ↑ 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