Technologijos
Susipažinkite su Zig: šiuolaikiška C alternatyva
Paskelbta
6 mėnesiai prieš-
Zig programavimo kalba toliau pamažu žengia į sisteminio programavimo pasaulį. Nors dar nėra pasiekusi 1.0 versijos, Zig jau naudojama keliuose realiuose projektuose ir pritraukia entuziastus savo puikiomis idėjomis ir įsipareigojimu kokybei.
Zig pradėjo Andrew Kelley 2015 metais. Tai labai aktyvus projektas, kuris dabar, regis, pasiekia kritinę masę. Ambicija – tapti C programavimo kalbos įpėdine, kuri dešimtmečius buvo pagrindinė nešiojamoji žemo lygio programavimo kalba.
Šis straipsnis yra aukšto lygio Zig pristatymas: jos projektavimo tikslai, atminties ir klaidų valdymas, sąlyginė kompiliacija, suderinamumas su C ir C++ bei naujausios versijos ypatumai rašymo metu.
Ar Zig gali pakeisti C?
Zig apibūdinama kaip „žemo lygio sistemų kalba“, bet ką tai reiškia? Sisteminė kalba – taip pat gana dviprasmiškas terminas. Zig programinės įrangos fondo bendruomenės viceprezidentas Loris Cro sako: „Zig apibrėžiu kaip universalią programavimo kalbą, nes, nors ji puikiai tinka sisteminiam programavimui, ji taip pat tinkama įterptiniams įrenginiams, WebAssembly taikymams, žaidimų kūrimui ir net daugeliui užduočių, kurias įprastai sprendžia aukštesnio lygio kalbos.“
Zig lengviausia suprasti kaip kalbą, artimą C – tai universali, be šiukšlių surinkimo mechanizmo (non-garbage-collected) ir nešiojama kalba su rodyklėmis. Šiandien praktiškai visa programavimo infrastruktūra vienaip ar kitaip remiasi C – įskaitant kitas programavimo kalbas kaip Java, JavaScript ir Python. Jei Zig taptų plačiai priimtu C pakaitalu, nauda galėtų būti milžiniška. Įsivaizduokite visos pramonės perėjimą prie kalbos, kuri kaip C, bet saugesnė, greitesnė, mažiau linkusi į klaidas ir lengviau prižiūrima.
Zig projektavimo tikslai ir sintaksė
Zig – tai „arti metalo“ esanti kalba, leidžianti kūrėjams dirbti tiesiogiai su sistemos atmintimi – būtinybė, kai norima kuo labiau optimizuoti kodą konkrečiai užduočiai. Tiesioginis atminties valdymas būdingas C šeimai, Rust ir kitoms žemo lygio sistemų kalboms. Zig siūlo panašias galimybes, bet siekia jas patobulinti.
Zig siekia būti paprastesnė sisteminė kalba nei pirmtakai ir padaryti saugaus, teisingo kodo rašymą lengvesnį. Ji taip pat siekia geresnės kūrėjų patirties, sušvelnindama aštrius kampus, su kuriais dažnai susiduriama rašant C tipo programinę įrangą. Iš pirmo žvilgsnio Zig ypatybės gali nepasirodyti revoliucinės, tačiau bendrai paėmus – tai saugesnė platforma, kurią kūrėjai lengviau perpranta ir naudoja.
Šiuo metu Zig naudojama įgyvendinant JavaScript aplinką Bun.js kaip alternatyvą Node.js. Bun kūrėjas Jarred Sumner sakė: „Zig šiek tiek panaši į C rašymą, bet turi geresnes atminties saugumo funkcijas derinimo režime ir modernias savybes, tokias kaip defer (panaši į Go) bei galimybė vykdyti bet kokį kodą kompiliavimo metu per comptime. Kalba turi labai mažai raktažodžių, todėl ją daug lengviau išmokti nei C++ ar Rust.“
Zig taip pat naudojama kaip TigerBeetle duomenų bazės kalba. TigerBeetle pasirinkimo motyvacija: Zig – „DSL, skirtas mašininio kodo rašymui“, kurio kompiliavimo metu vykdomos savybės leidžia „labai tiesiogiai išreikšti, ką norite, kad kompiuteris padarytų.“ Iš esmės, Zig leidžia labai aiškiai aprašyti, ką daro mašina, naudodama minimaliai sintaksės, neprarasdama išraiškingumo.
Zig neturi sąsajų (arba kažko panašaus, kaip Rust traits), leidžiančių apibrėžti tipų kontraktus, ką TigerBeetle pripažįsta kaip „trūkumą, nes trūksta sąsajų ties deklaracijos vieta.“ Tačiau jų teigimu, tai „mažiau svarbu aplinkoje be priklausomybių.“ Vietoj to Zig leidžia naudoti panašų generinį programavimą, kurį kompiliatorius tikrina kompiliavimo metu.
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.
Klaidų tvarkymas Zig kalboje
Zig turi unikalią klaidų tvarkymo sistemą. Kaip dalis dizaino filosofijos „vengti paslėpto valdymo srauto“, Zig nenaudoja throw klaidų išmetimui. throw funkcija gali nukreipti vykdymą sunkiai sekamu būdu. Vietoj to, jei reikia, sakiniai ir funkcijos gali grąžinti klaidos tipą, kuris yra vieno tipo su sėkmingu rezultatu dalis (union tipas). Kodas gali naudoti klaidos objektą, kad tinkamai reaguotų, arba naudoti try raktažodį, kad klaida būtų perduota aukštesniam lygiui.
Klaidos unijos tipo sintaksė yra <klaidų rinkinys> ! <pagrindinis tipas>. Tai galima pamatyti paprastame „Hello, world“ pavyzdyje (pagal Zig dokumentaciją):
const std = @import(„std”);
pub fn main() !void {
const stdout = std.io.getStdOut().writer();
try stdout.print(„Hello, {s}!\n”, .{„world”});
}
Dauguma kodo yra savaime suprantama, bet !void sintaksė įdomi. Ji reiškia, kad funkcija gali grąžinti arba void, arba klaidą. Tai reiškia, kad jei main() funkcija veikia be klaidų, ji nieko negrąžins; bet jei įvyks klaida, ji grąžins klaidos objektą, apibūdinantį klaidą.
Matote, kaip kliento kodas naudoja klaidos objektą eilutėje su try. Kadangi stdout.print gali grąžinti klaidą, try išraiška perduos šią klaidą kaip main() funkcijos grąžinamąją reikšmę.
Zig įrankių rinkinys ir testavimas
Zig taip pat turi statymo įrankį. Pavyzdžiui, aukščiau pateiktą programą galima sukompiliuoti ir paleisti naudojant šias komandas (vėlgi pagal Zig dokumentaciją):
$ zig build-exe hello.zig
$ ./hello
Hello, world!
Zig statymo įrankis veikia kryžminėse platformose ir pakeičia tokias priemones kaip make ir cmake.
2025 metais Zig statymo sistema turi integruotą paketų tvarkyklę su standartiniu konfigūracijos failu build.zig.zon. Ji naudoja Zig Object Notation (ZON) .zon formato failus, apie kuriuos galite sužinoti daugiau čia. ZON yra Zig atsakas JSON formatui. „Kesko Senukai Digital“ steigia akademiją IT specialistams
Paprastai Zig programoms užtenka standartinės komandų eilutės, tačiau paketų tvarkyklė leidžia spręsti situacijas, kai reikia pateikti paketą trečiosioms šalims, statyti daug komponentų arba kai statymo procesas turi daug etapų.
Tolesnis vystymasis už LLVM ribų
Iš pradžių Zig buvo statomas ant LLVM įrankių rinkinio, tačiau vėliau LLVM tapo neprivalomu komponentu. Tai padeda Zig kalbai būti nešiojamai ir geriau tinkančiai savarankiškiems statymams. Šis atnaujinimas yra įdomus, nes rodo, kad Zig įrankių rinkinys linksta naudoti pačią Zig kalbą daugeliui vidinių komponentų – tai vadinama savarankišku Zig.
Tai reiškia, kad anksčiau Zig dažniausiai buvo front-end kalba LLVM, o dabar tai yra viso įrankių komplekto rinkinys, kuris naudoja front-end ir pateikia įvairius įgyvendinimo variantus tikslinėms sistemoms. Dauguma tikslinių operacinių sistemų turi Zig back-end’us, nepriklausančius nuo LLVM, nors LLVM vis dar galima naudoti ir kai kuriais atvejais, ypač dėl C suderinamumo, jis gali būti reikalingas. Dirbtinis intelektas – kas tai?
Šiandien paprastai vystymui naudojamas savarankiškas Zig dėl greitesnio statymo, o optimizuotam produkcijos versijos paleidimui – LLVM.
Zig būklė
Zig turi aktyvią Discord bendruomenę ir gyvą GitHub ekosistemą. Vietinė dokumentacija yra gana išsami. Zig vartotojai taip pat sukūrė nemažai trečiųjų šalių medžiagos. Apdovanoti antrojo „Nacionalinio IT iššūkio“ nugalėtojai
Zig vis dar yra gana jaunas projektas, šiuo metu versija 0.14.0. Lėtas vystymosi tempas atspindi komandos atsidavimą kokybei. Keletas realių projektų jau naudoja Zig produkcijoje. Kalbant apie gamybos pasirengimą, Loris sakė: „Zig dar nėra 1.0 versijoje, todėl, pavyzdžiui, webdev sritys vis dar pradiniame etape, o vienintelė sritis, kuriai aš nerekomenduočiau Zig, yra duomenų apdorojimas, kur, mano nuomone, praktiškesnės yra tokios dinaminės kalbos kaip Python ar Julia.“ Dirbtinio intelekto specialistų trūkumas
Reikėtų pažymėti, kad web kūrimas dar gali neatrodyti kaip pirmas dalykas, kuris šauna į galvą apie Zig, tačiau jo Zine statinis svetainių generatorius sparčiai brandinamas ir dabar talpina Zig svetainę. Zig taip pat palaiko keletą su web susijusių projektų.
Galite stebėti Zig progresą link 1.0 versijos šiame GitHub issue. Tikslios išleidimo datos nėra, bet daugelis problemų yra labiau patobulinimų nei kritinių klaidų.
Kol kas Zig komanda atrodo neskuba su 1.0 išleidimu, kuris gali įvykti 2025 metais arba vėliau – bet tai netrukdo kurti įvairius dalykus su šia kalba jau dabar. Zig aktyvumas, tikslai ir bendruomenės susidomėjimas daro jį patraukliu projektu stebėti. Programavimo kursai
Turinys priklauso: infoworld.com
Reklama




