Uploaded avatar of ErikSchierboom

C'est le Slimline September !

@ErikSchierboom
il y a Environ 3 ans
Vidéo

Introduction

Salut tout le monde ! J'espère que tout le monde va bien.

On a passé un mois d'août bien chargé chez Exercism. On a fusionné Premium et Insiders, ajouté un retour automatisé directement dans l'éditeur, lancé les Trophées de parcours, et apporté plein de petites améliorations au site aussi ! Si tu n'as pas encore regardé tes parcours pour voir quels trophées tu obtiens, fais-le, ça vaut vraiment le coup. On a envoyé un e-mail à toutes les personnes qui ont au moins un trophée, alors garde aussi un œil sur ta boîte de réception. Pendant le mois d'août, on s'est aussi bien amusés dans #12in23, en explorant des langages que l'on utilise habituellement pour créer des applications.

Ce mois-ci, c'est Slimline September, où l'on explore des langages dont la syntaxe est souvent très concise et condensée. Plus précisément, on s'intéresse à 8th (un descendant de Forth), AWK, Bash, jq, Perl et Raku (autrefois appelé Perl 6).

Les badges

Pour obtenir le badge Slimline September, tu dois terminer cinq exercices au choix dans l'un de ces langages pendant le mois de septembre.

Il y a aussi le badge 12in23, valable toute l'année. Pour l'obtenir, tu dois résoudre cinq de nos exercices en vedette dans le langage.

  • Gigaseconde : travailler avec les dates
  • Chiffrement Atbash : travailler avec les strings
  • Fléchettes : travailler avec les nombres et les conditions
  • Luhn : travailler avec les strings, les conditions et les nombres
  • Séries : travailler avec les strings et les séquences

Ces exercices, comme ceux des mois précédents, sont tous disponibles sur la page #12in23.

Tour d'horizon

On va entrer dans le vif du sujet et explorer ces langages, avec un aperçu de chacun.

8th

  • Développé par Ron Aaron.
  • Son nom est un jeu de mots sur le langage Forth, sa principale source d'inspiration. Il en diffère cependant beaucoup :
    • Typage fort
    • Multiplateforme
    • Sécurité renforcée (pas d'accès direct à la mémoire ni d'assembleur intégré)
  • Propose une version gratuite et une version commerciale, cette dernière offrant davantage de fonctionnalités.
  • Code source fermé, mais le code source peut être consulté après l'achat d'une licence entreprise

