Zig possède de nombreuses fonctionnalités pour la programmation de bas niveau, notamment des types composés (struct) avec zéro padding, des entiers de taille arbitraire[11] et différents types de pointeurs[12].
Le compilateur, originellement écrit en C++, a lentement été réécrit en Zig pour être aujourd'hui disponible dans sa version entièrement implémentée en Zig, nommée Stage 2. Il utilise LLVM 11[13] comme back-end[14] , prenant en charge plusieurs de ses cibles natives[15], bien que d'autres back-ends soient en développement. Le compilateur est un logiciel libre et open source distribué sous la licence MIT[16]. Le compilateur Zig fournit la possibilité de compiler du C et du C++, similaire à Clang en utilisant respectivement la commande "zig cc" et "zig c++"[17]. Le langage de programmation Nim prend en charge l'utilisation de zig cc comme compilateur C. [18]
Exemples
Hello World
// zig version 0.7.1conststd=@import("std");pubfnmain()!void{conststdout=std.io.getStdOut().writer();trystdout.print("Hello, {}!\n",.{"world"});}
QuickSort avec choix de la fonction de comparaison
conststd=@import("std");pubfnquickSort(comptimeT:type,arr:[]T,comptimecompareFn:fn(T,T)bool)void{if(arr.len<2)return;constpivot_index=partition(T,arr,compareFn);quickSort(T,arr[0..pivot_index],compareFn);quickSort(T,arr[pivot_index+1..arr.len],compareFn);}fnpartition(comptimeT:type,arr:[]T,comptimecompareFn:fn(T,T)bool)usize{constpivot_index=arr.len/2;constlast_index=arr.len-1;std.mem.swap(T,&arr[pivot_index],&arr[last_index]);varstore_index:usize=0;for(arr[0..arr.len-1])|*elem_ptr|{if(compareFn(elem_ptr.*,arr[last_index])){std.mem.swap(T,elem_ptr,&arr[store_index]);store_index+=1;}}std.mem.swap(T,&arr[store_index],&arr[last_index]);returnstore_index;}pubfnmain()void{constprint=std.debug.print;vararr=[_]i16{4,65,2,-31,0,99,2,83,782,1};print("Before: {any}\n\n",.{arr});print("Sort numbers in ascending order.\n",.{});quickSort(i16,&arr,struct{fnsortFn(left:i16,right:i16)bool{returnleft<right;}}.sortFn);print("After: {any}\n\n",.{arr});print("Sort numbers in descending order.\n",.{});quickSort(i16,&arr,struct{fnsortFn(left:i16,right:i16)bool{returnleft>right;}}.sortFn);print("After: {any}\n\n",.{arr});}
Le "Zen" de Zig, qui peut être lu sur le site de la fondation Zig, est un ensemble d'idées sur ce qui est important dans le langage Zig. Dans leurs mots[20] :
Communiquer les intentions précisément
Les cas spéciaux ou rares sont importants
Favoriser la lecture du code par dessus l'écriture
Une seule manière d'écrire les choses
Les crash à l'exécution sont meilleurs que les bugs
Les erreurs à la compilation sont meilleures que les crashs
Améliorations incrémentales
Éviter les maxima locaux
Réduire ce qu'on doit retenir
Se concentrer sur le code plutôt que sur le style
L'allocation de ressources peut échouer, la libération doit réussir
La mémoire est une ressource
Ensemble nous servons l'utilisateur
Bien que la Fondation Zig existe, avec son site web, et un compilateur (le seul à ce jour), la communauté Zig n'a pas de concept d'officiel ou non-officiel[21], et tout le monde est libre de créer son site, sa communauté, ses outils Zig, voire un compilateur, qui ne sera pas plus officiel que ceux déjà existants.