Zig (langage)
Zig | ||
Date de première version | ||
---|---|---|
Paradigme | Fonctionnel, impératif | |
Auteur | Andrew Kelley | |
Développeur | Andrew Kelley, Open Source | |
Dernière version | 0.12.0 (20/04/2024) | |
Typage | Fort, statique | |
Influencé par | C, C++, LLVM IR, Go, Rust, JavaScript | |
Écrit en | C++, Zig | |
Systèmes d'exploitation | Multiplateforme | |
Licence | Licence MIT | |
Site web | https://ziglang.org/ | |
Extensions de fichiers | .zig | |
modifier |
Zig est un langage de programmation compilé impératif polyvalent, typé statiquement, conçu par Andrew Kelley[2],[3]. Le langage est conçu pour la «robustesse», l'«optimalité» et la «maintenabilité»[4],[5], prenant en charge les génériques et la réflexion au moment de la compilation, la compilation croisée et l'allocation de mémoire manuelle (cad. sans ramasse-miette)[6]. Un objectif majeur du langage est de concurrencer (et d'améliorer) C[7],[8], tout en s'inspirant également de Rust[9],[10], entre autres.
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
[modifier | modifier le code]Hello World
[modifier | modifier le code]// zig version 0.7.1
const std = @import("std");
pub fn main() !void {
const stdout = std.io.getStdOut().writer();
try stdout.print("Hello, {}!\n", .{"world"});
}
QuickSort avec choix de la fonction de comparaison
[modifier | modifier le code]const std = @import("std");
pub fn quickSort(comptime T: type, arr: []T, comptime compareFn: fn (T, T) bool) void {
if (arr.len < 2) return;
const pivot_index = partition(T, arr, compareFn);
quickSort(T, arr[0..pivot_index], compareFn);
quickSort(T, arr[pivot_index + 1 .. arr.len], compareFn);
}
fn partition(comptime T: type, arr: []T, comptime compareFn: fn (T, T) bool) usize {
const pivot_index = arr.len / 2;
const last_index = arr.len - 1;
std.mem.swap(T, &arr[pivot_index], &arr[last_index]);
var store_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]);
return store_index;
}
pub fn main() void {
const print = std.debug.print;
var arr = [_]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 {
fn sortFn(left: i16, right: i16) bool {
return left < right;
}
}.sortFn);
print("After: {any}\n\n", .{arr});
print("Sort numbers in descending order.\n", .{});
quickSort(i16, &arr, struct {
fn sortFn(left: i16, right: i16) bool {
return left > right;
}
}.sortFn);
print("After: {any}\n\n", .{arr});
}
Philosophie
[modifier | modifier le code]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.
Notes et références
[modifier | modifier le code]- « Release 0.13.0 »
- (en-US) « Zig has all the elegant simplicity of C, minus all the ways to shoot yourself in the foot », JAXenter, (consulté le )
- (en-US) « Tired of C? New programming language Zig aims to be more pragmatic and readable », (consulté le )
- (en) Yegulalp, « New challenger joins Rust to topple C language », InfoWorld, (consulté le )
- (en-US) « Zig language and C », Sina Corp, (consulté le )
- (en-US) « The Zig Programming Language », ziglang.org (consulté le )
- (en-US) « Mozilla's Observatory, the Zig programming language, and uSens' VR/AR SDK—SD Times news digest: Aug. 29, 2016 », SD Times, (consulté le )
- (en-US) « The Zig Programming Language », ziglang.org (consulté le )
- (en) Company, « Sudo Null - IT News for you », SudoNull (consulté le )
- (en-US) Kelley, « Unsafe Zig is Safer Than Unsafe Rust », andrewkelley.me (consulté le )
- (en) Tim Anderson 24 Apr 2020 at 09:50, « Keen to go _ExtInt? LLVM Clang compiler adds support for custom width integers », www.theregister.co.uk (consulté le )
- (en-US) « Documentation - The Zig Programming Language », ziglang.org (consulté le )
- (en-US) « SD Times news digest: C++20 concepts in Visual Studio 2010 version 16.3, Bootstrap to drop IE support, and Zig 0.60 released », SD Times, (consulté le )
- (en-GB) « A Reply to The Road to Zig 1.0 », www.gingerbill.org, (consulté le )
- (en-US) « The Zig Programming Language », ziglang.org (consulté le )
- (en) « ziglang/zig », GitHub (consulté le )
- (en-US) « 0.6.0 Release Notes · The Zig Programming Language », ziglang.org (consulté le )
- (en) « Add support for 'zig cc' as C compiler. by hessammehr · Pull Request #13757 · nim-lang/Nim », GitHub (consulté le )
- https://rosettacode.org/wiki/Sorting_algorithms/Quicksort#Zig
- « Documentation - The Zig Programming Language », sur ziglang.org (consulté le )
- (en) « Community · ziglang/zig Wiki », sur GitHub (consulté le )