
Zig: build სისტემა გადამუშავდა — კონფიგურაცია შესრულებას გამოეყო
Zig-ის devlog-ში აღწერილია build სისტემის მსხვილი გადამუშავება, რომელიც build.zig-ის კონფიგურაციას build-გრაფის შესრულებისგან ყოფს. zig build -h-ის დრო დაახლოებით 90%-ით შემცირდა.
Zig-ის პროექტმა build სისტემაში მსხვილი ცვლილება შეიტანა: build-ის კონფიგურაციის პროცესი მისი შესრულების პროცესისგან გამოეყო. ენის შემქმნელი ენდრიუ კელიმ ცვლილება პროექტის devlog-ში აღწერა როგორც მომავალი გამოშვების ნოტების გადახედვა და წინასწარი შეტყობინება მათთვის, ვისაც ახალი ფუნქციის გამოცდა Zig 0.17.0-მდე სურს.
კონფიგურატორი და maker
ადრე build.zig ფაილები და build სისტემის რეალიზაცია ერთ, გაბერილ პროცესში კომპილირდებოდა Debug რეჟიმში; მას შემდეგ, რაც სკრიპტი მეხსიერებაში build-გრაფს ააგებდა, მას build runner ასრულებდა. ახლა სკრიპტი პატარა პროცესში — კონფიგურატორში — კომპილირდება, კვლავ Debug რეჟიმში. როცა გრაფი მზადაა, ის ბინარულ კონფიგურაციის ფაილში სერიალიზდება, რომელსაც მშობელი zig build პროცესი ქეშირებს. ამ დროს Zig ასინქრონულად, ოპტიმიზაციებით კომპილირებს გრაფის შემსრულებელ პროცესს — maker-ს. შემდეგ maker სერიალიზებულ გრაფს ასრულებს.
გლობალური ქეშის წყალობით, maker მხოლოდ ერთხელ უნდა დაკომპილირდეს Zig-ის თითოეული ვერსიისთვის. გაყოფას სამი მიზეზი ჰქონდა: ყოველ ცვლილებაზე მხოლოდ მომხმარებლის build.zig ლოგიკა კომპილირდება და არა მთელი build სისტემა — ეს განსაკუთრებით მნიშვნელოვანია --watch, --fuzz და --webui-ს არსებობისას; სისტემას შეუძლია სკრიპტის ხელახლა გაშვება საერთოდ გამოტოვოს, როცა იცის, რომ არაფერი შეიცვლება; და გრაფის შემსრულებელი პროცესი ოპტიმიზაციებით კომპილირდება.
ბენჩმარკები: 150 მწმ-დან 14 მწმ-მდე
გაზომილი ეფექტი მკვეთრია. ბრძანება zig build -h ცვლილებამდე საშუალოდ 150 მწმ-ს იკავებდა, შემდეგ — 14,3 მწმ-ს, ანუ დაახლოებით 90,4%-ით ნაკლებს. CPU ციკლები 95,9%-ით, ინსტრუქციები 95,6%-ით, პიკური მეხსიერება კი 7,4%-ით შემცირდა. მიზეზი ქეშირებული, სერიალიზებული კონფიგურაციის ხელახლა გამოყენებაა — build სკრიპტი ყოველ გაშვებაზე აღარ სრულდება.
რა იცვლება API-ში და რა მოდის შემდეგ
წარმადობის გარდა, ავტორი მოელის, რომ მესამე მხარის ხელსაწყოები, მაგალითად ZLS, ისარგებლებენ სერიალიზებული კონფიგურაციის კითხვით build runner-ის fork-ის შენახვის ნაცვლად. ცვლილება შიდა მექანიზმებს მნიშვნელოვნად გადაამუშავებს, თუმცა API-ის დონეზე ძირითადად თავსებადია; გამონაკლისები pull request-შია ჩამოთვლილი. ყველაზე შესამჩნევი: build სკრიპტებს აღარ შეუძლიათ b.args-ით ბრძანების არგუმენტების დათვალიერება და მათ ნაცვლად run_cmd.addPassthruArgs()-ს იყენებენ, რაც ერთ შესაძლებლობას ართმევს სკრიპტებს, სამაგიეროდ კი ამ არგუმენტების შეცვლა სკრიპტის ხელახლა კომპილირებას აღარ მოითხოვს.
Zig 0.17.0 რამდენიმე კვირაშია მოსალოდნელი, ხოლო გამოსწორებებისთვის ადგილი 0.17.1-შიც დარჩება.
SiTech — AI-გაძლიერებული ვებ დეველოპმენტი
ვქმნით სწრაფ, თანამედროვე ვებსაიტებს და AI-ს ვაერთიანებთ ქართული ბიზნესებისთვის. გაქვთ პროექტი ან კითხვა? სიამოვნებით დაგეხმარებით.