Rust-ийн удаан compile хийгддэг зовлон ард хоцрох уу: "Headstart" патч эмхэтгэх хугацааг 54% хүртэл багасгалаа
Rust хэлээр код бичдэг ямар ч хөгжүүлэгчээс "Энэ хэлний хамгийн том дутагдал нь юу вэ?" гэж асуувал бараг 100% "Эмхэтгэх (compile) хугацаа хэт удаан" гэж хариулах биз ээ. Санах ойн өндөр найдвартай байдал (Memory Safety), төрлийн хүчирхэг систем (Type System), zero-cost abstractions зэрэг олон давуу талынх нь төлөөсөнд бид cargo build эсвэл cargo check дараад кофе уухаас өөр аргагүй болдог.
Тэгвэл сүүлийн 24 цагийн дотор нээлттэй эхийн ертөнцөд болон Hacker News дээр хүчтэй шуугиан тарьж, хөгжүүлэгчдийн талархлыг хүлээж буй нэгэн төсөл танилцуулагдлаа. Энэ бол Rust компилятор (rustc) болон багц менежер (cargo)-д зориулсан "Headstart" нэртэй шинэ патч цуврал юм.
Энэхүү патч нь том хэмжээний Rust төслүүдийн cargo check-ийг 54% хүртэл, харин бүтэн cargo build-ийг 42% хүртэл хурдасгаж чаджээ.
Асуудал хаана үүсдэг байв?
Орчин үеийн Rust өмнө нь pipelined compilation буюу дамжуулах хоолойн зарчмыг нэвтрүүлсэн байдаг. Гэсэн хэдий ч Cargo нь crate (сангууд)-уудыг хамаарлын модоор нь дараалуулан ажиллуулахдаа нэг том саадтай тулгардаг: Нэг crate өөрийн хамааралтай өмнөх санг бүтэн төрөл шалгаж (type-checking) дуусахыг заавал хүлээдэг.
Энд хамгийн хачирхалтай логик бий: Тухайн хамаарал бүхий сан доторх функцийн бие (function bodies)-ийг компилятор шалгах нь маш их CPU хугацаа шаарддаг. Гэтэл түүнийг ашиглаж буй downstream (дараагийн) crate-д тухайн функцийн дотор юу бичигдсэн нь огт падлийгүй. Түүнд зөвхөн:
- Ямар функцүүд ил зарлагдсан бэ? (API signature)
- Оролт, гаралтын төрлүүд нь юу вэ?
- Төрөл, бүтэц (struct, enum), trait-уудын тодорхойлолт ямар байна вэ?
гэсэн интерфейсийн мэдээлэл буюу .rmeta (Rust metadata) файл л хэрэгтэй.
Уламжлалт rustc нь бүх функцийн биеийг шалгаж дууссаны дараа л метадатаг бичиж дуусгадаг тул олон цөмт (multi-core) хүчирхэг компьютерын ихэнх цөмүүд өмнөх crate-ийн функц шалгагдаж дуусахыг хүлээн сул зогсдог (idle) байв.
Headstart хэрхэн ажилладаг вэ?
Headstart төсөл нь rustc-д 6 патч, cargo-д 3 патч нийт 9 жижиг өөрчлөлтийг оруулсан байна. Үүний үндсэн шийдэл нь маш энгийн боловч гоц ухаалаг:
- Интерфейс ба функцийн биеийг тусгаарлах:
Компиляторт шинээр
analysis_interfacesquery нэмсэн. Энэ нь кодын гадаад харагдах интерфейсүүдийг функцийн доторх хэрэгжүүлэлтээс түрүүлж задална. - Эрт метадата гаргах (
.early-rmeta): Интерфейс тодорхой болмогц компилятор шууд.early-rmetaфайлд шаардлагатай мета мэдээллийг бичнэ. - Дараагийн crate-ийг хүлээлгүй асаах:
Cargo нь өмнөх сан бүрэн шалгагдаж дуусахыг хүлээлгүйгээр, уг
.early-rmetaмэдэгдэл ирмэгц л дараагийн шатны хамааралтай сангуудыг зэрэгцүүлэн ажиллуулж эхэлнэ.
Энэ зарчмыг компиляторын хэллэгээр "Speculative Compilation" (таамаглаж зэрэгцүүлэн ажиллуулах) гэж ойлгож болно. Хэрэв өмнөх сан дээр функцийн бие дотор компиляцийн алдаа гарвал юу болох вэ? Headstart нь дараагийн crate-ийн түрүүлж гаргасан алдаануудыг хаяж, зөвхөн жинхэнэ эх үүсвэр болсон үндсэн crate-ийн алдааг хөгжүүлэгчид үзүүлдэг тул алдааны мэдээлэл яг урьдынх шигээ цэвэр, зөв гарна.
Бодит төслүүд дээрх үр дүн: Тоонууд юу өгүүлэв?
Төслийг хөгжүүлэгчид өдөр тутам ашиглагддаг нээлттэй эхийн томоохон Rust төслүүд дээр (16 цөмт машин дээр) цэвэр build хийж туршсан байна:
- rust-analyzer:
cargo checkхийх хугацаа 54% буурч, хоёр дахин хурдан болов. - Zed кодын редактор:
cargo check45%, харин бүтэнcargo build30% илүү хурдан болжээ. - Bevy (тоглоомын хөдөлгүүр):
cargo check38%-иар хурдассан. - Lemmy болон Polars: Бүгд 20–35%-ийн илэрхий бодит хурдны өсөлт үзүүлсэн байна.
Хамгийн чухал нь: Туршилтад хамрагдсан 13 бодит төслөөс нэг нь ч удаашраагүй. Түүнчлэн Rust-ийн саяхан туршилтаар орсон параллель компиляторын горим (-Zthreads=8)-той хамт ажиллуулахад дахин 25% нэмэлт хурд авч байгаа нь батлагджээ.
# Headstart-ийг турших энгийн жишээ
cargo check -Zheadstart
Хэзээ албан ёсны Rust-д орох вэ?
Эрт метадата гаргах санаа нь 2019 онд компиляторын багийн дунд хөндөгдөж байсан ч алдаа боловсруулах болон компиляторын төлөвийг түр зогсоох төвөгтэй байдлаас шалтгаалан хойшлогдож байжээ.
Харин PowderworksCode багийн гаргасан энэхүү бодит туршилт, бэлэн патчууд нь энэ санааг практикт бодитой, тогтвортой хэрэгжүүлж болохыг бүрэн баталлаа. Хэдийгээр код шууд албан ёсны stable хувилбарт ороход хэсэг хугацаа (RFC шат, ревью) шаардагдах ч Rust компиляторын баг уг патчийг хүлээн авч, албан ёсны nightly хэрэгсэлд нэгтгэх хэлэлцүүлэг аль хэдийн эхлээд байна.
Хөгжүүлэгчийн хамгийн үнэт зүйл бол анхаарал төвлөрөлт (focus state) болон цаг хугацаа билээ. Headstart төсөл нь биднийг компиляторын гацаанаас чөлөөлж, Rust-ийг орчин үеийн систем хөгжүүлэлтийн хамгийн таатай, бүтээмжтэй хэл болгоход нэг алхам ойртуулж байна.
Эх сурвалж: PowderworksCode (GitHub / headstart), Hacker News хэлэлцүүлэг
Сэтгэгдэл
Ачаалж байна...