Perl, langage d'aujourd'hui et de demain

Sébastien Aperghis-Tramoni, sebastien@aperghis.net

Perl

  • Practical Extraction and Report Language

  • langage interprété et dynamique

  • libre : GNU GPL et Artistic License

  • créé en 1987 par Larry Wall

Larry Wall

  • Caractéristiques :

    • lunettes carrées

    • moustache

    • chemise hippie

Perl - Historique

  • Perl 1.000 - 1987

  • Perl 3.000 - 1989

  • Perl 4.000 - 1991

  • Perl 4.036 - 1993

Perl - Historique

  • Perl 5.000 - 1994

  • Perl 5.001 - 1995

  • Perl 5.002 - 1996

  • Perl 5.003 - 1996

  • Perl 5.004 - 1997

  • Perl 5.005 - 1998

Perl - Historique

  • Perl 5.6 - 2000

  • Perl 5.8 - 2002

Perl - Caractéristiques

  • à l'origine, langage de glue

  • intermédiaire entre le shell, awk, sed d'un côté et C de l'autre

  • ajouts de langages fonctionnels comme Lisp

  • maintenant, langage dynamique généraliste

  • extrêmement portable

  • très stable

Perl - Points forts

  • multi-paradigmes : impératif, fonctionnel, orienté objet

  • types de base : scalaire (chaîne, nombre), tableau, hash

  • gestion de mémoire par ramasse-miettes

  • expressions régulières

  • OO : surcharge d'opérateur, fermetures

  • Unicode

  • threads

Perl - Points faibles

  • faiblement typé

  • très (trop) permissif

  • paradigme objet très (trop) simple

  • ramasse-miettes par comptage de références

  • syntaxe devenue lourde pour certaines opérations

CPAN

  • Comprehensive Perl Archive Network

  • collection centralisée et distribuée de modules

  • http://www.cpan.org/

  • 4.0 Go, plus de 12500 modules, plus de 6000 auteurs

  • 253 miroirs

CPAN

  • « CPAN is the language, Perl is just its syntax » - Audrey Tang

  • véritable richesse de Perl

CPAN - Sélection

  • XML

    • XML::LibXML, XML::LibXSLT, XML::Twig, XML::SAX

    • XML::Simple, XML::Tiny

  • sérialisation

    • Storable

    • YAML, YAML::Syck, YAML::XS, YAML::Any

    • JSON, JSON::Syck, JSON::XS, JSON::Any

CPAN - Sélection

  • courriel

    • MIME::Lite, MIME::Parser, Mail::Box

    • Email::Simple, Email::MIME, Email::Folder et tous les modules du Perl Email Project

    • Net::SMTP, Net::POP3, Net::IMAP, IMAP::Admin

CPAN - Sélection

  • web

    • LWP::UserAgent, LWP::Simple

    • HTTP::Daemon, HTTP::Server::Simple, HTTP::Server::Brick

  • HTML

    • HTML::Parser, HTML::TreeBuilder, HTML::PrettyPrinter, webService::Validator::HTML::W3C

CPAN - Sélection

  • protocoles réseau

    • Net::FTP, Net::SSH, Net::SCP, Net:LDAP, Net::NNTP, Net::RADIUS, Net::TacacsPlus, Net::SIP

    • Net::DNS, Net::Ping, Net::DHCP

  • réseau bas niveau

    • Net::Pcap, Net::Frame, Net::Packet

CPAN - Sélection

  • bases de données

    • DBI

    • MySQL, PostgreSQL, SQLite, Oracle, JDBC, ODBC, Sybase, ADO DB, Unify et encore plus...

    • DBI::Proxy, DBD::Gofer

    • DBIx::Simple

CPAN - Sélection

  • ORM

    • Class::DBI, DBIx::Class

    • Tangram, Alzabo, Rose::DB::Object, DBIx::DataModel

CPAN - Sélection

  • templates

    • HTML::Template, Petal, Mason, Template Toolkit

  • frameworks web modernes

    • Maypole, Catalyst, Jifty

