უკან დაბრუნება
Roc-ის კომპილატორის გადაწერა Rust-იდან Zig-ზე: ფუნქციური პარიტეტი 487 დღეში
SiTech AI Team2 წთ. საკითხავი

Roc-ის კომპილატორის გადაწერა Rust-იდან Zig-ზე: ფუნქციური პარიტეტი 487 დღეში

Roc-ის პროგრამირების ენის გუნდმა 300 000-სტრიქონიანი კომპილატორი Rust-იდან Zig-ზე გადაწერა და ორიგინალთან ფუნქციურ პარიტეტს 487 დღეში მიაღწია. პოსტში შედარებულია აწყობის დრო, მეხსიერების უსაფრთხოება და ეკოსისტემა.

Roc-ის პროგრამირების ენაზე მომუშავე გუნდმა წელიწადნახევრის განმავლობაში დაახლოებით 300 000 სტრიქონი Rust კოდი Zig-ზე გადაწერა და ახლა ორიგინალ კომპილატორთან ფუნქციურ პარიტეტს მიაღწია. ეს ოფიციალური რელიზი არ არის — Roc-ის პირველი ნომრიანი გამოშვება, ვერსია 0.1.0, წლის ბოლოსთვის იგეგმება — თუმცა ახალ კომპილატორს უკვე შეუძლია რეალური პროგრამების აწყობა და გაშვება.

ერთ-ერთი პირველი ტესტი იყო Rocci Bird — WASM-4-ის თამაში, დაწერილი ათას სტრიქონზე ნაკლებ Roc კოდში. ახალი კომპილატორით roc build --opt=size ქმნის 31 კილობაიტიან WebAssembly ბინარს, რაც ორიგინალის მიერ გამოშვებული ზომის ნახევარზე ნაკლებია. თამაშის გასაშვებად საჭირო გახდა კომპილატორის უამრავი ფუნქციის დასრულება.

487-დღიანი გადაწერა

გადაწერას 487 დღე დასჭირდა, მაშინ როცა Bun-ის საპირისპირო მიმართულების პორტს — დაახლოებით 500 000 სტრიქონი Zig-იდან Rust-ზე — მხოლოდ 11 დღე დასჭირდა. ავტორი ამ შედარებას მცდარს უწოდებს: Bun-ის შემთხვევაში პირდაპირი პორტირება იყო, Roc-მა კი ნულიდან გადაწერა აირჩია, რადგან კომპილატორის დიდი ნაწილი მაინც უნდა შეცვლილიყო. გადაწყვეტილება მოჰყვა არქიტექტურულ პრობლემას Roc-ის lambda set-ის სპეციალიზაციის სისტემაში, რომელიც კომპილატორის რამდენიმე ფაზას მოიცავდა.

რატომ Zig და რა მოხდა მეხსიერების უსაფრთხოებასთან

არჩევანი ოთხმა მოსაზრებამ განაპირობა: აწყობის დრო, მეხსიერების კონტროლი — Roc არენებსა და struct-of-arrays განლაგებას იყენებს, Zig-ის ეკოსისტემა კი ალოკატორებს გადასცემს და ერთ გლობალურ ალოკატორს არ გულისხმობს — ეკოსისტემის შესაბამისობა და დახმარება მეხსიერების თვალსაზრისით სახიფათო კოდთან. Rust-ის კომპილატორში 300 000 სტრიქონზე დაახლოებით 1 200 unsafe გამოყენება იყო და გუნდი მსგავსი კოდის წერას მომავალშიც ვარაუდობდა.

პრაქტიკაში გადასვლა ზიანის მომტანი არ აღმოჩნდა. Claude Opus 4.8-ის მიერ კლასიფიცირებული ბაგების ანგარიშები აჩვენებს 2 596 ბაგს Rust-ის კომპილატორში, საიდანაც 21 მეხსიერების დაზიანებას უკავშირდება, 431 ბაგის წინააღმდეგ Zig-ის კომპილატორში, საიდანაც 10 მეხსიერების დაზიანებაა. ათიდან რვა არასწორი კომპილაცია იყო; დანარჩენი ორი use-after-free შეცდომა იყო შეცდომების რეპორტინგში, რის გამოც ფაილების სახელები ჩანაცვლების სიმბოლოებად გამოჩნდა roc check-სა და roc bundle-ში.

აწყობის დრო და შემდეგი ნაბიჯები

Ubuntu 26-ზე მომუშავე Intel-ის დესკტოპზე Rust-ის კომპილატორმა 354 ათასი სტრიქონით ცივ აწყობას 25.4 წამი, ინკრემენტულს კი 3.4 წამი მოანდომა. Zig-ის გადაწერას 464 ათასი სტრიქონით ცივი აწყობა 32.1 წამი, ინკრემენტული კი დაახლოებით 35 მილიწამი სჭირდება — თუმცა მხოლოდ Zig 0.17.0-ზე, რადგან სტაბილურ 0.16.0-ში არსებული ბაგი ამ კოდის ბაზაზე ინკრემენტულ აწყობას არღვევს. nightly კომპილატორზე დამოკიდებულების ნაცვლად გუნდი შემდეგ სტაბილურ გამოშვებას ელოდება.

კომპილატორი ასევე ქეშირებს სამუშაოს დისკზე პარსინგის გარეშე დესერიალიზაციის მეშვეობით: მისი მონაცემთა სტრუქტურები მაჩვენებლების ნაცვლად 32-ბიტიანი ინდექსების მასივებია, ამიტომ ქეშირებული შედეგები მეხსიერებაში პარსინგის გარეშე იტვირთება. roc check-ის ორჯერ გაშვება წინა გაშვების შედეგებს დაახლოებით memcpy-ის სიჩქარით იყენებს.

SSiTech

SiTech — AI-გაძლიერებული ვებ დეველოპმენტი

ვქმნით სწრაფ, თანამედროვე ვებსაიტებს და AI-ს ვაერთიანებთ ქართული ბიზნესებისთვის. გაქვთ პროექტი ან კითხვა? სიამოვნებით დაგეხმარებით.