Sortie de Perl 5.22.0

Posté par  (site web personnel) . Édité par Stéphane Aulery, Kwiknclean, ZeroHeure, palm123 et BAud. Modéré par patrick_g. Licence CC By‑SA.
Étiquettes :
33
4
juin
2015
Perl

Le langage Perl, initialement conçu pour la manipulation de texte, puis utilisé aujourd’hui pour tout un vaste pan d’applications, allant des frameworks web aux applications en biologie, continue à mûrir dans sa troisième décennie.

Cette dépêche fait suite à la précédente concernant la sortie de la version 5.16.0, et résume les évolutions majeures depuis cette dernière (version 5.18.0 en mai 2013, 5.20.0 en mai 2014 et 5.22.0), qui sont le fruit du travail de plus d’une centaine de personnes.

Un aperçu des évolutions de l’écosystème Perl 5 ces dernières années et de celui de sa petite sœur (ou petit frère) Perl 6 complète le tableau.

Sommaire

La version 5.18.0

Langage

Des opérations ensemblistes sur les classes de caractères sont possibles dans les regexps avec une nouvelle construction (?[...]). Par exemple :

use v5.18;
use utf8;
no warnings "experimental::regex_sets";
print "λ est une lettre grecque minuscule\n"
  if "λ" =~ /(?[\p{Greek} & \p{Lower}])/;
print "Λ est une lettre grecque non minuscule\n"
  if "Λ" =~ /(?[\p{Greek} - \p{Lower}])/;

On peut maintenant déclarer avec my des fonctions lexicales, locales à un block (très expérimental). À ne pas confondre avec des références.

Les mots-clés next, last et redo peuvent prendre en argument une expression quelconque calculant un label.

D’autres changements significatifs comme :

  • Les motifs étendus expérimentaux (?{}) et (??{}), qui permettent d’exécuter du code Perl dans une regexp, ont été améliorés (surtout des corrections de bogues et une sémantique plus claire) ;
  • Des fonctionnalités introduites dans la version 5.10 sont devenues expérimentales. En particulier ~~, given et when sont expérimentaux maintenant, car leur implémentation s’est révélée problématique.

Optmisations

Quelques optimisations, comme :

  • my ($x, $y) est optimisé comme une seule opération ;
  • les regexps utilisant des propriétés Unicode sont plus rapides.

Sécurité

La fonction de hachage utilisée pour les tables de hachage fait l’usage d'une graine aléatoire, pour éviter des attaques de complexité algorithmique.

La version 5.20.0

Langage

On peut activer la possibilité d’utiliser des signatures lors de la déclaration des fonctions. Les fonctions peuvent prendre maintenant un attribut prototype, afin de pouvoir utiliser les signatures et les prototypes en même temps. Par exemple, on pourra écrire :

no warnings 'experimental::signatures';
use feature 'signatures';
sub ouah ($chien) {
    # faire quelque chose avec le $chien
}

Nouvelles syntaxes %hash{...} et %array[...] pour récupérer des listes paire/valeur ou index/valeur. Par exemple :

my %fruits = (pommes => 3, bananes => 5, oranges => 4);
my %sous_ensemble = %fruits{'pommes', 'bananes'};
# %sous_ensemble est maintenant (pommes => 3, bananes => 5)

my @alphabet = "a" .. "z";
my @tableau   = %alphabet[1,3,5];
# @tableau est maintenant (1, "a", 3, "c", 5, "e");

Une nouvelle syntaxe de déréférencement postfixée fait aussi son apparition. Ainsi, par exemple, on pourra écrire :

my $scalar = $scalar_ref->$*;
# même chose que ${ $scalar_ref }, ou $$scalar_ref mais marche
# pour une expression quelconque renvoyant une référence et peut
# s’enchaîner facilement.

et c’est analogue pour les tableaux, les tables de hachage, les fonctions et les globs.

Optimisations

Un nouveau mécanisme de copy-on-write (COW) permet d’éviter d'avoir à passer des chaînes de caractères par référence pour des raisons de performances. En particulier :

