LINUX.ORG.RU

Избранные сообщения Darfin

Форум — Development

Zig 0.16 - async здорового человека

Zig 0.16 закрыл проблему раскраски функций: sync и async теперь имеют одинаковую сигнатуру, отличается только переданный I/O-интерфейс. Если вы писали асинхронный Rust и упирались в async fn-заражение - посмотрите, как это решено здесь.
async без раскраски функций - это то, на чём подрывались Rust, JavaScript и C#. Асинхронная функция ничем не отличается по сигнатуре от синхронной - меняется только переданный Io.

Ну и всякого по мелочам:

  1. «Juicy Main» это внутреннее название proposal Эндрю Келли - идея в том, что точка входа должна получать «сочный» набор готовых зависимостей, а не создавать их внутри. DI здесь значит что аллокатор, I/O, env и preopens передаются в main снаружи, а не конструируются каждым приложением заново. Раньше каждая программа на Zig начиналась с одного и того же бойлерплейта: создать GeneralPurposeAllocator, получить arg-итератор через std.process.argsAlloc, отдельно дёрнуть std.process.getEnvMap. В 0.16 всё это подаётся параметром в main
  2. В C setenv в многопоточной программе это UB: глобальная environ читается без блокировок. Zig до 0.16 наследовал эту проблему через std.os.environ, который ещё и нельзя было заполнить без линковки libc.
    Теперь окружение доступно только из main через init.environ_map. Если библиотеке нужен env - она принимает его параметром, как аллокатор. Это ломает код, дёргавший std.process.getEnvVarOwned из произвольного места, но убирает целый класс thread-safety-багов.
    Параллельно переименованы функции в std.mem: indexOf → find, добавлены cut / cutScalar для разбиения слайсов по первому/последнему вхождению.
  3. В 0.16 появился собственный ELF-линкер, он включается флагом -fnew-linker, а при -fincremental на self-hosted ELF-сборке используется автоматически. Он пока не feature-complete (например, не пишет DWARF), поэтому по умолчанию release-сборки идут через LLVM + LLD. Выгода - инкрементальная линковка (194мс → 65мс на тестовом проекте) и меньше зависимостей для debug-сборок.
  4. доработки под Windows: сетевой стек теперь работает без ws2_32.dll (напрямую через NtDll), завершена миграция с Win32 API на NtDll для остальных системных вызовов, появился inter-process progress reporting для параллельных сборок.
  5. x86-бэкенд компилятора стал самодостаточным - дебажные сборки на x86_64 собираются без LLVM и идут значительно быстрее. aarch64-бэкенд ещё work-in-progress: в 0.16 он падает на behavior-тестах.
  6. Инкрементальная компиляция переработана, меньше false-rebuilds, стабильнее на больших проектах.
  7. Fuzzer (zig test –fuzz) получил multi-process режим, infinite mode и crash dumps с AST-дампом.
  8. Build-система: локальный override пакетов, –error-style и –multiline-errors, таймауты юнит-тестов, temporary files API.
  9. Крипто: добавлены AES-SIV, AES-GCM-SIV, Ascon-AEAD, Ascon-Hash, Ascon-CHash.
  10. Heap: ArenaAllocator стал thread-safe и lock-free, обёртка ThreadSafeAllocator удалена.
  11. Тулчейн: LLVM 21 (с отключённой loop vectorization из-за регрессии), musl 1.2.5, glibc 2.43, Linux 6.19 headers, macOS 26.4 headers, MinGW-w64, FreeBSD 15.0 libc

Поздравляю разработчиков, пользователей, интересующихся и вообще - всех причастных.
Ура!

 ,

olelookoe
()