
Roc-ի կոմպիլյատորի վերագրվումը Rust-ից Zig՝ ֆունկցիոնալ հավասարություն 487 օրում
Roc ծրագրավորման լեզվի թիմը 300 000 տողանոց կոմպիլյատորը Rust-ից վերագրել է Zig-ով և 487 օրում հասել է բնօրինակի հետ ֆունկցիոնալ հավասարության։ Հոդվածը համեմատում է կառուցման ժամանակը, հիշողության անվտանգությունը և էկոհամակարգը։
Roc ծրագրավորման լեզվի թիմը վերջին մեկուկես տարվա ընթացքում Rust-ով գրված շուրջ 300 000 տող կոդ վերագրել է 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-ը կապված է հիշողության վնասման հետ, ընդդեմ Zig-ի կոմպիլյատորի 431 սխալի, որոնցից 10-ը՝ հիշողության վնասման։ Տասից ութը սխալ կոմպիլյացիա էին. մնացած երկուսը use-after-free սխալներ էին սխալների հաշվետվության մեջ, որոնց պատճառով ֆայլերի անունները roc check-ում և roc bundle-ում ցուցադրվում էին փոխարինող նշաններով։
Կառուցման ժամանակը և ինչ է սպասվում
Ubuntu 26-ով աշխատող Intel-ի աշխատասեղանին 354 հազար տողանոց Rust կոմպիլյատորը սառը կառուցման համար ծախսում էր 25.4 վայրկյան, ինկրեմենտալ կառուցման համար՝ 3.4 վայրկյան։ 464 հազար տողանոց Zig տարբերակը սառը կառուցման համար ծախսում է 32.1 վայրկյան, իսկ ինկրեմենտալը տևում է մոտ 35 միլիվայրկյան, սակայն միայն Zig 0.17.0-ում, քանի որ կայուն 0.16.0-ի սխալը կոտրում է ինկրեմենտալ կառուցումը այս կոդային բազայում։ nightly կոմպիլյատորից կախվածության փոխարեն թիմը սպասում է հաջորդ կայուն թողարկմանը։
Կոմպիլյատորը նաև քեշավորում է աշխատանքը սկավառակի վրա՝ առանց վերլուծության ապասերիալիզացիայի միջոցով. նրա տվյալների կառուցվածքները ցուցիչների փոխարեն 32-բիթանոց ինդեքսների զանգվածներ են, ուստի քեշավորված արդյունքները բեռնվում են հիշողության մեջ առանց վերլուծության։ roc check-ը երկու անգամ գործարկելը օգտագործում է նախորդ գործարկման արդյունքները գրեթե memcpy-ի արագությամբ։
SiTech — AI-ով հզորացված վեբ մշակում
Ստեղծում ենք արագ ու ժամանակակից կայքեր և AI-ը ներդնում իրական բիզնես գործընթացներում։ Ունե՞ք նախագիծ կամ հարց։ Ուրախ կլինենք օգնել։