Компиляцын хугацаа 36 секундээс 200 миллисекунд рүү: Системийн программчлалын Zig 0.17.0 хувилбар гарлаа
Сүүлийн жилүүдэд C болон C++ хэлний хамгийн бодит, хүчирхэг залгамжлагчаар нэрлэгдэж, орчин үеийн өндөр хурдны программ хангамжуудын (Bun runtime, TigerBeetle датабэйс, Ghostty терминал) суурь болж буй Zig хэлний цоо шинэ 0.17.0 хувилбар албан ёсоор гарлаа.
Энэхүү хувилбар нь 5 сарын турш 206 хөгжүүлэгчийн оруулсан 925 коммитийн үр дүн бөгөөд Zig-ийн 1.0 тогтвортой хувилбар руу хүрэх замын хамгийн том стратегийн алхмуудын нэг болж байна. Хөгжүүлэгчдийн бүтээмжийг гацаадаг гол хүчин зүйл болох компиляцын хурд болон build системийн бүтцийг энэ удаад үндсээр нь шийдсэн нь олон нийтийн анхаарлыг татаж байна.
1. Миллисекундын инкремент компиляц (Incremental Rebuilds)
Системийн түвшний хэлүүдийн (C++, Rust г.м.) хамгийн том өвдөлтийн цэг нь компиляцын урт хугацаа байдаг. Zig-ийн үндсэн зорилгуудын нэг бол аянга шиг хурдан хөгжүүлэлтийн циклийг (fast iteration loop) бий болгох явдал юм.
Zig 0.17.0 хувилбарт хөгжүүлэгчдийн баг өөрсдийн бичсэн Native ELF Linker-ийг гүнзгий шинэчилснээр x86_64-linux платформ дээр жинхэнэ инкремент компиляцыг бүрэн ажиллагаанд орууллаа.
Туршилтаас харахад:
- Өмнө нь Zig компиляторыг өөрийг нь бүхэлд нь угсрахад (debug build) ~36 секунд зарцуулдаг байсан.
- Харин шинэ инкремент linker болон
zig build --watchгоримыг ашигласнаар кодонд орсон жижиг өөрчлөлтийг дахин компил хийх хугацаа ердөө 220 - 280 миллисекунд болж буурчээ.
Энэ нь бараг л JavaScript, Go хэл шиг агшин зуур хариу өгдөг орчныг C түвшний машинт кодод авчирч байгаа бөгөөд "print debugging" хийх, функцийн логикийг туршиж үзэх үед хөгжүүлэгчийн цагийг асар их хэмнэхээр боллоо.
2. Build системийн цоо шинэ бүтэц ба BSP протокол
Zig-ийн хамгийн алдартай давуу талуудын нэг нь CMake эсвэл Make гэх мэт тусдаа тохиргооны хэл ашиглах шаардлагагүй, бүх төслийн бүтцийг цэвэр Zig кодоор (build.zig) бичдэг явдал юм.
0.17.0 хувилбарт хэлний зохиогч Эндрю Келли (Andrew Kelley) уг build системийг бүхэлд нь дахин задалж шинэчлэв:
- Maker ба Configurer процессуудыг салгасан: Төслийн бүтцийг тодорхойлох процесс болон компиляцын ажлыг гүйцэтгэх шатыг тусдаа процесс болгож архитектурыг цэвэрлэв.
- Build Server Protocol (BSP): Шинэ build системд BSP протоколыг нэвтрүүлснээр IDE болон ZLS (Zig Language Server) зэрэг хөгжүүлэлтийн багажууд төслийн хамаарал, тохиргоог алдаагүй, шууд бодит хугацаанд уншиж таних боломж бүрдлээ.
Энэ нь Neovim, VS Code зэрэг редакторын auto-completion, алдаа заагч хэрэгслүүдийг одоо байгаагаасаа хавьгүй тогтвортой, хурдан ажиллахад түлхэц болж байна.
3. Санах ойн аюулгүй байдал: std.ArrayList ба Pointer Stability Locks
Zig хэлэнд Rust шиг хэт хатуу дүрэмтэй Borrow Checker эсвэл Go, Java шиг Garbage Collector байдаггүй. Харин хөгжүүлэгчид санах ойг өөрөө гараар (explicitly) удирдаж, систем юу хийж байгааг бүрэн хянах эрх чөлөөг олгодог.
Гэхдээ энэ нь санах ойн алдаа гаргах эрсдэл дагуулдаг тул Zig баг "pragmatic safety" буюу стандарт сангаар дамжуулан аюулгүй байдлыг хангах сонирхолтой аргуудыг нэвтрүүлсээр ирсэн.
Өмнөх хувилбарт std.HashMap-д орж ирсэн Pointer Stability Locks концепц энэ хувилбарт хамгийн их хэрэглэгддэг std.ArrayList-д албан ёсоор орж ирлээ:
- Array-ийн багтаамж дүүрэх үед dynamic array шинэ хаяг руу санах ойгоо тэлж (reallocate) зөөдөг. Энэ үед хуучин элемент рүү зааж байсан pointer хүчингүй болж "dangling pointer" үүсэх аюултай байдаг.
lockPointers()болонunlockPointers()функцуудыг дуудсанаар санах ойн reallocation хийгдэх эгзэгтэй мөчид заагч хаяг хүчингүй болохоос сэргийлж, runtime дээр аюулгүйгээр assertion хийн барьж авах боломжтой болсон юм.
4. Breaking Changes ба 1.0 руу чиглэсэн бусад чухал өөрчлөлтүүд
Zig хэл одоогоор 1.0 гараагүй (pre-1.0) шатандаа яваа тул томоохон хувилбар бүр дээр API цэвэрлэгээ, Breaking change хийгддэг. 0.17.0 ч үл хамаарах зүйл биш юм:
@bitCastсемантикийн өөрчлөлт: Built-in@bitCastфункцийн ажиллах дүрмийг дахин цэгцэлж, массив болон вектор төрлүүд хоорондын битийн хөрвүүлэлтийг илүү найдвартай болгов. Хэрэв та хуучин кодонд массивын хөрвүүлэлт хийсэн бол шинэ хувилбарын дүрмээр шалгах шаардлагатай.translate-cба Codeberg: C хэлний толгой файлуудыг (.h) шууд Zig код болгон хөрвүүлдэг алдартtranslate-cдэд бүтэц илүү модульчлагдаж сайжрав.- Шинэ архитектуруудын дэмжлэг: LoongArch, SPARC зэрэг тусгай архитектурууд болон олон төрлийн embedded/retro төхөөрөмжүүдийн дэмжлэг гүнзгийрчээ.
Хөгжүүлэгчийн дүгнэлт: Zig-ийг одоо сонирхох цаг мөн үү?
Олон системийн инженерүүд "Rust-ийн хэт нарийн төвөгтэй байдлаас залхаж, C хэлний санах ойн эмх замбараагүй байдлаас зугтахыг" хүсдэг. Тэдний хувьд Zig бол төгс алтан дундаж юм.
Zig 0.17.0 нь хэлний үндсэн бүтэц улам бүр тогтворжиж, ялангуяа хөгжүүлэлтийн хурд болон багаж хэрэгслийн (toolchain) хувьд системийн программчлалын зах зээлд тэргүүлэгч түвшинд хүрснийг харууллаа. Хэрэв та CLI хэрэгсэл, өндөр ачаалал даах сервер, тоглоомын хөдөлгүүр эсвэл embedded систем бичиж байгаа бол Zig 0.17.0-ийг татаж суулган, туршиж үзэхийг зөвлөж байна.
Эх сурвалж: https://ziglang.org/download/0.17.0/release-notes.html
Сэтгэгдэл
Ачаалж байна...