URL: https://linuxfr.org/news/de-zig-et-des-zags Title: De Zig et des zags Authors: alberic89 đ§ _seb_, orfenor, Ysabeau đ§¶, BAud, palm123, BenoĂźt Sibaud, Strash et Arkem Date: 2023ćčŽ07æ30æ„T17:06:23+02:00 License: CC By-SA Tags: zig et programmation Score: 50 Cette dĂ©pĂȘche, sous son titre Ă©nigmatique, va vous prĂ©senter un langage de programmation relativement nouveau, nommĂ© *Zig*, avec ses caractĂ©ristiques principales ainsi que son Ă©cosystĂšme (_toolchain_). Le but nâest pas de vous faire Ă tout prix adopter ce langage, mais seulement de dĂ©couvrir quelques morceaux choisis, pour le plaisir des yeux.  ---- [DĂ©pĂŽt Git de Zig](https://github.com/ziglang/zig) [Page WikipĂ©dia de Zig](https://fr.wikipedia.org/wiki/Zig_(langage)) [Page dâaccueil de Zig](https://ziglang.org/fr/) [Documentation de Zig](https://ziglang.org/documentation/master/) [Ziglings, des programmes Zig Ă rĂ©parer](https://github.com/ratfactor/ziglings) [Notes de sortie de la version 0.11.0](https://ziglang.org/download/0.11.0/release-notes.html) ---- _Note : ce langage est relativement jeune, la premiĂšre version date de 2016 et la derniĂšre version stable (0.10.1) parue en janvier 2023 est dĂ©jĂ considĂ©rĂ©e comme obsolĂšte par rapport Ă la branche master ! Le dĂ©veloppement est donc trĂšs actif et les diverses documentations ne peuvent rester Ă jour bien longtemps. Une nouvelle [version 0.11.0](https://ziglang.org/download/0.11.0/release-notes.html) est dâailleurs sortie pendant la rĂ©daction de la dĂ©pĂȘche._ PrĂ©sentation =========== Le langage Zig est une idĂ©e dâ[Andrew Kelley](https://andrewkelley.me/post/intro-to-zig.html). Il est lâun des contributeurs principaux et [travaille Ă plein temps](https://andrewkelley.me/post/full-time-zig.html) sur le projet. [Zig](https://ziglang.org/) est un langage compilĂ© impĂ©ratif polyvalent, typĂ© statiquement, « bas niveau » type C/C++/Rust. Il se dĂ©crit ainsi :> Zig est un langage de programmation gĂ©nĂ©raliste ainsi quâune toolchain ayant pour objectifs la robustesse, lâoptimisation et la rĂ©utilisation du code. Ce langage se veut [plus simple](https://ziglang.org/fr/learn/overview/#un-langage-simple) que ses prĂ©dĂ©cesseurs [(« Concentrez-vous sur le debug de votre application et non sur le debug de votre connaissance du langage. »)](https://ziglang.org/fr/#-un-langage-simple) et nĂ©anmoins puissant et sĂ©curisĂ©. Il a aussi lâambition avouĂ©e dĂšs ses dĂ©buts de vouloir ĂȘtre un C meilleur que C, une vĂ©ritable Ă©volution, tout en restant compatible. Câest pourquoi vous pouvez faire en Zig tout ce que vous faisiez en C, mais en mieux. Installation =========== Lâinstallation de Zig est des plus simples et universelle, puisquâil sâagit dâune simple archive tar Ă extraire. On y trouve un exĂ©cutable nommĂ© `zig` qui contient tous les outils nĂ©cessaires, et quelques fichiers de documentation ainsi que la librairie standard zig. (Ă noter que la source de la libc [musl](https://en.m.wikipedia.org/wiki/Musl) est Ă©galement fournie pour pouvoir compiler un bon nombre de cibles, bien que Zig nâen dĂ©pende pas.) Le tout tient dans une petite archive de 45 Mo, ce qui est fort raisonnable. La deuxiĂšme Ă©tape, optionnelle, consiste Ă permettre lâappel Ă lâexĂ©cutable `zig` depuis nâimporte oĂč, soit en ajoutant le dossier contenant `zig` au `PATH`, soit en crĂ©ant un lien symbolique pointant sur cet exĂ©cutable dans votre dossier `bin`. Notons que certains gestionnaires de paquets proposent dĂ©jĂ un package zig, mĂȘme si parfois celui-ci est obsolĂšte Ă cause du dĂ©veloppement trĂšs actif de Zig. Hello, world! =========== Voici le traditionnel « Bonjour, le monde ! » : ```c const std = @import("std"); pub fn main() !void { const stdout = std.io.getStdOut().writer(); try stdout.print("Hello, {s}!\n", .{"world"}); } ``` Dans votre terminal : ```bash $ zig build-exe hello.zig $ ./hello Hello, world! ``` Un autre exemple qui sera peut-ĂȘtre plus intĂ©ressant, il sâagit dâextraire des entiers dâune chaine de caractĂšre, sĂ©parĂ©s par des espaces ou des virgules. Ă noter que ce programme sâauto-teste : ```c const std = @import("std"); const parseInt = std.fmt.parseInt; test "parse integers" { const input = "123 67 89,99"; const ally = std.testing.allocator; var list = std.ArrayList(u32).init(ally); // Ensure the list is freed at scope exit. // Try commenting out this line! defer list.deinit(); var it = std.mem.tokenize(u8, input, " ,"); while (it.next()) |num| { const n = try parseInt(u32, num, 10); try list.append(n); } const expected = [_]u32{ 123, 67, 89, 99 }; for (expected, list.items) |exp, actual| { try std.testing.expectEqual(exp, actual); } } ``` Dâautres exemples sont disponibles sur https://ziglearn.org/. Vous pouvez aussi voir le code dâun [TapTempo abondamment commentĂ©](https://github.com/alberic89/taptempo-zig). Un mot sur lâĂ©cosystĂšme =========== Zig fournit une chaĂźne de compilation qui compile le langage Zig, [mais aussi C et C++](https://ziglang.org/fr/learn/overview/#zig-est-%C3%A9galement-un-compilateur-c). Cette chaĂźne de compilation prend en charge la [cross-compilation](https://ziglang.org/fr/learn/overview/#la-cross-compilation-est-un-usage-de-premi%C3%A8re-importance) ainsi que la [compilation statique](https://ziglang.org/fr/learn/overview/#zig-fournit-la-libc). Zig intĂšgre Ă©galement son propre [systĂšme de construction](https://ziglang.org/fr/learn/overview/#syst%C3%A8me-de-construction-de-zig) rendant superflus lâusage de Make/Cmake/etc. Un [gestionnaire de paquets est prĂ©vu](https://github.com/ziglang/zig/issues/943), pour gĂ©rer aussi bien les bibliothĂšques Ă©crites en C quâen Zig. La [version 0.11.0 a commencĂ© Ă introduire](https://ziglang.org/download/0.11.0/release-notes.html#Package-Management) ce gestionnaire de paquets et il est dĂ©jĂ considĂ©rĂ© suffisamment stable pour ĂȘtre utilisĂ©. Le compilateur est Ă lui seul une petite merveille puisquâil est fourni avec [musl](https://musl.libc.org/) (une implĂ©mentation de la bibliothĂšque standard C) quâil compile Ă la demande et utilise pour gĂ©nĂ©rer des binaires statiques. Il peut construire des exĂ©cutables pour un grand nombre [dâOS et dâarchitectures](https://ziglang.org/learn/overview/#cross-compiling-is-a-first-class-use-case), intĂšgre un [cache de compilation](https://ziglang.org/download/0.4.0/release-notes.html#Build-Artifact-Caching) et [quatre modes de compilation](https://ziglang.org/documentation/master/#Build-Mode). Il [supporte mĂȘme une gĂ©nĂ©ration du code en WebAssembly](https://ziglang.org/documentation/master/#WebAssembly) sans manipulations Ă©sotĂ©riques, simplement en spĂ©cifiant la cible appropriĂ©e. Il est Ă noter quâen mode de compilation _Release_, le compilateur est dĂ©terministe jusque dans ses optimisations, et il produira le mĂȘme binaire pour la mĂȘme source, au bit prĂšs ! Tout ceci fait que le compilateur C du projet Zig est tout Ă fait honorable (voir plus pour [certains](https://zig.news/kristoff/series/3)) face aux principaux compilateurs C du marchĂ©. SpĂ©cificitĂ© du langage =========== Quant au langage lui-mĂȘme, il est conçu pour ĂȘtre simple et lisible, sans rien de cachĂ© : ni [flots de contrĂŽle](https://ziglang.org/fr/learn/why_zig_rust_d_cpp/#pas-de-flot-de-contr%C3%B4le-cach%C3%A9), ni [allocations de mĂ©moire](https://ziglang.org/fr/learn/why_zig_rust_d_cpp/#aucune-allocation-cach%C3%A9e). Si un code en Zig ne semble pas faire appel Ă une fonction, câest quâil ne le fait pas. Lâobjectif de cette conception est dâamĂ©liorer la lisibilitĂ©. Zig ne gĂšre pas lui-mĂȘme les allocations mĂ©moire sur le tas. Il nây a pas de mot clĂ© `new` ou autre fonctionnalitĂ© qui utiliserait un allocateur de mĂ©moire (comme un opĂ©rateur de concatĂ©nation de chaĂźnes de caractĂšres par exemple). Le concept de tas est gĂ©rĂ© par une bibliothĂšque ou le code de lâapplication, pas par le langage. Le principal problĂšme avec les allocations de mĂ©moire cachĂ©es est quâelles empĂȘchent la rĂ©utilisation du code dans certains environnements. Certains cas nĂ©cessitent de nâavoir aucune allocation mĂ©moire, donc le langage de programmation doit fournir cette garantie. [La bibliothĂšque standard de Zig est entiĂšrement optionnelle.](https://ziglang.org/fr/learn/why_zig_rust_d_cpp/#prise-en-charge-de-zig-sans-biblioth%C3%A8que-standard) Chaque API nâest compilĂ©e dans le programme que si elle est utilisĂ©e. Zig a la mĂȘme prise en charge avec ou sans libc. Zig encourage son utilisation directement sur le matĂ©riel et le dĂ©veloppement Ă haute performance. Ceci est le meilleur des deux mondes. Par exemple, les programmes WebAssembly peuvent utiliser les fonctionnalitĂ©s habituelles de la bibliothĂšque standard, et quand mĂȘme avoir des exĂ©cutables de petite taille comparĂ©s aux autres langages prenant en charge WebAssembly. [Zig nâa pas de macros ni de mĂ©taprogrammation](https://ziglang.org/fr/learn/why_zig_rust_d_cpp/#simplicit%C3%A9), et pourtant le langage exprime des programmes complexes dâune maniĂšre claire, non rĂ©pĂ©titive. MĂȘme Rust implĂ©mente en dur certaines macros, comme `format!`. LâĂ©quivalent en Zig est implĂ©mentĂ© dans la bibliothĂšque standard sans code en dur dans le compilateur. [Zig 0.5.0 a introduit les fonctions `async`](https://ziglang.org/fr/learn/overview/#concurrence-avec-les-fonctions-async). Cette fonctionnalitĂ© nâa pas de dĂ©pendance au systĂšme dâexploitation hĂŽte ou mĂȘme Ă lâallocation de mĂ©moire dans le tas. Cela veut dire que les fonctions `async` sont disponibles pour la cible « freestanding » (sans systĂšme dâexploitation). Dans dâautres langages de programmation, les rĂ©fĂ©rences `null` sont sources dâerreurs Ă lâexĂ©cution, et sont mĂȘme soupçonnĂ©es ĂȘtre la pire erreur en informatique. [Les pointeurs en Zig ne peuvent pas ĂȘtre `null`](https://ziglang.org/fr/learn/overview/#type-optionnel-plut%C3%B4t-que-des-pointeurs-null). Il existe nĂ©anmoins un type optionnel. Zig dĂ©fini un [type spĂ©cial de gestion des erreurs](https://ziglang.org/documentation/0.11.0/#Errors). Les erreurs ne peuvent ĂȘtre ignorĂ©es. Zig vous permet dâĂ©numĂ©rer toutes les raisons possibles de dĂ©faillance de maniĂšre exhaustive et de traiter chacune dâentre elles de maniĂšre spĂ©cifique si vous le souhaitez. Cette Ă©numĂ©ration est produite et vĂ©rifiĂ©e par le compilateur (ce qui fait partie des particularitĂ©s du langage Zig), de sorte que vous ne pouvez manquer aucun cas. Il convient donc dâen tenir compte et de les traiter au moyen des mots-clĂ©s `catch`, `try`, `switch` et `unreachable`. Il a Ă©tĂ© dit plus haut que Zig nâa pas de macros. Mais il a mieux. Il peut exĂ©cuter du code Ă [la compilation plutĂŽt quâĂ lâexĂ©cution](https://ziglang.org/documentation/0.11.0/#comptime). En effet, une variable marquĂ©e du mot-clĂ© `comptime` sera connue Ă la compilation. Les boucles marquĂ©es du mot-clĂ© `inline` seront exĂ©cutĂ©es Ă la compilation. Cela permet dâexĂ©cuter Ă lâavance les parties du code qui ne dĂ©pendent pas des entrĂ©es utilisateur, et dâoptimiser lâexĂ©cution, ou simplement automatiser des tĂąches rĂ©pĂ©titives pour le programmeur sans que cela ne se ressente Ă lâexĂ©cution. Un exemple : je veux que mon programme affiche son nom Ă diffĂ©rent stade de son exĂ©cution, avec de grandes lettres en art ASCII. On dispose pour cela dâune chaĂźne de caractĂšre contenant le nom du programme, et dâune fonction `foo` qui retourne une chaine avec de grandes lettres en art ASCII en Ă©change dâune chaĂźne de caractĂšre. La plupart du temps, on se contenterait dâappeler une fois la fonction `foo` au dĂ©but du programme et Ă stocker dans une variable le rĂ©sultat pour lâafficher. Mais Zig permet dâaller plus loin. Avec lâexĂ©cution Ă la compilation, on peut nâexĂ©cuter la fonction donnant les grandes lettres quâĂ la compilation, augmentant ainsi lĂ©gĂšrement le temps dâexĂ©cution. La fonction `foo` nâĂ©tant pas utile Ă lâexĂ©cution, elle ne sera pas incluse dans le binaire, tout comme la chaĂźne contenant le nom du programme. Cet exemple est trivial, mais peut vous donner un aperçu de la puissance du _comptime_. Pour un article plus dĂ©taillĂ© sur le _comptime_ Zig, voir https://zig.news/edyu/wtf-is-zig-comptime-and-inline-257b Vous pourrez en apprendre encore plus en lisant la [vue dâensemble du projet](https://ziglang.org/fr/learn/overview/), ou en jouant avec les [ziglings](https://github.com/ratfactor/ziglings) ! Les outils =========== Il nâexiste Ă ce jour aucun IDE conçu pour Zig, mais certains Ă©diteurs de texte supportent dĂ©jĂ des fonctionnalitĂ©s telles que la coloration syntaxique. Ces Ă©diteurs sont [Emacs, Vim, Kate, VS Code et Sublime Text](https://ziglang.org/fr/learn/tools/#%C3%A9diteurs-de-texte). Un [serveur de langue](https://en.wikipedia.org/wiki/Language_Server_Protocol) est [fourni](https://ziglang.org/fr/learn/tools/#serveurs-de-langue) Ă©galement pour les [clients le supportant](https://langserver.org/#implementations-client). Quant au dĂ©bogage, il peut se faire tout simplement avec `gdb`, ou nâimporte quel dĂ©bogueur C/C++. NĂ©anmoins, le compilateur fournit des indications si prĂ©cises sur les erreurs quâon a pu commettre que le recours Ă un dĂ©bogueur pour la plupart des erreurs triviales est inutile. Les librairies Zig, elles, sont, pour lâinstant, peu nombreuses, et il nâexiste pas dâindex « officiel » pour les rĂ©fĂ©rencer puisque la communautĂ© est dĂ©centralisĂ©e. Ă la place, on retrouve plusieurs petits index maintenus par la communautĂ©. Il existe tout de mĂȘme un [projet en cours de gestionnaire de paquet](https://kristoff.it/blog/zig-self-hosted-now-what/#the-official-package-manager) livrĂ© avec Zig, qui nâest reliĂ© Ă aucun index en particulier, et qui gĂšrera aussi bien les modules Zig que C/C++. Usage =========== Zig est un langage de programmation assez gĂ©nĂ©raliste, il peut donc convenir Ă la plupart des usages. Il est notamment plĂ©biscitĂ© pour des programmes ayant des contraintes de performance et de consommation mĂ©moire que lâon peut retrouver dans les systĂšmes embarquĂ©s et applications en « temps rĂ©el ». Une communautĂ© dâutilisateurs (des _ziguanas_) dans ce domaine ([_zig embedded group_](https://microzig.tech/)) sâorganise autour du projet [microzig](https://github.com/ZigEmbeddedGroup/microzig/) afin dâoffrir lâoutillage nĂ©cessaire pour ce type de dĂ©veloppement. On peut trouver plusieurs [listes de projets Ă©crits en Zig](https://github.com/zigcc/awesome-zig-list), parmi lesquels on trouve un [lecteur de flux Fediverse pour bureau GTK](https://github.com/donpdonp/zootdeck), un [solveur de sudoku](https://github.com/user00e00/sudokuinzig), un [interprĂ©teur Brainfuck](https://github.com/dantecatalfamo/brainfuck-zig), un [Ă©diteur de pixel art](https://github.com/fabioarnold/MiniPixel), [un systĂšme dâexploitation](https://github.com/birth-software/birth), un [environnement dâexĂ©cution JavaScript](https://github.com/oven-sh/bun), un [jeu RPG 2D](https://github.com/foxnne/aftersun)... Les usages de Zig sont multiples et variĂ©s ! Zig est aussi utilisĂ© par des entreprises comme [Uber](https://zigmonthly.org/letters/2022/may-june/#how-zig-is-used-at-uber) ou [TigerBeetle](https://tigerbeetle.com/). La version 0.11.0 ================= Cette sortie de version inclut 8 mois de travail : des changements de la part de 269 contributeurs diffĂ©rents, rĂ©partis dans 4457 changements. Un total de 1012 tickets rĂ©solus ! Câest Ă©galement [« the dĂ©but of Package Management »](https://ziglang.org/download/0.11.0/release-notes.html#Package-Management). Le mot de la fin =========== Zig est sous licence MIT. Lâorganisation [_Zig Software Foundation_](https://ziglang.org/zsf/) est une organisation Ă but non lucratif 501(c)(3)) dont lâobjectif est de soutenir le projet Zig que ce soit par la rĂ©munĂ©ration, voire, lâembauche, de dĂ©veloppeurs ([Jakub Konka, Rich Felker, Meghan Denny, Andrew Kelley](https://ziglang.org/news/jakub-konka-hired-full-time/)) ou le sponsoring dâautres projets gravitant autour du projet ([Zig books](https://kristoff.it/blog/note-about-zig-books/) par exemple ou indirectement [musl](https://andrewkelley.me/post/why-donating-to-musl-libc-project.html)). 