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

Новости мира unix. Хотите узнать секрет вечного счастья? Откройте страницу 246.
Ответить
acolyte
Аватара пользователя
Сообщения: 3258
Зарегистрирован: 20.08.2022

#

Выпуск языка программирования Zig 0.11.0
Дата публикации:Fri, 04 Aug 2023 21:40:11 +0300




После 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 версии.
Множество других изменений в стандартной библиотеке, самом языке, системе сборки (в основном из-за нового менеджера пакетов) и т.д.


Новость позаимствована с opennet.ru
Ссылка на оригинал: https://www.opennet.ru/opennews/art.shtml?num=59554

Жизнь за Нер'зула!

Ответить