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. ![Logo de Zig](https://raw.githubusercontent.com/ziglang/logo/master/zig-logo-dark.svg) ---- [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)). ![Zero the Ziguana, une des mascottes de Zig](https://raw.githubusercontent.com/ziglang/logo/master/zero.svg)

AltStyle ă«ă‚ˆăŁăŠć€‰æ›ă•ă‚ŒăŸăƒšăƒŒă‚ž (->ă‚ȘăƒȘă‚žăƒŠăƒ«) /