VT2021 Zig fiche

Analyse du Langage Zig
MALOD Victor (mettre mail ici) - PARA Yaël (ya38able@gmail.com)

Résumé
Mots clés : Zig, langage, performances, programmation

Zig est un langage de programmation qui met en avant la robustesse, l'optimalité et la réutilisation du code. Son créateur s'est inspiré de la simplicité du langage C afin de concevoir un langage qui va à l'essentiel et fournit les fonctionnalités indispensables des langages de programmation orienté objet tout en restant lisible et accessible. Ce langage est par ailleurs devenu un concurrent direct du langage C. Dans cette synthèse nous étudions les avantages de ce langage tout en le comparant avec ses concurrents en termes de performance, simplicité et d'accessibilité.

Abstract
Keywords : Zig, language, performance, programming

Zig is a programming language which emphasizes robustness, optimality and code reuse. Its creator was inspired by the simplicity of the C programming language and designed a language that provides the essential features of object-oriented programming languages while remaining simple and easy to learn. This language has also become a direct competitor of the C language. In this study, we will study the advantages of this language while making a comparison between Zig and its competitors in terms of performance, simplicity and accessibility.

Synthèse
A. Objectifs du langage

L'objectif principal du créateur de Zig est de fournir une version améliorée du langage C sans ses défauts.

En effet le créateur du langage s'est inspiré du langage C lors de la conception, car il apprécie la simplicité du langage C, le fait qu'on puisse suivre facilement le flux de contrôle lors de l'exécution d'un programme, et il a souhaité avec ce nouveau langage conserver cet aspect minimaliste tout en proposant des fonctionnalités que l'on peut retrouver dans des langages orienté objet comme C++ (comme par exemple les types génériques).

Ce langage vise à être un remplaçant du langage C, il peut donc être utilisé dans les mêmes types de projets que ceux utilisant le langage C. Il a été utilisé pour des jeux, comme Oxid, mais également pour la programmation d'émulateurs, des serveurs HTTP/DNS, des kernels, des bases de données, et des compilateurs entre autres. Il peut par ailleurs être utilisé sur des microcontrôleurs. Une liste de projets utilisant le langage Zig peut être trouvée sur ce lien : https://github-wiki-see.page/m/ziglang/zig/wiki/Community-Projects

B. Caractéristiques du langage

Les informations concernant les caractéristiques présentées ici proviennent de la page d'overview du langage : https://ziglang.org/fr/learn/overview/ Toutes les caractéristiques intéressantes du langages ne sont pas présentées ici, pour des soucis de concision.

Pas de flux de contrôle caché

Un passage d'un bloc de code à un autre est uniquement causé par des appels de fonctions et il n'y a pas de flux de contrôle caché. Dans d'autres langages, cela peut ne pas être le cas :

- Par exemple en D, il existe ce qu'on appelle des property functions, qui sont des méthodes appelées avec la même syntaxe que l'accès à un champ d'une structure. - De même, en C++ il existe l'overloading d'opérateur, ce qui permet de spécifier le comportement d'un opérateur par une fonction. Dans cette portion de code, l'opérateur pourrait également appeler une fonction. - Enfin en Java, une exception peut être levée, interrompant le flux d'exécution.

De façon générale, le langage est conçu de façon à ce que si dans le code on n'observe pas d'appel de fonction, il n'y aura pas d'entrée dans une fonction. Cela permet d'améliorer la lisibilité du code, et donc sa compréhension.

Pas de préprocesseur

Le préprocesseur C est l'outil qui assure la compilation des programmes informatiques écrits dans les langages de programmation C. Il permet principalement l'inclusion d'un segment de code source disponible dans un autre fichier avec la directive include, ainsi que la compilation conditionnelle avec les directives ifndef (plus d'informations à ce sujet ici : https://fr.wikipedia.org/wiki/Préprocesseur_C) Le principal problème du préprocesseur selon son créateur est que le langage utilisé pour les directives du préprocesseur est indépendant de la syntaxe du langage C, de sorte que le préprocesseur C puisse être utilisé isolément pour traiter d'autres types de fichiers sources (comme ceux du C++) Cela a 2 conséquences majeures : - L'utilisation de la commande ifdef dans des fichiers source en C peut provoquer la compilation de code qui contient des erreurs de syntaxe. En effet, après le traitement du fichier source par le préprocesseur, le compilateur peut ne pas détecter des erreurs de syntaxe dans des lignes de code qui sont exclues par les directives ifdef et endif. - L'utilisation de la directive include permettant l'inclusion de portions de codes provenant d'un autre fichier en C est considéré comme le plus grand contributeur à des temps de compilation lents pour les programmes C. Afin de résoudre ce problème, le langage Zig fournit les fonctionnalités du préprocesseur C dans le langage Zig. Cela résout les pertes de performances (car on gère un seul langage contrairement en C) et permet de rendre les erreurs de syntaxes visibles, car les instructions équivalentes à celles du préprocesseur en langage C subissent les mêmes vérifications à la compilation que celles du code basique. Il n'y a plus de phase de préprocessing (traduction des directives du préprocesseur) lors de la compilation en Zig, ce qui améliore les performances et évite l'exclusion de code par les directives équivalentes à ifdef et endif (plus d'informations sur les pertes de performance avec le préprocesseur C ici : https://andrewkelley.me/post/intro-to-zig.html#preprocessor-alternatives).

C. Performances du langage

Temps de compilation

Une comparaison du temps de compilation de différents langages peut être retrouvée ici : https://vlang.io/compilation_speed. Ce test a été créé par le créateur du langage V afin de démontrer la supériorité de son langage en ce qui concerne les temps de compilation. On remarque que Zig fait partie des temps de compilation les plus courts, même en comparaison avec d'autres langages bas niveau tels que RUST. Il reste bien en dessous du temps de compilation de C++, cependant il met le double de temps en comparaison avec le langage C.