Дата публикации: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 ГиБ.
Значительно улучшена поддержка 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