Kiti Zig naudojami produkciniai projektai apima Ghostyy terminalo emuliatorių ir Uber, kuris naudoja Zig kompiliavimui. Taip pat yra pavyzdžių, kaip Zig naudojamas Python spartinimui.
Zig išsiskiria iš daugumos kitų kalbų savo mažu funkcijų rinkiniu, kuris yra aiškaus projektavimo tikslo rezultatas: tik vienas akivaizdus būdas atlikti veiksmą. Zig kūrėjai šį tikslą priėmė taip rimtai, kad kurį laiką Zig neturėjo for ciklo. Šis sprendimas vėliau buvo pakeistas, ir dabar Zig turi pilnai veikiančią for ciklo konstrukciją.
Kevin Lynagh, atėjęs iš Rust aplinkos, rašė: „Kalba tokia maža ir nuosekli, kad po kelių valandų studijų galėjau ją pakankamai suprasti ir tiesiog atlikti darbą.“ Nathan Craddock, C programuotojas, išsakė tą pačią nuomonę. Programuotojams patinka Zig sintaksės aiškumas ir kryptingumas.
Kaip Zig valdo atmintį
Išskirtinis Zig bruožas yra tas, kad ji tiesiogiai nekontroliuoja atminties paskirstymo pačioje kalboje. Nėra raktažodžio malloc, kaip C ir C++. Vietoj to, prieiga prie heap atminties atliekama aiškiai per standartinę biblioteką. Kai reikia tokios funkcijos, perduodamas Allocator objektas. Tai leidžia aiškiai nurodyti, kada bibliotekos naudoja atmintį, bet paslėpti, kaip ji tvarkoma. Vietoj to, kliento kodas sprendžia, koks paskirstytojas tinkamiausias.
Atminties paskirstymą padarius aiškia bibliotekos savybe išvengiama paslėptų paskirstymų – tai naudinga ribotų resursų ir realaus laiko aplinkose. Atmintis atitraukiama nuo kalbos sintaksės, kur ji gali pasirodyti bet kur, ir jos valdymas tampa aiškesnis.
Leidžiant kliento kodui nurodyti, kokio tipo paskirstytoją perduoti API, kodas gali prisitaikyti prie konkrečios aplinkos. Tai daro bibliotekų kodą aiškesnį ir labiau pernaudojamą. Aplikacija gali nuspręsti, kada biblioteka naudos atmintį, ir perduoti jai tinkamą paskirstytoją – įterptinį, serverinį, WebAssembly ir kt.
Pavyzdžiui, Zig standartinė biblioteka pateikia bazinį paskirstytoją, vadinamą page allocator, kuris atminties prašo iš operacinės sistemos naudodamas: const allocator = std.heap.page_allocator. Daugiau apie paskirstytojus žr. Zig dokumentacijoje.
Zig taip pat turi saugos funkcijas, padedančias išvengti buferio perpildymų, ir pateikia derinimo paskirstytoją, kuris aptinka atminties nutekėjimus.
Sąlyginė kompiliacija Zig kalboje
Zig naudoja sąlyginę kompiliaciją, todėl nereikia išankstinio apdorojimo priemonių, kaip C kalboje. Zig neturi makrokomandų kaip C ar C++. Projektavimo požiūriu, Zig kūrėjai mano, kad išankstinio apdorojimo poreikis rodo kalbos trūkumą, kuris buvo grubiai „užlopytas“.
Vietoj makrokomandų Zig kompiliatorius nusprendžia, koks kodas gali būti įvertintas kompiliavimo metu. Pavyzdžiui, if sakinys pašalins negyvą šaką, jei tai įmanoma. Vietoj #define kompiliavimo laiko konstantai sukurti, Zig pati nustatys, ar const reikšmė gali būti traktuojama kaip tokia. Tai ne tik palengvina kodo skaitymą, rašymą ir supratimą, bet ir leidžia jį optimizuoti.
Kaip rašo Erik Engheim, Zig daro kompiliavimo laikotarpio skaičiavimą esmine savybe, o ne papildomu funkcionalumu. Tai leidžia Zig kūrėjams „rašyti generinį kodą ir vykdyti metaprogramavimą be aiškios generikų ar šablonų (templates) paramos.“
Išskirtinis Zig bruožas – comptime raktažodis. Jis leidžia vykdyti kodą kompiliavimo metu, kas leidžia, be kita ko, taikyti tipų tikrinimą generikams.
Sąveika su C ir C++
Zig palaiko aukštą suderinamumo lygį su C ir C++. Kaip nurodoma Zig dokumentacijoje: „Bet kuri kalba, kuri negali sąveikauti su C kodu, rizikuoja būti pamiršta.“
Zig gali kompiliuoti C ir C++ kodą. Ji taip pat pateikia libc bibliotekas daugeliui platformų. Ji gali jas sukompiliuoti be išorinių libc bibliotekų prijungimo. Daugiau apie Zig ir libc ryšį žr. šioje Reddit temoje.
Išsamesnei Zig C kompiliatoriaus galimybių analizei žr. Andrew Kelley tinklaraščio įrašą šia tema, kuriame pateikiamas Zig naudojimas GCC LuaJIT kompiliatoriui kompiliuoti. Esmė ta, kad Zig bando ne tik pakeisti C savo sintakse, bet ir kuo labiau integruoti patį C į save.
Loris man sakė, kad „Zig yra geresnis C/C++ kompiliatorius nei kiti, nes jis iš karto palaiko kryžminį kompiliavimą ir kitus dalykus. Zig taip pat labai lengvai sąveikauja su C (galima tiesiogiai importuoti C antraštes), ir apskritai geriau naudoja C bibliotekas dėl stipresnės tipų sistemos ir kalbos savybių, kaip defer.