AWK

  • AWK a été créé aux Bell Labs dans les années 1970 par Alfred Aho, Peter Weinberger et Brian Kernighan. Son nom est l'acronyme des noms de famille de ses auteurs.
  • C'est un langage dédié, conçu pour le traitement de texte, mais il peut aussi servir à d'autres usages
  • AWK est un filtre Unix, comme sed et grep, prévu pour être utilisé dans un pipeline
  • La Single UNIX Specification et la Linux Standard Base exigent toutes deux qu'il soit inclus dans toute implémentation, ce qui explique sa présence sur la plupart des machines *nix
  • Différentes implémentations du langage AWK :
    • awk (ou oawk pour l'AWK original) : l'implémentation d'origine
    • GNU AWK (gawk), publié en 1988, qui a considérablement révisé et étendu le langage
    • BWK AWK (aussi appelé nawk), publié à la fin des années 90
    • mawk : implémentation rapide interprétée en bytecode
  • Sur de nombreux systèmes *nix, la commande awk est un lien symbolique vers gawk ou nawk

Bash

  • Bash est un shell Unix développé par Brian Fox et publié en 1989.
  • Conçu comme un remplacement libre du shell Bourne, il est devenu le shell de connexion par défaut de la plupart des distributions Linux. C'est un sur-ensemble de la syntaxe du shell Bourne, ce qui facilite la transition
  • Il étend le shell Bourne de nombreuses façons : expansion des accolades, complétion en ligne de commande, gestion des signaux, et bien plus

jq

  • Développé par Stephen Dolan et publié en 2012
  • Conçu pour permettre d'interroger, de transformer et de manipuler facilement des documents JSON (« le sed du JSON »)
  • L'outil jq (qui implémente le langage) a d'abord été implémenté en Haskell, avant d'être porté en C. Il existe aussi des portages en Go et en Rust

Perl

  • Perl a été développé par Larry Wall à la fin des années 1980 et publié pour la première fois en 1987.
  • Conçu comme un langage de script polyvalent pour faciliter le traitement de rapports
  • Très influent, en particulier pour sa prise en charge des expressions régulières (on y reviendra plus tard)

Raku

  • Conçu par Larry Wall (créateur de Perl) et publié en 2015
  • Connu à l'origine sous le nom de Perl 6, il devait nettoyer le langage et supprimer certaines fonctionnalités jugées peu utiles ou déroutantes (citation savoureuse : « En Perl 6, nous avons décidé qu'il valait mieux corriger le langage que corriger l'utilisateur. », Larry Wall). Perl 6 s'est finalement révélé incompatible au niveau du code source avec Perl 5, et a donc été renommé Raku
  • Sa philosophie de conception vise à rendre la programmation agréable et productive, tout en offrant un large éventail d'outils pour relever des défis de programmation très variés (langage généraliste)
  • Raku étant une spécification, il peut exister (et il existe) plusieurs implémentations. La seule activement développée aujourd'hui est Rakudo, mais il existe des implémentations plus anciennes comme Pugs (écrit en Haskell), v6-KindaPerl6 et Niecza (ciblant le CLR)

Où ces langages sont-ils utilisés ?

8th

  • Malheureusement, on n'a pas réussi à trouver où il est utilisé

AWK

  • Utilisé pour l'extraction de données et la génération de rapports, et plus généralement pour l'écriture de scripts

Bash

  • Principalement utilisé pour l'administration système, mais aussi pour fournir des utilitaires en ligne de commande ou des surcouches autour d'autres outils. On l'a énormément utilisé pour travailler en masse sur les dépôts Exercism

jq

  • Utilisé pour interroger, transformer et manipuler des documents JSON, souvent sous forme de scripts shell.

Perl

  • Utilisé pour la manipulation de données, l'analyse de fichiers, la programmation web et les tâches d'administration système. Il a gagné en popularité aux débuts du web grâce à ses capacités de manipulation de strings et à son vaste écosystème de modules.

Raku

  • Utilisé pour le traitement de texte, l'administration système, et bien plus

Qu'est-ce qui rend ces langages intéressants d'un point de vue de la programmation ?

La plupart de ces langages sont à typage dynamique et interprétés, ce qui cadre bien avec leur nature de langages de script. Cela dit, il y a quelques exceptions, notamment du côté des paradigmes pris en charge.

8th

  • Typage fort
  • Multi-paradigme : procédural, mais surtout basé sur la pile (modèle d'exécution à pile), réflexif (capacité à examiner et modifier sa propre structure et son propre comportement) et concaténatif (toutes les expressions sont des fonctions et la juxtaposition de fonctions dénote la composition de fonctions)
  • Compilé en code natif, mais peut aussi être interprété dans un REPL

AWK

  • À typage dynamique, et souvent interprété (cela dépend de l'implémentation utilisée)
  • Son paradigme principal est piloté par les données : on décrit un programme comme un ensemble d'instructions qui décrivent les données à faire correspondre et le traitement à effectuer, plutôt que de définir explicitement une séquence d'étapes à suivre. AWK prend aussi en charge la programmation procédurale

Bash

  • Langage dynamique et interprété
  • Prend en charge la programmation impérative et procédurale

jq

  • Langage dynamique et interprété
  • Langage purement fonctionnel (toutes les valeurs sont immuables), avec un fort accent sur les « pipelines ». Le tout a une saveur très Unix

Perl

  • À typage dynamique et interprété
  • Multi-paradigme, prenant en charge la programmation fonctionnelle, orientée objet et impérative

Raku

  • À typage dynamique, mais prend en charge le typage progressif, qui permet d'ajouter du typage statique là où c'est nécessaire (Perl, lui, est dynamique)
  • Langage multi-paradigme : impératif, procédural, orienté objet et fonctionnel

Qu'est-ce qui en fait d'excellents langages ?

8th

  • Très peu de syntaxe, ce qui rend le langage plus facile à apprendre et à comprendre. Il utilise JSON pour décrire les données (comme les objets et les tableaux). Il prend aussi en charge d'autres conteneurs, comme les piles, les files d'attente et les tas
  • Aucun mot-clé réservé. Les sous-routines s'appellent des « mots », et de nouveaux mots peuvent être définis facilement. Tous les mots, qu'ils soient intégrés ou définis par l'utilisateur, peuvent être redéfinis à l'exécution
  • Multiplateforme. On peut générer facilement un exécutable pour n'importe quelle plateforme prise en charge
  • Sécurisé. Des fonctionnalités de sécurité intégrées pour éviter toute une série de bugs (pas d'accès direct à la mémoire, l'exécution ne se lie pas à des bibliothèques dynamiques)

AWK

  • Une syntaxe simple et une structure du code AWK très cohérente, ce qui rend le code AWK facile à apprendre et à lire. Ses structures de données sont elles aussi simples et souples
  • Très expressif : on peut faire beaucoup avec très peu de code. Parfait pour les one-liners
  • Installé sur la plupart des machines *nix, ce qui permet d'utiliser ses compétences en AWK un peu partout (avec /bin/sh, c'est le seul langage de script de l'Unix standard)
  • Fonctionne très bien dans les pipelines et les scripts shell, où AWK traite la sortie d'autres outils, ou l'inverse

Bash

  • Peut être utilisé sur la plupart des plateformes. Il est installé sur presque toutes les machines *nix, macOS compris. Avec le sous-système Windows pour Linux (WSL), bash est désormais aussi disponible sur les systèmes Windows.
  • S'utilise comme un RE(P)L, où l'on exécute des commandes une par une, ou bien lit et exécute du code depuis des fichiers (appelés scripts shell). Si tu as déjà utilisé un terminal Linux, tu as probablement écrit du code bash, car le terminal est généralement un RE(P)L bash
  • Bash et les scripts shell sont largement utilisés pour l'administration système, le devops et la gestion des machines.
  • Extrêmement polyvalent et flexible
  • De puissantes capacités de manipulation de strings, avec notamment une interpolation de strings très simple

jq

  • Une syntaxe simple et courte pour travailler avec JSON, ce qui le rend facile à apprendre
  • Permet de définir ses propres fonctions pour des opérations plus complexes.
  • Prend en charge l'optimisation de la récursion terminale, idéale pour traiter des données de façon récursive
  • L'outil jq est distribué sous forme d'un binaire unique de seulement 30 Ko environ
  • L'outil yq enveloppe jq pour permettre d'utiliser la même syntaxe afin de manipuler des fichiers XML, TOML et YAML (il convertit ces types de données en JSON en coulisses)
  • Les implémentations en C et en Go peuvent toutes deux être intégrées dans d'autres applications

Perl

  • Fonctionne sur la plupart des plateformes. Idéal pour écrire des scripts multiplateformes
  • La souplesse est la pierre angulaire de la philosophie de conception de Perl. Sa devise célèbre est : « There's more than one way to do it » (TMTOWTDI). Selon la tâche à accomplir, différentes approches sont possibles
  • Une communauté solide et un héritage de projets influents. De nombreux scripts, outils et applications ont été développés avec Perl. On l'a un jour décrit comme « le ruban adhésif qui tient Internet ensemble »
  • Un écosystème riche de modules et de bibliothèques, accessible via le Comprehensive Perl Archive Network (CPAN)

Raku

  • Vaste, complexe et puissant, mais aussi conçu pour être un langage que l'on n'a pas besoin d'apprendre d'un seul coup. Il est facile de s'y mettre, et on peut explorer les fonctionnalités plus puissantes plus tard
  • Un système de types puissant et extensible, qui inclut le typage progressif. On peut ainsi choisir le niveau de vérification de types souhaité, ce qui permet un équilibre entre typage dynamique et typage statique
  • Prend en charge la répartition multiple, qui permet d'utiliser le polymorphisme sans héritage
  • Unicode est un citoyen de première classe en Raku. Le langage prend nativement en charge différents encodages de caractères
  • Offre des fonctionnalités avancées de concurrence et de parallélisme. Il prend en charge nativement la programmation asynchrone, la programmation réactive et l'exécution parallèle

Quelles sont leurs fonctionnalités les plus marquantes ?

8th

  • Il demande une autre façon de penser. Son mélange unique de paradigmes est très différent des autres langages et t'invite à imaginer d'autres manières d'aborder les choses
  • Le modèle à pile et la notation polonaise inversée (NPI) donnent une représentation mentale très simple de l'exécution d'un programme. Les valeurs sont empilées sur la pile, et la plupart des mots se définissent par leur effet sur la pile

AWK

  • Le paradigme piloté par les données est très puissant. Il demande une autre façon de penser, puisque les programmes se définissent comme un ensemble de paires condition/action, que le texte est découpé en enregistrements (généralement une ligne par enregistrement) et que chaque enregistrement est découpé en champs (par exemple des champs CSV, ou un mot par champ). Une fois que l'on s'y est habitué, on apprécie l'élégance et l'expressivité de cette approche, et on se met à y voir des usages partout
  • Parfait pour travailler avec du texte. Qu'il s'agisse d'analyser du texte, de le transformer ou de générer des rapports, AWK répond présent. Pour des tâches comme afficher le shell de chaque utilisateur du système ou additionner une colonne CSV, tu seras surpris du peu de code nécessaire

Bash

  • Parfait pour l'automatisation. Les scripts shell sont excellents pour automatiser les tâches répétitives.
  • Les scripts bash utilisent des pipelines et permettent d'assembler d'autres programmes sans effort. Il est trivial de créer un script qui redirige la sortie d'une commande vers une autre, ou qui échoue dès qu'une des commandes exécutées échoue.
  • Puissant. La facilité avec laquelle on peut utiliser d'autres outils fait de bash un outil incroyablement puissant

jq

  • Idéal pour extraire et manipuler des données JSON facilement et proprement (et on en a des tonnes de nos jours). Il est devenu l'outil de facto pour transformer des données JSON. On peut même créer des données JSON avec jq
  • Prend en charge le traitement en flux, ce qui permet de travailler avec des données « infinies » sans problème de mémoire
  • L'accent mis sur les pipelines sera facile à appréhender pour quiconque connaît les flux, par exemple les outils Unix. Cela rend aussi le code jq assez facile à comprendre

Perl

  • Célèbre pour sa concision et son expressivité. Il faut très peu de code pour faire beaucoup
  • Particulièrement bien adapté au travail sur le texte, en grande partie grâce à sa puissante prise en charge des expressions régulières. Perl 5 en particulier a introduit de nombreuses nouveautés (comme les rétroréférences, les groupes de capture nommés et les quantificateurs paresseux). Philip Hazel a créé PCRE (Perl Compatible Regular Expressions), une bibliothèque C qui implémente un moteur d'expressions régulières compatible avec Perl 5. Même les langages qui ne s'appuient pas sur PCRE conçoivent souvent leur prise en charge des expressions régulières pour être compatible PCRE (et donc utiliser la syntaxe de Perl 5)

Raku

  • Prend en charge les jonctions avec enfilage automatique, ce qui facilite beaucoup le travail sur le parallélisme
  • Prend en charge l'évaluation paresseuse, ce qui permet de travailler avec des listes et des séquences infinies sans rencontrer de problème de mémoire. C'est particulièrement utile pour traiter de grands ensembles de données ou des algorithmes impliquant des flux infinis de données
  • Idéal pour le traitement de texte, avec une syntaxe d'expressions régulières plus simple, plus lisible et plus puissante
  • Prise en charge native de la définition de langages dédiés (DSL) personnalisés à l'aide de grammaires. Cela permet de créer des analyseurs syntaxiques pour des formats de données ou des langages spécifiques, ce qui facilite le travail sur des données textuelles complexes

Lesquels essayer ?

  1. Si tu utilises principalement un système Unix ou que tu fais du devops, Bash est un langage précieux à apprendre. Apprendre AWK, Perl ou Raku peut aussi être très bénéfique, les deux premiers étant en plus préinstallés sur de nombreux systèmes
  2. Si tu travailles avec du JSON (ou du XML, du YAML, du TOML), jq est un choix évident
  3. Si tu veux traiter du texte, AWK, Perl et Raku sont les choix évidents.
  4. Si tu as envie d'essayer quelque chose d'un peu différent, 8th est une excellente option
1er Sep 2023 · Tu l'as trouvé utile ?