Выпуск языка программирования Zig 0.11.0

После 8 месяцев разработки опубликован выпуск языка программирования Zig 0.11.0, развиваемого при поддержке организации Zig Software Foundation. Язык Zig предлагается в качестве современной замены C, который старается сохранить его достоинства (простота и гибкость использования, предсказуемость кодогенерации, экосистема и т.д.), в то же время добавляя новшества для более эргономичной и безопасной разработки. В частности, Zig содержит:

  • Современную систему типов, разработанную с учётом наработок других языков для большей безопасности, производительности и явности, чем в Си (опциональные типы вместо нулевых указателей, выравнивание по адресу как часть типа, целочисленные типы с размерностью от 0 до 65535 бит, кортежи, тип всех типов, тип-сумма и т.д.).
  • Ограниченную возможность выполнения кода во время компиляции (обе возможности вместе составляют основу метапрограммирования без макросов и препроцессора).

Основные новшества:

  • Существенно улучшен бэкенд для компиляции Zig в C, что позволило удалить старый компилятор на C++, предназначенный для раскрутки. Теперь раскрутка производится следующим образом:
    • 1) системным компилятором компилируется файл wasm2c.c, который позволяет транслировать .wasm файлы в представление на C,
    • 2) wasm2c транслирует файл zig1.wasm (содержащий урезанную копию самого Zig компилятора с единственным бэкендом для компиляции в C) в zig1.c, который затем вновь компилируется системным компилятором,
    • 3) zig1 использует актуальный исходный код с репозитория, чтобы скомпилировать его в zig2.c, который компилируется системой в zig2 (уже не урезанную копию Zig компилятора, stage2)
    • 4) zig2 (используя уже бэкенд для LLVM) компилирует финальный исполняемый файл zig (stage3). Данный способ раскрутки требует только zig1.wasm файл размером 2.6 МиБ и wasm2c.c размером 120 КиБ (не включая заголовочные файлы и compiler-rt), вместо старого компилятора на C++ исходным кодом в 126 МиБ (на данном этапе чистое использованное трансляции в C вместо промежуточного WASM требует 80 МиБ и является специфичным для архитектуры). Удаление старого компилятора также избавило разработчиков от необходимости сопровождать сразу две реализации и снизило требование к ОЗУ для сборки компилятора с 10-11 ГиБ до 3-4 ГиБ.
  • Представлен менеджер пакетов, предназначенный для экосистем Zig, C и C++, и неразрывно связанный с системой сборки build.zig. Информация о пакете записывается в файл build.zig.zon, который использует формат Zig Object Notation (подмножество синтаксиса Zig, поддерживающее анонимные структуры и массивы для создания обьектов в стиле JSON). По соображениям безопасности, было решено отказаться от централизированного репозитория пакетов (по типу PyPI и crates.io), вместо этого прописываются прямые ссылки на необходимый архив. На данный момент менеджер пакетов находится в зачаточном состоянии и может содержать критичные для проектов ошибки, но уже подходит для простых проектов. Пример использования для ffmpeg представлен здесь.
  • Значительно улучшена поддержка Plan9 в стандартной библиотеке и компоновщике, написанном на самом языке.
  • Синтаксис цикла for обновлён для поддержки нескольких итерируемых обьектов и симметрии (каждому обьекту теперь соотвествует его захваченное значение). Примеры нового синтаксиса можно просмотреть здесь. Отмечается, что новая форма более эргономична для сторонников Data-Oriented Design и для итерации числа по интервалу.
  • Улучшена совместимость с C: добавлена поддержка экспорта вариативных C функций (поддерживается не на всех платформах), добавлен тип c_char (для экспорта в тип char вместо uint8_t для используемого в Zig вместо него u8).
  • Улучшена корректность для оголённых функций (naked functions), для которых теперь запрещены явное указание возврата и вызовы функций во время выполнения (в целом рекомендуется использовать только встроенный ассемблер и логику во время компиляции).
  • Добавлена встроенная функция @inComptime(), которая возвращает true или false в зависимости от времени вызова функции, в которой находится @inComptime().
  • LLVM обновлён с 15 до 16 версии.
  • Множество других изменений в стандартной библиотеке, самом языке, системе сборки (в основном из-за нового менеджера пакетов) и т.д.
Release. Ссылка here.