Поддержка платформ
Zig поддерживает широкий спектр архитектур и операционных систем. Раздел «Таблица поддержки» и «Дополнительные платформы» охватывают целевые системы, для которых Zig может собирать программы, а README zig-bootstrap описывает целевые системы, под которые сам компилятор Zig можно легко кросс-компилировать.
Значимые изменения:
aarch64-openbsdтеперь протестирован нативно в CI Zig, обеспечивая высокое качество поддержки в будущем.- CI задачи для
aarch64-freebsdиaarch64-netbsdтеперь запускаются и на pull requests, а не только на pushes в master. - Обойдена ошибка LLVM, которая нарушала большинство бинарников
aarch64-windows, включая сам компилятор Zig. - Компилятор Zig теперь применяет обязательные техники усиления кода при компиляции для
aarch64-openbsd, чтобы результирующие бинарники действительно работали. - Zig теперь предоставляет трассировки стека при падениях и ошибках assert на 32-битном ARM. Некоторая работа ещё остаётся для целевых систем Thumb-only.
- Zig теперь предоставляет трассировки стека при падениях и ошибках assert на SPARC.
- Zig теперь обрабатывает коды аутентификации указателя при раскрутке стека на AArch64.
- Добавлена поддержка для целевых систем
loongarch32-linux-gnu[sf]. - Zig теперь имеет практически полезную поддержку 64-битного SPARC, и особенно
sparc64-linux. Это во многом благодаря новому ELF линкеру Zig, который теперь имеет лучшую поддержку этой целевой системы, чем LLD. - Стандартная библиотека Zig портирована на x32 и N32 ABI на x86-64 и 64-битном MIPS соответственно. Это нишевые ILP32 ABI, позволяющие использовать набор инструкций 64-бит с 32-битными указателями — обмен доступным адресным пространством на меньшее использование памяти и лучшую локальность кэша.
- Добавлена информация о целевых системах для некоторых игровых консолей:
aarch64-switch,arm-gba,mipsel-psxиpowerpc-wiiu - Добавлена очень ранняя поддержка
xtensa-linuxдля Zig. Обратите внимание, что пока эта поддержка может использоваться только через C backend или экспериментальный LLVM backend. - Стандартная библиотека Zig теперь имеет поддержку
arc[eb]-linux,csky-linuxиm88k-openbsdпри использовании C backend. - Стандартная библиотека Zig теперь имеет поддержку no-libc
microblaze[el]-linux,sh[eb]-linuxиsparc-linux. - Zig теперь требует
-mabi=ieeelongdoubleдля всех целевых систем PowerPC. Это просто формализация того, что уже было на практике; Zig никогда не поддерживал IBM "double-double" формат дляlong doubleи, вероятно, никогда не будет. В результате этот релиз прекращает поддержкуpowerpc-linux-gnueabi[hf], потому что glibc поддерживает только "double-double" формат на этих целевых системах. Целевые системыpowerpc-linux-musleabi[hf]остаются поддерживаемыми, так как они используют IEEE формат. - Этот релиз прекращает поддержку
powerpc64-linux-gnu. Zig когда-либо поддерживал только связывание ELFv2 бинарников для 64-битного PowerPC, и glibc официально не поддерживает ELFv2 на big endian — или IEEElong double, как выше. - Возможность Zig обнаруживать нативную модель CPU и функции значительно улучшена повсеместно; это влияет почти на каждую архитектуру на каждой поддерживаемой ОС.
- Базовая модель CPU была изменена для некоторых целевых систем:
aarch64-haiku:cortex_a55m68k-*:M68030mips64-openbsd:octeonpowerpc-netbsd:750powerpc64-freebsd:pwr8powerpc64-linux:pwr8powerpc64-openbsd:pwr9s390x-*:arch11sparc-*:genericsparc-linux:v9sparc64-*:ultrasparcxtensa-*:esp32
- В синтаксисе запроса целевой системы Zig, определение версии native libc теперь происходит только если тройка действительно использует native libc (т.е. компонент ABI опущен). Ожидаем, что это новое поведение лучше соответствует представлению людей о том, как работают запросы целевых систем, особенно при рассмотрении того, как работает компонент OS.
Система уровней
Уровень поддержки Zig для различных целевых систем широко категоризирован на четыре уровня, где Уровень 1 — наивысший. Цель состоит в том, чтобы целевые системы Уровня 1 имели нулевые отключённые тесты — это станет требованием для пост-1.0.0 релизов Zig.
Уровень 1
- Все нэкспериментальные возможности языка известны как работающие корректно.
- Компилятор может генерировать машинный код для этой целевой системы без полагания на LLVM.
- Интегрированный fuzzer работает на этой целевой системе (если применимо).
Уровень 2
- Абстракции кросс-платформы стандартной библиотеки имеют реализации для этой целевой системы.
- Неудачные assert'ы и падения выдают трассировки стека на этой целевой системе.
- libc доступна для этой целевой системы даже при кросс-компиляции (если применимо).
- Машины непрерывной интеграции собирают тесты модуля для этой целевой системы при каждом push'е.
Уровень 3
- Компилятор может генерировать машинный код для этой целевой системы, полагаясь на внешний backend, такой как LLVM.
- Линкер может производить объектные файлы, библиотеки и исполняемые файлы для этой целевой системы.
Уровень 4
- Компилятор может генерировать исходный код на ассемблере или C для этой целевой системы.
Таблица поддержки
В следующей таблице ✅ указывает на полную поддержку, ❌ указывает на отсутствие поддержки, а ⚠️ указывает на частичную поддержку, например только для некоторых подцелей или с известными проблемами. ❔ указывает, что статус в значительной степени неизвестен, обычно потому, что целевая система редко используется. Наведите на другие иконки для деталей.
Целевые системы, помеченные 🪦, устарелые; компилятор Zig и стандартная библиотека поддерживают best-effort поддержку для них, но эта поддержка, как ожидается, будет удалена в будущем.
| Уровень | Целевая система | Генерация кода | Линкер | Особенности языка | Стд. библиотека | Трассировки стека | Fuzzer | libc | CI |
|---|---|---|---|---|---|---|---|---|---|
| 1 | x86_64-linux |
🖥️⚡ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Требования версии ОС
Стандартная библиотека Zig имеет требования к минимальной версии для некоторых поддерживаемых операционных систем, которые в свою очередь влияют на сам компилятор Zig:
| ОС | Версия |
|---|---|
| Darwin | 15.0+ |
| DragonFly BSD | 6.4+ |
| FreeBSD | 14.0+ |
| Linux | 5.10+ |
| NetBSD | 10.1+ |
| OpenBSD | 7.8+ |
| Windows | 10+ |
Дополнительные платформы
Zig также имеет различные уровни поддержки для этих целевых систем, для которых система уровней не совсем применима:
aarch64-driverkitaarch64[_be]-freestandingaarch64-fuchsiaaarch64-hurdaarch64-switchaarch64-uefialpha-freestandingamdgcn-amdhsaamdgcn-amdpalamdgcn-mesa3darc[eb]-freestandingarm[eb]-freestandingarm-3dsarm-fuchsiaarm-gbaarm-uefiarm-vitaavr-freestandingbpf(eb,el)-freestandingcsky-freestandingez80-freestandingez80-tioshexagon-freestandinghppa[64]-freestandingkalimba-freestandingkvx-freestandinglanai-freestandingloongarch(32,64)-freestandingloongarch(32,64)-uefim68k-freestandingm88k-freestandingmicroblaze[el]-freestandingmips[64][el]-freestandingmipsel-psxmipsel-pspmsp430-freestandingnvptx[64]-cudanvptx[64]-nvclor1k-freestandingpowerpc-wiiupowerpc[64][le]-freestandingpowerpc64-ps3propeller-freestandingriscv(32,64)[be]-freestandingriscv(32,64)-uefiriscv64-fuchsiariscv64-hurds390x-freestandingsh[eb]-freestandingsparc[64]-freestandingspirv(32,64)-openclspirv(32,64)-openglspirv(32,64)-vulkanspork8-freestandingthumb[eb]-freestandingthumb-fuchsiathumb-gbathumb-vitave-freestandingwasm(32,64)-emscriptenwasm(32,64)-freestandingx86[_16,_64]-freestandingx86[_64]-hurdx86[_64]-uefix86_64-driverkitx86_64-fuchsiax86_64-plan9x86_64-ps4x86_64-ps5xcore-freestandingxtensa[eb]-freestanding
Изменения языка
Прогресс стабилизации языка
С выпуском Zig 0.16.0 достигнут значительный прогресс в стабилизации языка. Это ключевой шаг на пути к 1.0, и требование перед тем как пометить Zig 1.0.
В частности, с момента последнего релиза обсуждены и приняты решения по множеству предложений по языку — принято около 25 и отклонено около 125. На момент написания 23 неразрешённых предложения по языку остаются открытыми на трекере проблем Codeberg, и 61 неразрешённое предложение остаются открытыми на устаревшем трекере проблем GitHub. Таким образом, это усилие представляет значительный шаг в направлении финализации дизайна языка (хотя некоторые крупные решения остаются нерешёнными).
Изменения @bitCast
Zig 0.17.0 изменяет определение встроенной функции @bitCast.
Во многих случаях новое поведение эквивалентно старому: в частности, преобразование между целочисленным типом и другим целочисленным типом не затронуто, равно как и преобразование между целочисленным типом и упакованной структурой или упакованным объединением.
Однако семантика вызовов @bitCast, включающих типы массивов или векторов, изменилась. К сожалению, это изменение имеет потенциал нарушить существующий код без выдачи ошибки компиляции. Поэтому может быть полезно при обновлении проверить любое использование @bitCast, включающее типы массивов или векторов.
Новое определение @bitCast состоит в том, что оно переинтерпретирует логическое битовое представление значения как другой тип. Следующие типы считаются имеющими логические битовые представления:
voidbool- целочисленные типы, кроме
comptime_int - типы с плавающей точкой, кроме
comptime_float - целочисленно-поддерживаемые типы
enum(T),packed struct(T)иpacked union(T) - массивы или векторы любых из этих типов
Для целочисленных и типов с плавающей точкой, логическое битовое представление начинается с наименее значимого бита и заканчивается с наиболее значимого бита. Для типов массивов и векторов, логические битовые представления всех элементов объединяются по порядку, начиная с первого элемента.
На практике это означает, что новое определение @bitCast в значительной степени выравнивается со старым поведением на little-endian целевых системах. В отличие от старого поведения, новое поведение полностью независимо от порядка байтов, т.е. операция ведёт себя одинаково независимо от целевого порядка байтов.
Новое определение @bitCast запрещает преобразования между некоторыми типами, которые были ранее разрешены. В частности, преобразования, включающие типы extern struct или extern union, больше не допускаются. В большинстве случаев, код, использующий такие преобразования, стремится переинтерпретировать in-memory представление значения (иногда называется "type punning") — чтобы достичь этого, используйте @ptrCast или extern union.