CPAN - Sélection

  • langages

    • Inline : C, Java, Python, Ruby, Tcl, Befunge, Lua

  • bibliothèques externes

    • XS

    • SWIG

    • P5NCI

CPAN - Sélection

  • interfaces graphiques

    • Tk, Gtk, WxWidgets, Qt, Prima

    • GUI natives : Win32, Aqua (Mac OS X), X11

  • images

    • GD, Image::Magick, Gimp, Imager

  • archivage

    • Archive::Tar, Archive::Zip, Compress:Zlib, Compress:Bzip2

Applications connues

  • Rational ClearCase (gestion de configuration) et ClearQuest

  • SysTran (logiciel de traduction linguistique)

  • Request Tracker, OTRS, Bugzilla (gestionnaires de bugs)

  • SlimServer (logiciel pilotant les systèmes musicaux sans fil de Slim Devices / Logitech)

Applications connues

  • Movable Type (plateforme de publication pour entreprises)

  • Blosxom (blog et gestion de contenu)

  • Koha (gestion de bibliothèque)

  • TWiki, Kwiki, MojoMojo (wikis)

  • SVK (système de contrôle de version)

  • Swish-e, Plucene (moteurs d'indexation)

Applications connues

  • Sympa (gestionnaire de listes de diffusion)

  • SpamAssassin (filtre courriel)

  • Open Webmail

  • Webmin (administration de systèmes par interface web)

  • DrakX, Urpmi (installation et gestion des paquets sous Mandriva)

  • BackupPC (sauvegarde)

  • Frozen-Bubble (jeu d'arcade)

Utilisateurs

  • sites web :

    • Amazon, eBay, Price Minister, ShopZilla, Ticket Master, Booking, IMDb, Yahoo!, Slashdot, Live Journal, Friendster, Flickr, Google

  • banques :

    • Citigroup, Morgan Stanley, Deutshe Bank, Bank of America, UBS (Union de Banques Suisses), BNP Paribas

Utilisateurs

  • médias :

    • AFP (Agence France Presse), BBC

  • organismes gouvernementaux :

    • NASA, ESA, Météo France, Institut Météorologique Norvégien

  • opérateurs et associés :

    • France Télécom - Orange, Free Télécom, Vodafone, Sifira, OVH, Gandi, VeriSign

Le futur

  • une version majeure : Perl 5.10

  • un nouveau langage : Perl 6

Perl 5.10

  • très (trop) longtemps en développement

  • à cause de la stabilité de Perl 5.8

  • disponible d'ici très peu de temps

  • « After lunch, before Christmas »

Perl 5.10

  • plusieurs parties internes restructurées

  • ajout de protections préventives

  • consommation mémoire moindre

  • moteur d'expressions régulières dérécursé

  • certaines fonctionnalités de Perl 6

Perl 5.10 - Syntaxe

  • defined-or

    • avant : $a || $b

    • et si $a == 0 ? => incorrect

    • d'où : defined $a ? $a : $b

    • maintenant : $a // $b

    • et surtout : $var //= $default

Perl 5.10 - Syntaxe

  • tests sur les fichiers empilables

    • avant : -f $file and -w $file

    • maintenant : -f -w $file

Perl 5.10 - Syntaxe

  • smart match

    • opérateur ~~

    • permet de comparer magiquement

    • cf. perlsyn

Perl 5.10 - Syntaxe

  • smart switch

    • basé sur le smart match

  •     given ($var) {
            when (undef)  { say '$var non défini' }
            when (@array) { say '$var est dans @array' }
            when (%hash)  { say '$var est une clé de %hash' }
            when (\&code) { say 'code($var) est vrai' }
            when (qr/../) { say '$var correspond à la regexp' }
            default       { ... }
        }

Perl 5.10 - Syntaxe

  • variable d'état

    • comme les variables static en C

    • state $var

  •     sub callback {
            state $counter = 100;
            ...
        }

Perl 5.10 - Syntaxe

  • nouveautés non activées par défaut

  • use features

  • use features ':5.10' pour toutes les activer

  • ainsi que use 5.010

  • ainsi que perl -E ...

Perl 5.10 - Regexp

  • Perl à la traîne derrière PCRE

  • intégration de leurs fonctionnalités

  • ajout de nouvelles

  • correction de bugs

Perl 5.10 - Regexp

  • moteur dérécursé

  • optimisations : trie, Aho-Corasick

  • moteur interchangeable

Perl 5.10 - Regexp

  • quantifieurs possessif : ?+, *+, ++, {n,m}+

  • comme le quantifieur avide, mais ne rend jamais

  • exemple : "aaaa" =~ /a++a/ échoue

Perl 5.10 - Regexp

  • buffers de capture

  • nouvelle manière de référencer : \g{n}

  • avant : /(\w+) \1/

  • maintenant : /(\w+) \g{-1}/

Perl 5.10 - Regexp

  • buffers de capture nommés

  • stockés dans %+ (dernière capture) et %- (toutes les captures)

  • exemple :

        /(?<name> \w+) = (?<value> \w+)/;
        $name  = $+{name};
        $value = $+{value};

Perl 5.10 - Regexp

  • nouveaux verbes de contrôle du retour arrière (backtracking)

  •     (*FAIL)		
        (*ACCEPT)		
        (*PRUNE)    (*PRUNE:NAME)	
        (*MARK)     (*MARK:NAME)    (*:NAME)
        (*SKIP)     (*SKIP:NAME)	
        (*THEN)     (*THEN:NAME)	
        (*COMMIT)   (*COMMIT:NAME)

Perl 5.10 - Regexp

  • moteur interchangeable

  • islandais fou : Ævar Arnfjörð Bjarmason

  • re::engine::PCRE

  • re::engine::POSIX

  • re::engine::Plan9

  • re::engine::TRE

Perl 5.10 - Objets

  • objets inversés (inside-out objects)

  • existent déjà sur le CPAN : Class::Std, Class::InsideOut, Object::InsideOut

  • mais meilleur support grâce à Hash::Util::FieldHash

Perl 5.10 - Objets

  • ordre de résolution des méthodes (MRO)

  • auparavant fixe, par profondeur

  • maintenant modifiable

  • algorithme de linéarisation C3 (Dylan, Python)

  • aussi disponible pour Perl 5.8 avec Class::C3

Perl 5.10 - Portabilité

  • meilleur support Win32

  • meilleur support OpenVMS

  • meilleur support MVS / OS/390 / z/OS

  • support Cray XT4/Catamount

Perl 5.10 - Divers

  • user lexical pragma

  • prototype _

  • my $_

  • variables lexicales plus rapides

  • Unicode 5.0.0

  • opérations UTF-8 plus rapides

  • constantes plus économes en mémoire

  • ...

Perl 5.12

  • cycle de développement plus court que pour 5.10

  • probablement 2-3 ans

  • fonctionnalités prévues :

    • abstraction du système de fichiers pour support Unicode

    • extension des nouveaux opérateurs comme state

Perl 6

  • véritablement un nouveau langage

  • nouvelles inspirations : Ruby, OCaml, Haskell

  • compilateur Perl 6 écrit en Perl 6

  • compilé en bytecode

  • exécuté sur une machine virtuelle, Parrot

Parrot

  • machine virtuelle générique

  • portabilité de Perl

  • optimisée pour écrire des compilateurs pour langages dynamiques

  • langage d'assemblage cohérent, sans bizarreries dues à l'architecture

    • voir les articles publiés dans Linux Magazine France n°97, 98 et 99

Perl 6

  • fondamentaux de Perl

    • stabilité

    • longévité

  • Perl 5 utilisé depuis plus de 12 ans

  • Perl 6 conçu pour durer autant

  • pas d'urgence, Perl 5 stable

Perl 6

Conclusion

  • langage mature

  • Perl 5.8 stable

  • Perl 5.10 taillé pour les performances et la production

  • Perl 6 d'ici quelques années

Questions ?

Merci