
Zig: систему збірки перероблено — конфігурацію відокремлено від виконання
У devlog Zig описано велику переробку системи збірки, яка розділяє конфігурацію build.zig і виконання графа збірки. Час виконання zig build -h скоротився приблизно на 90%, а реліз 0.17.0 очікується за кілька тижнів.
Проєкт Zig вніс велику зміну в систему збірки: процес конфігурації збірки відокремлено від процесу її виконання. Творець мови Ендрю Келлі описав цю гілку в devlog проєкту як попередній огляд майбутніх нотаток до релізу та завчасне повідомлення для тих, хто хоче перевірити зміни до виходу Zig 0.17.0.
Конфігуратор і maker
Раніше файли build.zig і реалізація системи збірки компілювалися в один роздутий процес у режимі Debug; коли скрипт будував граф збірки в пам'яті, його виконував код build runner. Тепер скрипт компілюється в невеликий процес — конфігуратор, який так само працює в режимі Debug. Коли граф готовий, він серіалізується у бінарний файл конфігурації, який батьківський процес zig build кешує. Тим часом Zig асинхронно компілює процес виконання графа — maker — з увімкненими оптимізаціями, після чого той виконує серіалізований граф.
Завдяки глобальному кешу maker потрібно скомпілювати лише один раз на кожну версію Zig. Поділ мав три причини: на кожну зміну перекомпільовується лише логіка build.zig, а не вся система збірки, що важливіше тепер, коли існують --watch, --fuzz і --webui; система може взагалі не перезапускати скрипт, коли знає, що нічого не зміниться; а процес виконання графа збирається з оптимізаціями.
Бенчмарки: 150 мс проти 14 мс
Виміряний ефект різкий. Команда zig build -h виконувалася в середньому 150 мс до зміни та 14,3 мс після — приблизно на 90,4% швидше. Цикли CPU скоротилися на 95,9%, інструкції — на 95,6%, пікове споживання пам'яті — на 7,4%. Причина в повторному використанні кешованої серіалізованої конфігурації замість запуску скрипта збірки на кожен виклик.
Що ламається і що далі
Окрім швидкості, автор очікує, що сторонні інструменти, як-от ZLS, виграють від читання серіалізованої конфігурації замість підтримки форку build runner. Зміна глибоко переробляє внутрішні механізми, але на рівні API майже не ламає сумісність; винятки перелічені в pull request. Найпомітніший із них: скрипти збірки більше не можуть читати аргументи командного рядка через b.args і натомість передають їх за допомогою run_cmd.addPassthruArgs(), що прибирає одну можливість, але означає, що зміна таких аргументів більше не потребує перезбирання скрипта.
Zig 0.17.0 очікується за кілька тижнів, і місце для виправлень залишиться також у 0.17.1.
SiTech — веброзробка з підтримкою AI
Створюємо швидкі та сучасні сайти й інтегруємо AI у бізнес-процеси. Маєте проєкт чи запитання? Із задоволенням допоможемо.