my $copy = $str;

n’induit plus de vraie copie de la chaîne $str. La copie sera effective seulement si $copy ou $str est modifiée.

Plusieurs déclarations à la suite :

my $x;
my $y;

sont maintenant optimisées en :

my ($x, $y);

Les return en dernière instruction d’une fonction sont optimisés, c'est-à-dire qu'il n'y a plus de différence de performance entre sub miaou {...; return $chat; } et sub miaou { ...; $chat; }.

D’autres optimisations ont été faites, par exemple dans les regexps, la gestion de l’Unicode, mais aussi autour des tableaux et des tables de hachage.

Documentation

Des nouveautés dans la documentation :

  • Le tutoriel perlopentut, pour ouvrir des fichiers et autres, a été réécrit. Il est maintenant plus court et utilise un style plus moderne ;
  • Un nouveau tutoriel sur l’Unicode a vu le jour, le perlunicook, qui explique les recettes importantes à connaître sur l’Unicode en Perl (il n’était pas dans la 5.20.0 mais a été backporté dans la 5.20.2).

La version 5.22.0

Langage

Perl prend maintenant en charge Unicode 7.0.

Un nouvel opérateur <<...>> apparaît, qui est comme <...>, mais agit comme un open à trois arguments pour les éléments de @ARGV, ce qui évite à un nom comme "|foo" d'être considéré comme une pipe et non comme un nom de fichier.

On peut maintenant créer des alias en affectant à une référence :

\$alias = \$ref;

# un cas peut-être plus parlant :
foreach \%hash (@array_of_hash_refs) { ... }

Avec use re 'strict'; des règles plus strictes peuvent êtres appliquées à l’écriture des regexps, de sorte à détecter d’éventuelles erreurs.

Un nouvel attribut const permet de forcer la compilation immédiate d’une fonction anonyme vers une constante, même si les variables qui apparaissent dans sa déclaration sont modifiées ensuite. Avant, un simple *CONST = sub () { $var } était parfois compilé immédiatement, mais parfois non, par exemple si une autre variable faisait référence au même $var. Cette forme donne maintenant un warning si $var et utilisé après.

Un nouveau modifieur n permet de désactiver les captures dans une regexp, de sorte que (...) devienne un raccourci commode pour (?:...).

Afin d’éviter les confusions entre les opérations bit-à-bit pour les nombres et les chaînes de caractères, avec use experimental "bitwise"; de nouveaux opérateurs bit à bit &. |. ^. ~., qui traitent leurs opérandes comme des chaînes de caractères (faisant une conversion si nécessaire), peuvent être utilisés. Les opérateurs & | ^ ~ traitent alors toujours leurs arguments comme des nombres.

On peut maintenant utiliser l'opérateur de répétition x pour une affectation. Ainsi, (undef, undef, $var) = fun() peut s'écrire ((undef) x 2, $var) = fun().

Optimisations

Les accès aux tableaux et tables de hachage sont plus rapides, en particulier s’ils sont imbriqués ou utilisent des clés constantes ou de simples variables.

Dans une affectation my @array = split, la fonction split écrit maintenant, la plupart du temps, directement sur @array. D'autres fonctions ont connu des optimisations variées.

Modules

Le projet continue à réduire le cœur et certains modules, dont CGI et Module::Build, ainsi que des utilitaires comme s2p et a2p, sont maintenant à installer depuis CPAN (l'annonce de leur retrait futur du cœur avait été fait pour la 5.20).

Évolutions de l’écosystème

Si le langage Perl en soi et sa partie centrale ont connu assez de nouveautés ces dernières années, le CPAN et l’écosystème Perl en général continuent à bouger aussi.

Outre le connu CPAN Search pour chercher des modules de CPAN, il existe maintenant une plateforme alternative au look un peu plus "jeune", metacpan, dont les sources sont sous licence libre et disponibles.

L’ensemble des modules du CPAN peut être installé avec le client en ligne de commande cpan. Depuis quelques années, une alternative plus légère et ne demandant aucune configuration existe : cpanm. Notons aussi l’apparition de perlbrew, un outil permettant de gérer son environnement Perl et, en particulier, de pouvoir passer rapidement d’une version de Perl à une autre et de tester ainsi le code avec plusieurs versions.

Ces outils sont bien sûr surtout utiles pour le développeur : vu que beaucoup de modules CPAN existent sous forme de paquets dans la plupart des distributions, l’utilisateur n’en aura pas besoin a priori.

Une autre nouveauté ces dernières années est l’amplification du code utilisant de nouveaux systèmes objets autre que celui inclus dans Perl. Le plus connu est Moose, qui fournit un système très riche, bien documenté et avec plein de fonctionnalités. Lorsque moins de fonctionnalités sont nécessaires, ou qu’un temps de démarrage plus rapide est important, on peut préférer utiliser par exemple Moo, mais c’est loin d’être la seule alternative. Et rien n’interdit non plus d'en revenir aux origines.

On note aussi dans la communauté une volonté de mettre en avant les évolutions du langage, comme en témoignent des initiatives récentes, telle celle du livre Modern Perl, qui explique la philosophie de la communauté et comment profiter du CPAN, mais aussi la philosophie du langage (expressions idiomatiques, contexte…), et comment en tirer parti.

Et Perl 6 ?

De son côté, Perl 6 avance aussi, et Larry Wall, le père fondateur, a annoncé qu’une première release aurait probablement lieu pour ce Noël (voire cette interview par exemple), fondée sur son implémentation Rakudo et la machine virtuelle MoarVM.

Il s’agira d’une première release, donc en particulier il faut s’attendre à ce que les performances ne soient pas au rendez-vous partout, le langage n’a pas vingt ans d’optimisations accumulées, et ça se sent encore, mais la situation s’est quand même nettement améliorée et certains aspects sont prometteurs. En particulier le JIT de MoarVM et le typage graduel permettent d’optimiser des choses qu’il n'est pas possible d’optimiser en Perl 5. De plus, la Fondation Perl a lancé une levée de fonds pour permettre au développeur principal de Rakudo de consacrer plus de temps à Perl 6 d’ici la première release.

La documentation est un travail en cours, mais commence déjà à ressembler à quelque chose. On est loin d'avoir un vrai CPAN pour le moment, mais un certain nombre de modules ont déjà vu le jour, et la liste s'étend régulièrement.

Aller plus loin

  • # Entretien avec une citrouille

    Posté par  . Évalué à 4.

    À noter qu'avant l'entretien avec Larry Wall a eu lieu celui avec Ricardo Signes, l'actuelle « citrouille » (mainteneur en chef) de Perl 5, où l'on en apprend un peu plus sur le cycle de développement de celui-ci.

    En tous les cas, ça fait bien plaisir de lire cette petite dépêche sur Perl, langage plus très à la mode mais qui reste mon indéboulonnable favori parmi les langages de scripts (d'ailleurs, je n'ai jamais compris comment PHP l'avait détrôné pour le CGI, si quelqu'un a un pointeur ou une explication, je suis preneur), et qui continue d'évoluer tranquillement dans son coin.

    • [^] # Re: Entretien avec une citrouille

      Posté par  . Évalué à 8.

      je n'ai jamais compris comment PHP l'avait détrôné pour le CGI, si quelqu'un a un pointeur ou une explication, je suis preneur

      Il y avait une mauvaise raison : PHP peut nativement servir de langage de template, donc il était facile de transformer une page HTML en page PHP. En Perl, c'est possible (Mason, etc), mais ce n'est ni facile ni usuel.

      L'autre raison est plus acceptable : la facilité de déploiement. Jusqu'à récemment, la norme pour installer un environnement web PHP était d'installer Apache + mod_php, et la configuration par défaut était tout de suite suffisante.

      Par comparaison, le CGI est plus lourd à configurer, plus dangereux, et terriblement lent. Perl propose bien mod_perl mais c'est très différent du mode "chaque requête est autonome", et c'est difficile à utiliser, surtout que mod_perl2 est très peu documenté.

      Aujourd'hui, tout converge vers une architecture de type FASTCGI où le serveur web (Nginx, Apache, etc) joue le rôle de proxy sur les applications. Les frameworks Perl récents (Dancer, Mojolicious) utilisent PSGI (Plack) sur le modèle du WSGI de Python, tout comme PHP promeut php-fpm en remplacement de son module Apache.

      • [^] # Re: Entretien avec une citrouille

        Posté par  (site web personnel) . Évalué à 3.

        On peut ajouter qu'il était facile d'installer PHP au début sous Windows… Click click click, finit.

        Sinon, on pouvait faire du eperl au début du PHP, cela ressemblait comme deux gouttes d'eau au PHP mais avec un vrai langage ! Donc le PHP a vraiment fonctionné principalement grâce à Windows + effet de mode.

        • [^] # Re: Entretien avec une citrouille

          Posté par  . Évalué à 3.

          Donc le PHP a vraiment fonctionné principalement grâce à Windows + effet de mode.

          Encore la marque de Redmond, j'aurais dû y penser ; ces gens-là, décidément, ne respectent rien. ;)

          Merci à vous deux pour ces précisions.

    • [^] # Re: Entretien avec une citrouille

      Posté par  . Évalué à 3.

      d'ailleurs, je n'ai jamais compris comment PHP l'avait détrôné pour le CGI

      La documentation de Perl était disponible dans un affreux programme unix en mode console qui plus est et donc peu de gens y avaient accès sous Windows alors que la doc de PHP était disponible via netscape qui était le navigateur préféré de tout le monde à l'époque, à part bien sûr pour quelques barbus qui utilisaient un truc dans un terminal voire même wget pour se la péter. Peut-être que si les personnes travaillant dans l'informatique et ayant un peu de potentiel avaient moins de problèmes d'ego, le monde de l'informatique serait meilleur. La mauvaise qualité de PHP est également à prendre en compte : à cause, ou grâce à devrais-je peut-être dire, de nombreux bugs, problèmes de design et autres limitations largement documentés ont permis à de nombreux forums et sites de copier/coller de voir le jour (eux-mêmes écrits en PHP). Il a fallu ensuite attendre de nombreuses années pour voir cette écosystème se fragmente aboutissant à notre monde actuel. Les gens aujourd'hui ont largement accepté javascript même si à l'époque, c'était mal. Tellement bien adopté que ça a donné naissance à un nouveau phénomène : AngularJS. Mais bon, c'est une autre histoire…

  • # Parrot

    Posté par  (site web personnel) . Évalué à 1.

    Il y a quelques années on associait me semble-t-il généralement Perl6 avec la VM Parrot. Ce n'est visiblement plus le cas ; en allant sur leur site, il semble pourtant que le projet soit encore bien actif, avec une 7.4.0 sortie il y a 15 jours. Bien que je n'ai jamais trop cru en ce projet, je le trouvais quand même intéressant.

    Quelqu'un aurait-il des informations sur la relation entre les 2 projets du coup ?

    • [^] # Re: Parrot

      Posté par  (site web personnel) . Évalué à 3. Dernière modification le 06 juin 2015 à 17:07.

      Actuellement, Parrot n'est plus très actif, je crois, même si une version nouvelle sort tous les mois. Mais, le fait est que, dans le but de sortir une version de Perl 6 plus rapidement, et effectuer certains changements qui demanderaient des adaptations dans Parrot, ce dernier n'est plus pris en charge par Rakudo depuis quelques mois. Sur le site de Rakudo il y a un article qui explique les raisons de ce choix mieux que je ne pourrais. Mais, si j'ai bien compris, rien ne dit que, dans le futur, Parrot ne sera pas repris en charge à un moment, ce ne sera juste pas le cas pour cette année, par manque de temps et de ressources humaines.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.