Valid XHTML     Valid CSS2    

Langages de scripts, automatisation de commandes et

production de documents structurés

                     gilles.hunault "at" univ-angers.fr

 

Table des matières cliquable

1.

Langages de scripts versus "grands" langages

 exercices corrigés 

2.

Les précurseurs : Awk et Rexx

 exercices corrigés 

3.

La relève : Perl et Tcl/Tk

 exercices corrigés 

4.

Le web classique : Php et Javascript

 exercices corrigés 

5.

La «nouvelle garde» : Python et Ruby

 exercices corrigés 

6.

Production automatique de documents structurés

 exercices corrigés 

 

1. Notion de langages de scripts versus "grands" langages

1.1 Quelques traitements vite faits, bien faits

Imaginez que vous vouliez calculer la valeur de 2 puissance 11 ou numéroter en continu les lignes des fichiers langages1.txt et langages2.txt ou extraire la liste triée du premier mot de chaque ligne non vide du fichier langages2.txt sachant qu'il s'agit d'une tâche «volatile». Ou encore que vous vouliez comparer de façon synoptique le contenu des deux fichiers-texte v417.r et v461.r. Quel outil, quelle commande, quel logiciel ou quel langage de programmation utiliseriez-vous pour cela ? De même, et il s'agit là de tâches plus "routinières", et si vous vouliez régulièrement archiver de façon incrémentale tous les fichiers XML d'un répertoire, ou passer rapidement d'un répertoire à l'autre, sachant que vous utilisez plusieurs machines avec des systèmes d'exploitation différents ? Là encore, quel langage de programmation, quel outil, logiciel ou commande utiliseriez-vous pour cela ?

Voici quelques éléments de réponses en ligne de commande, sans passer par un fichier-programme, pour réaliser les actions proposées.

Pour calculer la valeur de 2 puissance 11, on peut utiliser Perl en mode one-liner, pour numéroter en continu les lignes des fichiers indiqués, on peut utiliser gawk :


     perl -e ' print 2**11 . "\n" '
     # mais pas perl -e " print 2**11 . '\n' "
     
     gawk ' { print FILENAME , NR , $0 } ' langages1.txt langages2.txt
     # mieux :
     #  gawk ' { printf FILENAME ; printf(" %03d ",FNR) ; printf(" %3d ", NR) ; print } ' langages1.txt langages2.txt
     
     gawk ' (NF>0) { print $1 } ' langages1.txt langages2.txt | sort
     
     

La vérification de l'exécution de ces commandes est immédiate :


     @ghchu~/public_html/Scripts|(~gH) >  perl -e ' print 2**11 . "\n" '
        2048
     
     @ghchu~/public_html/Scripts|(~gH) >  gawk ' { print FILENAME , NR , $0 } ' langages1.txt langages2.txt
        langages1.txt 1 Awk
        langages1.txt 2 Javascript
        langages1.txt 3 Perl
        langages1.txt 4 Php
        langages1.txt 5 Python
        langages1.txt 6 R
        langages1.txt 7 Rexx et Orrex, NetRexx
        langages1.txt 8 Ruby
        langages1.txt 9 Tcl
        langages1.txt 10 Tk
        langages2.txt 11 Apl
        langages2.txt 12
        langages2.txt 13 C et C++
        langages2.txt 14
        langages2.txt 15 Dbase
        langages2.txt 16 Fortran
        langages2.txt 17 Java
        langages2.txt 18 Lisp
        langages2.txt 19 Logo
        langages2.txt 20 Prolog
        langages2.txt 21 Scala
        langages2.txt 22 Smalltalk
     
     @ghchu~/public_html/Scripts|(~gH) > gawk ' { printf FILENAME ;
                                                  printf(" %03d ",FNR) ;
                                                  printf(" %3d ", NR) ; print
                                                } ' langages1.txt langages2.txt
        langages1.txt 001    1 Awk
        langages1.txt 002    2 Javascript
        langages1.txt 003    3 Perl
        langages1.txt 004    4 Php
        langages1.txt 005    5 Python
        langages1.txt 006    6 R
        langages1.txt 007    7 Rexx et Orrex, NetRexx
        langages1.txt 008    8 Ruby
        langages1.txt 009    9 Tcl
        langages1.txt 010   10 Tk
        langages2.txt 001   11 Apl
        langages2.txt 002   12
        langages2.txt 003   13 C et C++
        langages2.txt 004   14
        langages2.txt 005   15 Dbase
        langages2.txt 006   16 Fortran
        langages2.txt 007   17 Java
        langages2.txt 008   18 Lisp
        langages2.txt 009   19 Logo
        langages2.txt 010   20 Prolog
        langages2.txt 011   21 Scala
        langages2.txt 012   22 Smalltalk
     
     @ghchu~/public_html/Scripts|(~gH) > gawk ' (NF>0) { print $1 } ' langages1.txt langages2.txt | sort
        Apl
        Awk
        C
        Dbase
        Fortran
        Java
        Javascript
        Lisp
        Logo
        Perl
        Php
        Prolog
        Python
        R
        Rexx
        Ruby
        Scala
        Smalltalk
        Tcl
        Tk
     

Pour visualiser la comparaison de deux fichiers, le mieux est sans doute d'utiliser TkDiff qui se réduit à un seul script Tcl/Tk nommé tkdiff.tcl. Il y aussi tkdirdiff qui compare bien sûr deux répertoires.


    wish tkdiff.tcl v417.r v461.r & 

Voici une partie de la fenêtre d'exécution de TkDiff :

 

tkdiff.png

 

Si les langages Perl, Awk et Tcl/Tk réalisent bien ces tâches, c'est parce qu'ils ont été conçus pour cela. En effet, les langages de scripts sont apparus dès le début des ordinateurs pour enchainer et compléter les commandes système, même s'ils ont évolué ensuite vers des besoins plus spécifiques. C'est pourquoi ils sont en général "imbattables" en termes de concision d'écriture : ils sont «prévus pour». C'est aussi ce qui a entraîné une certaine «guerre des langages de programmation» (comme C versus Java, langage de scripts versus "grand langage", Perl versus Ruby ou Python...) qui n'est pas sans rappeler la «guerre des éditeurs de texte» (vi est le meilleur, emacs est le meilleur, eclipse est le meilleur, etc.) et la «guerre des navigateurs» (Firefox est le meilleur, Chrome est le meilleur, Internet Explorer est le meilleur, etc.).

Nous n'entrerons pas ces polémiques car elles sont en général stériles. La question quel est le meilleur langage de programmation ? est aussi stupide que la question quelle est la meilleure voiture ? Sans critère objectif de comparaison (modularité, vitesse d'exécution, concision...), la plupart des comparaisons ne sont pas pertinentes. De plus, souvent, les sondés ne connaissent que deux ou trois langages, d'où une vision incomplète, imparfaite, aboutissant à des réponses biaisées et partiales. Enfin, pour conclure ce débat, s'il y avait vraiment un langage meilleur que les autres, vu les intérêts économiques en jeu, cela se saurait... Toutefois, nous vous conseillons de vous pencher sur Scala comme successeur possible de Java, mais pas de regarder le langage Go...

Nous prenons plutôt ici le parti de présenter (un peu trop rapidement ?) de nombreux langages, avec une mise en avant de leurs points forts et parfois de leurs inconvénients. De la même façon qu'un conducteur utilise la plupart du temps sa propre voiture mais prend aussi de temps en temps le train, l'avion ou une autre voiture, nous essaierons de montrer comment réaliser le plus rapidement possible certains traitements pour des applications qui ne sont pas de [trop] grande taille. Au lecteur et à la lectrice de choisir ensuite si cela vaut le coup pour lui ou pour elle d'utiliser tel ou tel langage pour telle ou telle tâche...

1.2 Les langages de scripts : un peu de culture

Un langage de scripts se démarque en général des grands langages de programmation comme C, C++, Java par le fait qu'il est souvent interprété, typé dynamiquement, avec une syntaxe adaptée à des traitements «aggressifs», de certaine structures de données. On peut très souvent les exécuter en mode interactif pour tester telle ou telle fonctionnalité, ou s'en servir comme nouveau "shell de commandes". Les premiers langages de scripts ont été liés directement aux systèmes d'exploitation pour lier les commandes entre elles et pour dialoguer avec l'utilisateur. Au fil du temps, ils ont évolué pour devenir des langages non couplés directement aux systèmes d'exploitation, ce qui passe souvent par une non-compilation, ce qui est à la fois un point fort (on transmet le fichier-programme et c'est tout) et un point faible (vitesse d'exécution parfois inférieure), même si les «nouvelles générations» sont C/JIT (compile/just in time).

Définis originalement dans un but précis (comme la mise en forme de rapport pour Perl), ils sont souvent devenus des langages généralistes soutenus par des fortes communautés qui proposent des spécialisations intéressantes (comme BioPerl par exemple ). Les "derniers langages" comme Ruby et Python bénéficient bien sûr de l'expérience des autres langages et ils ont «bien sûr » été inventés pour pallier aux faiblesses des autres... mais en en rajoutant d'autres.

Certains langages, au demeurant fort intéressants semblent avoir disparu, ou rester la "niche" de certains fanatiques ou de certains spécialistes, comme pour Apl, Forth, Logo, Prolog... Par contre certains langages de scripts se sont installés dans des lieux incontournables, comme Maple et Mathematica pour le calcul mathématique formel et appliqué, par exemple, même s'ils sont payants. Car une des caractéristiques des premiers langages de scripts était d'être gratuits, ce qui à l'époque était une nouveauté... De même, le langage R est le langage de scripts gratuit qui s'est imposé depuis le début des années 2000 comme langage gratuit, performant pour les statistiques malgré le "monstre" très payant SAS... Il lui est même très supérieur dès qu'il s'agit de graphiques et de bioinformatique...

Un langage sans doute trop précoce est Tcl et son fameux compère Tk qui n'ont jamais eu le succès escompté, peut-être en raison d'une syntaxe trop différente, comme Apl, en son temps... Pourtant Tk (vous avez dit GTK ?) était presque parfait pour écrire de petites interfaces graphiques, avec Tcl comme langage de support. Heureusement, il est devenu le support standard des interfaces graphiques pour Python et Ruby.

Les premiers langages de scripts ne connaissaient pas la notion de programmation objet, avaient des mécanismes de sous-programmes un peu rudimentaires, ne savaient pas interfacer les bases de données et, à l'époque, le Web n'existait, pas plus que les «*p» (Php, Asp, Jsp) ou Unicode/UTF. Aujourd'hui (2016), les derniers langages de scripts sont les "champions" de ces domaines d'application. Nous passerons donc des premiers langages, simples et efficaces, mais parfois incomplets comme Awk et Rexx à des langages plus évolués, comme Perl, Ruby et Python, sans oublier les incontournables Php et Javascript qui peuvent même s'exécuter en ligne de commande, ce que tout le monde ne connait pas forcément.

Voici quelques exemples choisis en session interactive :


     @ghchu~/public_html/Scripts|(~gH) > regina rt.rex
     
     REXX-Regina_3.3(MT) 5.00 25 Apr 2004
     REXX statements / exit / <enter> :
     
     Rexx> a = "ls "
     
     Rexx> b = " *.xml"
     
     Rexx> say a b
     ls   *.xml
     
     Rexx> c = a b
     
     Rexx> say length(c)
     10
     
     Rexx> say words(c)
     2
     
     Rexx> c
     langages.xml
     
     Rexx> a "-alt " b
     -rw-r--r-- 1 gh gh 211 2012-11-10 15:34 langages.xml
     
     Rexx>say 2**16
     65536
     
     Rexx> say d2x(32)
     20
     
     Rexx> say c2x("A")
     41
     
     Rexx> liste = " 10 12 25 8 "
     
     Rexx> say wordpos("25",liste)
     3
     
     Rexx> do i = 1 to 10 ; say random() ; end
     689
     401
     948
     377
     848
     225
     127
     931
     849
     410
     
     Rexx> cmd = " monprog -opt val1 nomfic "
     
     Rexx> parse var cmd nomprog . option fichier
     
     Rexx> say option
     val1
     
     Rexx> exit
     
     

     @ghchu~/public_html/Scripts|(~gH) > perl pt.pl
     
     (gH) 2001 -- cli.pl
     
        ## taper vos instructions perl sur une seule ligne
        ## il faut parfois utiliser 2 fois la touche "up"
        ## pour rappeler les commandes précédentes...
        ## (on quitte par ^C, par <ENTER> ou par exit ;)
     
     perl> $nom = "Pierre " ;
     Pierre
     
     perl> $age = 20 ;
     20
     
     perl> print " $nom a $age ans " ;
     Pierre  a 20 ans
     
     perl> print ' $nom a $age ans ' ;
     $nom a $age ans
     
     perl> @a = (1,"oui",4) ;
     3
     
     perl>  @b = @a ;
     3
     
     perl>   $c = @a ;
     3
     
     perl>  $d = $a ;
     
     perl>  $e = $#a ;
     2
     
     perl> foreach (@a) { print $_ }
     1oui4
     
     perl> exit
     
     

     $gh> php -a
     Interactive shell
     
     php > echo pow(16,4) ;
     65536
     
     php> $a = 2012 % 128 ;
     php> $b = sprintf("%x", ord("A") ) ;
     php> $c = hexdec("FFF") ;
     php> $d = ord("a") ;
     php> $e = chr(98) ;
     php> echo "$a $b $c ".$d." $e\n" ;
     92 41 4095 97 b
     
     php> $cmd = "prog --fmt tex --nbdec 4 --fichier demo.rex" ;
     php> preg_match("/--fmt (.*?) /",$cmd,$res) ;
     php> echo $res[1]."\n" ;
     tex
     
     php> $phr = "A2837 12 18 37 25" ;
     php> $tn = preg_split("/\s+/",$phr) ; # car split(" ",$phr) est "deprecated"
     php> unset($tn[0]) ;
     echo join(" ",$tn) ;
     12 18 37 25
     
     php> $f = 1 ;
     php> for ($i=2;$i<=8;$i++) { $f *= $i ; } ; echo $f ;
     40320
     
     php> date_default_timezone_set('UTC');
     php> $dt = date("d/m/Y h:i") ;
     php> echo $dt."\n" ;
     29/11/2012 02:28
     
     php> $lv = "12 5 20 8 15" ;
     php> $tv = preg_split("/\s+/",$lv) ;
     php> $s  = 0 ;
     php> foreach ($tv as $v) { $s += $v ; } ; $s /= count($tv) ;
     php> echo $s ;
     12
     
     php> quit
     
     

     R version 2.15.2 (2012-10-26) -- "Trick or Treat"
     Copyright (C) 2012 The R Foundation for Statistical Computing
     ISBN 3-900051-07-0
     Platform: x86_64-pc-linux-gnu (64-bit)
     
     R est un logiciel libre livré sans AUCUNE GARANTIE.
     Vous pouvez le redistribuer sous certaines conditions.
     Tapez 'license()' ou 'licence()' pour plus de détails.
     
     R est un projet collaboratif avec de nombreux contributeurs.
     Tapez 'contributors()' pour plus d'information et
     'citation()' pour la façon de le citer dans les publications.
     
     Tapez 'demo()' pour des démonstrations, 'help()' pour l'aide
     en ligne ou 'help.start()' pour obtenir l'aide au format HTML.
     Tapez 'q()' pour quitter R.
     
     > v <- rbinom(100,8,0.4)
     
     > v <- rbinom(n=100,size=8,prob=0.4)
     
     > head(v)
     [1] 3 1 1 5 6 3
     
     > tail(v,n=10)
      [1] 3 4 5 3 5 3 4 5 4 4
     
     > table(v)
     v
      0  1  2  3  4  5  6  7
      1  7 21 27 21 17  5  1
     
     > cbind(length(v), mean(v), sd(v) )
          [,1] [,2]     [,3]
     [1,]  100 3.36 1.403603
     
     > hist( ## ici on a appuyé sur la touche tab
     x=                xlab=             start.on.monday=  include.lowest=   angle=            main=             ylab=             nclass=
     ...=              plot=             format=           right=            col=              xlim=             axes=             warn.unused=
     breaks=           freq=             probability=      density=          border=           ylim=             labels=
     
     
     > w <- rbinom(n=100,size=5,prob=0.8)
     
     > boxplot(as.data.frame(cbind(v,w)),col="yellow")
     
     > library(beanplot)
     
     > png(filename="demo_r.png",width=1200,height=800)
     
     > beanplot(
       as.data.frame(cbind(v,w)),
       main="cours scripts",
       col = c("#CAB2D6", "#33A02C", "#B2DF8A"),
       border = "#CAB2D6"
     ) # fin de beanplot
     
     > dev.off()
     X11cairo
            2
     
     > source("~/Bin/statgh.r",encoding="latin1")
     (gH) version  4.61
     fonctions d'aides : lit() fqt() fql() ic() fapprox() chi2() fcomp() datagh()
     taper aide() pour revoir cette liste
     
     > histoQT( ## ici on a appuyé sur la touche tab
     titreQT=    vecteurQT=  unite=      grfile=     lang=       maxhist=    rug=
     
     > histoQT("demo lang. scripts",v," euros ","demo2.png","FR",0.31,T)
     
     > quit()
     Save workspace image? [y/n/c]: n
     
     @ghchu~/public_html/Scripts|(~gH) >
     

Vous pouvez cliquer sur les images produites par ce script R pour les aggrandir :

demo_r_1.png demo_r_2.png demo_r_3.png

 
           exercices corrigés 

 

2. Les précurseurs : Awk et Rexx

2.1 Le langage AWK

AWK apparait sans doute vers 1977. Ecrit pour filtrer et extraire des données des commandes Unix, il devient vite un langage apprécié des développeurs C (dont il partage un des auteurs) et des développeurs système puisqu'il utilise la même syntaxe de base que le C... sans les pointeurs ! Basé sur le schéma condition/action, il évolue assez rapidement pour inclure les expressions régulières et les tableaux associatifs. Bien adapté aux "petits programmes", il peut être compilé ou traduit en C dans certaines conditions. Sous Windows, dans les années 90 TAWK prend le pas sur Awk avant de disparaitre au profit de Gawk (avec le G de GNU). De par sa spécialisation à traiter des paquets de fichiers-texte, il reste toujours très apprécié et très utilisé pour des traitements ponctuels et ciblés.

AWK : points forts

AWK est facile à apprendre et permet de découvrir la syntaxe de base du C. Il sait traiter avec le même code tous les fichiers passés en ligne de commande, il peut s'écrire en pas-à-pas et peut fonctionner en mode one-liner. Avec ses tableaux associatifs, ses variables prédéfinies et le support des expressions régulières, il est assez complet pour de petites applications en mode texte, bien que les sous-programmes soient parfois un peu rudimentaires.

AWK : points faibles

AWK ne connait ni le Web ni les objets et ne dispose pas de bibliothèques de composants. Il n'y a pas de mode interactif, sauf à "bricoler" mais cela ne présenterait pas beaucoup d'intérêt puisqu'un programme Awk ne peut pas exister sans au moins un fichier de données.

Documents à lire :

2.2 Le langage REXX

REXX date du début des années 1980. Conçu au départ comme langage de shell pour mainframe IBM au niveau du système d'exploitation et des applications, il devient dès 1984 un langage de commandes pour PcDos, alors concurrent de MsDos sous le nom Personal REXX. Les idées de départ de son créateur, M. Colishaw étaient : lisibilité, simplicité, portabilité car à l'époque, même si Windows et le Web n'existaient pas, il fallait des passerelles entre les gros ordinateurs IBM et les premiers PC. Il avait aussi alors un role de langage complémentaire pour programmer des macros afin de personnaliser l'éditeur (le seul éditeur !) nommé XEDIT d'IBM pou VM/SP, Kedit pour Windows, Sedit (multi-os). Object REXX, démarré en 1988, fut vraiment opérationnel en 1996 comme le fut ANSI REXX, et, à peu près à la même période, NetREXX qui inclut la JVM. Une version de REXX pour GNU est regina et l'éditeur THE connu aussi sous le nom de Hessling Editor, est programmable en REXX.

REXX : points forts

REXX/Regina est très facile à apprendre. Les blocs de commande sont tous encadrés par do/end qui sert aussi pour les boucles. Son vocabulaire est simple et court (if, say, parse...). Il y a peu de mots, chaque commande (y compris celle de l'environnement sous-jacent, système d'exploitation, éditeur ou application) peut être testée via son code-retour. Les tableaux utilisent une syntaxe avec un point et sont nativement associatifs (mais sans parcours explicite). Le mécanisme de sous-programme, de variable globale/locale est là encore simple et facile à maitriser, mais peu sophistiqué. Le fait que REXX transmette directement à l'environnement toute commande qui ne commence pas par un mot-clé en fait un langage adapté aux interfaces ligne de commande. Non lié aujourd'hui à IBM, on peut l'utiliser sous Dos/Windows, Mac/Os et Linux comme langage fédérateur et unifié de commandes, plutôt que d'utiliser les batch de Dos et bash, par exemple.

REXX : points faibles

Rexx ne sait pas gérer les expressions régulières (mais dispose avec parse d'un petit analyseur syntaxique), l'arithmétique étendue ne prend pas en compte de fonctions mathématiques sophistiquées. Il n'y a aucune fonction mathématique prévue pour les réels. De par sa conception, REXX ne connait ni les bases de données ni le Web, pas plus que les objets ou XML.

Documents à lire :

 
           exercices corrigés 

 

3. La relève : Perl et Tcl/Tk

3.1 Le langage Perl

PERL fut créé par L. Wall en 1987, soit 10 ans après Awk. Prévu au départ pour bien formater des rapports, son créateur L. Wall voulait en faire un langage rapide à écrire, pas forcément très lisible. Du coup, il multiplie les variables prédéfinies, et pense à des syntaxes compactes. Encouragé par une communauté de développeurs qui communiquent avec lui par mail, de nombreux modules -- plus de 23300 modules en janvier 2013 -- et un système centralisé d'archives (CPAN) assurent une forte popularité à Perl qui devient vite un standard de développement rapide. Sa philosophie timtowtdi montre qu'on n'est pas obligé d'être un "perl-mongueur" pour développer en Perl.

Perl : points forts

Bien conçu au départ pour être court à écrire, Perl est effectivement compact. Sa communauté et son grand nombre de modules en font un outil très agréable à utiliser. Les primitives de Perl, écrites en C et peu nombreuses, assurent une grande vitesse d'exécution et des performances très intéressantes pour des applications sur de gros volumes de données, par exemple pour le traitement de données génomiques en bioinformatique des années 2015...

Perl : points faibles

Si Perl est facile à lire, il est difficile à relire avec ses sigils et ses variables à une lettre. De plus la syntaxe des fonctions et des appels de fonctions n'est pas toujours facile à comprendre quand on est habitué(e) à d'autres langages. Enfin, le paradigme objet n'est pas bien traité en Perl 5. Heureusement Perl 6 vient (viendra ?) y remédier.

Documents à lire :

3.2 Les langages Tcl et Tk

Tcl/Tk a été conçu dès 1988 par J. Ousterhout. La partie script standard (Tcl) n'a jamais été reconnue comme un langage très populaire ou performant. Par contre la partie graphique (Tk) avec son interpréteur interactif nommé wish a dès le départ beaucoup plu pour développer de petites applications graphiques et pour interfacer graphiquement et rapidement les commandes des OS. Il y avait à une certaine époque un plugin Tcl/Tk pour navigateur qui aurait du révolutionner les applications Web, mais c'était sans doute trop tôt... Tk reste toujours très présent (en 2012) notamment parce que Python et Ruby l'ont choisi comme support d'interfaces graphiques.

Tcl/Tk : points forts

Tcl dispose de nombreuses fonctions et, comme Rexx, est capable de tout traiter soit comme des caractères soit comme des listes de mots. Le très gros avantage de Tk est d'être disponible sur tous les OS et de s'interfacer avec tous les autres langages de scripts. Il y a ainsi rexx tk, perl tk, python tk nommé aussi tkinter et ruby tk. Il est à noter que Tk est considéré comme l'extension naturelle de Python et Ruby pour écrire des GUI.

L'installation standard de Tk fournit de nombreuses applications facile à étendre. Tk est lui-même étendu en Tix.

Tcl/Tk : points faibles

La syntaxe de Tcl a de quoi rebuter au début puisqu'elle se démarque de presque toutes les autres. De plus utiliser les crochets pour les fonctions est très "perturbant" pour les programmeurs "classiques".

Documents à lire :

 
           exercices corrigés 

 

4. Le web classique : Php et Javascript

4.1 Le langage PHP

Conçu en 1994 puis réécrit en 1997, PHP est initialement destiné uniquement au Web et c'est le premier langage qui est dédié à la programmation de scripts coté serveurs, contrairement aux autres langages de scripts (mais qui pouvaient et peuvent encore quand même s'utiliser en mode CGI sur le serveur). Orienté gestion de données issues de formulaires et capable de se connecter à tous les systèmes de bases de données, Php s'impose vite commme LE langage du Web malgré quelques faiblesses, au point que les systèmes AMP (serveur Apache, Mysql, Php) deviennent un standard d'installation de serveurs Web. Complété par de nombreuses librairies, notamment pour le e-commerce et XML, et avec une prise en charge de la programmation objets et d'un interpréteur en ligne de commandes (cli), PHP n'est paradoxalement plus guère développé, malgré une annonce de Php 6... dès 2006, alors qu'il reste sans doute encore en 2015 le langage le plus utilisé au monde pour les scripts coté serveurs.

PHP : points forts

Php s'installe facilement et peut même fonctionner sous Windows sans installation (par exemple sur un CD avec Zmws) Sur un serveur, chaque personne peut utiliser des scripts PHP dans son répertoire (contrairement aux CGI). De nombreuses fonctions permettent de répondre à la plupart des besoins. Enfin, Php peut s'écrire en plein milieu de code HTML.

PHP : points faibles

PHP souffre des défauts d'un développement anarchique comme l'absence d'homogénéité des noms de fonctions, la foison de fonctions plus ou moins équivalentes. Un "vrai" programmeur sera gêné mais saura pallier aux [nombreux] défauts de PHP.

Documents à lire :

4.2 Le langage Javascript

Le premier Javascript est du à B. Eich et est implémenté dans Netscape (un navigateur) en 1996. Contrairement à PHP qui s'exécute sur un serveur, Javascript est interprété coté client, plus exactement par le navigateur. Langage mal compris à l'époque, il est aujourd'hui (2013) normalisé en ECMAScript. Comme Php il est aujourd'hui incontournable pour le Web. Des bibliothèques comme Jquery, Prototype et un format de données nommé Json en font, avec la technologie AJAX un langage "fort" des interfaces Web dynamiques. Il est à noter que son modèle objet est très particulier (définition par prototype plutôt que par classe) et qu'il est très peu utilisé en ligne de commande ou sur les serveurs, ce qui risque (2012) de changer grâce à node.js.

Javascript : points forts

Javascript est un langage aux possibilités méconnues alors qu'il est disponible avec tout navigateur : c'est donc le seul langage installé en standard sur tous les ordinateurs ! Javascript est suffisamment puissant pour gérer toutes les mises en pages, notamment grace aux frameworks comme Jquery ou Prototype.

Javascript : points faibles

Sa liaison avec DOM notamment via window.document.getElementById en fait un langage souvent mal compris. Les différentes implémentations liées au navigateur et en particulier Internet Explorer l'ont rendu à ses débuts non inter-opérable et donc assez mal perçu.

Documents à lire :

 
           exercices corrigés 

 

5. La «nouvelle garde» : Python et Ruby

5.1 Le langage Python

Comme pour d'autres langages de scripts, Python est au départ un langage écrit par une seule personne, G. van Rossum (en 1991). Après quelques erreurs de jeunesse, Python version 2 devient un langage de scripts reconnu pour sa lisibilité et sa gestion "propre" des types et des structures de données. Il est fonctionnel, objet et s'interface bien avec Tk. En 2008, Python passe en version 3, malheureusement parfois incompatible avec la version 2. Une forte communauté scientifique qui trouvait Perl un peu dépassé et des applications comme numpy ou scipy en font un langage fortement reconnu et apprécié. De plus, issu des années 2000, Python sait bien se placer comme langage de prototypage pour le web ou les bases de données notamment avec son fameux framework de développement django.

Python : points forts

Python est souvent décrit comme «concis et élégant». Il est souvent considéré comme facile à apprendre et relativement bien documenté et il est fortement orienté objets.

Python : points faibles

La non compatibilité entre Python 2 et Python 3 couplée à la présence de nombreux modules en Python 2 absents en Python 3 a de quoi décourager. De plus la syntaxe par indentation peut en déranger plus d'un(e). Le mélange entre le style fonctionnel et le style objet comme dans len(x) et x.reverse() si x est une liste est le sujet de nombreuses controverses, comme la «prolifération» de self dans l'écriture de méthodes objets.

Documents à lire :

Mais bien sûr, on trouvera beaucoup plus de références avec Google via python3 filetype:pdf et consor, comme le fameux dive3.

5.2 Le langage Ruby

Là encore créé par une seule personne, "Matz" dès 1995, Ruby se revendique d'une forte filiation Smalltalk (voir mon "vieux" tuteur Smalltalk) et Perl dont il partage parfois la syntaxe. Son concepteur introduit un concept intéressant puisque le langage se veut «agréable» à programmer. Il est entièrement objets, mais permet la programmation fonctionnelle et procédurale et aussi la métaprogrammation car tout est ouvert, y compris le langage initial. Ainsi, on peut redéfinir + pour tout ce qui bouge ! Couplé au framework Rails, Ruby est un langage de prototypage très facile à utiliser, au moins au début.

Ruby : points forts

Le grand nombre de fonctions disponibles pour chaque type de données et sa possibilité de tout redéfinir en font un langage facile à s'approprier, quitte à le déformer pour l'adapter à un DSL.

Ruby : points faibles

Maitriser les subtilités de proc, lambda et autre "yield" requiert pas mal de temps. De plus le passage par @ et @@ dans les méthodes objets montre bien qu'il est difficile de trouver une syntaxe simple pour des concepts compliqués comme les variables d'instance et de classe.

Documents à lire :

Mais bien sûr, on trouvera beaucoup plus de références avec Google via ruby filetype:pdf.

 
           exercices corrigés 

 

6. Production automatique de documents structurés

Les caractéristiques qui font la force et la faiblesse des langages de scripts sont en général :

  • leur coté interactif (ce qui facilite leur apprentissage) ;

  • leur coté "dynamique" avec un typage souvent en canard (!) ou duck typing, ce qui évite le typage statique déclaratif et la gestion explicite de la mémoire ;

  • l'utilisation d'un interpréteur du langage, ce qui évite la compilation et les dépendances ou liaisons à des fichiers binaires ;

  • la centralisation des modules, packages et autres bibliothèques, ce qui fournit un accès rapide aux ressources.

C'est pourquoi ces langages sont les plus adaptés et les plus efficaces pour les «petites tâches» comme mettre en forme des documents, restructurer des informations en ligne, en colonne, aménager des titres et des rubriques... et pour interfacer ou créer des DSL (langages spécifiques), sans compter bien sûr le "collage" entre commandes des systèmes d'exploitation ou la programmation de logiciel. Ainsi Rexx est le langage qui permet de programmer les éditeurs de type Xedit, Python sert à programmer le logiciel Gimp...

Du coup, il est relativement facile de "démarrer" dans ces langages via des applications transversales comme la conversion pouces/centimètres, le comptage de lignes vides dans un fichier texte...

Il est clair aussi qu'écrire des interfaces avec Tk (copie locale) est beaucoup plus rapide et plus agréable à réaliser avec des langages de scripts qu'avec C ou Java (sans parler des interfaces basées sur Qt, Gtk ou wxWidgets). Ainsi le tutoriel tkdoc-onepage montre comment profiter de Active Perl, Active Tcl, Active Python et Ruby pour réaliser les mêmes interfaces. Archive des scripts : tk4l.zip.

Enfin, comme la bureautique dispose de formats ouverts, notamment avec RTF (specs_1.9) et CSV et puisque LaTeX utilise des fichiers-textes comme source, il est très facile de produire des documents structurés pour le traitement de texte, les tableurs, et même pour l'édition de livres. Un exemple de tels formats est fourni ci-dessous avec les documents produits.

Format Source Résultat
LaTeX demo_tex.txt demo_tex.pdf
RTF demo_rtf.txt demo_rtf.doc
CSV demo_csv.txt demo_csv.xls

La production automatique de dessins et graphiques via des scripts est possible aussi, bien sûr, notamment avec les formats SVG et DXF sachant que LaTeX permet aussi de composer des petits graphiques avec son environnement picture mais aussi surtout avec PsTricks. Il existe aussi de nombreux formats dédiés comme pic, dot, des librairies comme jpgraph, raphaeljs...

Notre cours PAGSD (Production Automatisée de Graphiques,Statistiques et Documents) montre tout cela en détail..

Si on demande à un progamme informatique d'écrire le code d'un autre programme, cela se nomme de la Literate programming mais c'est une autre histoire, tout aussi intéressante...

On trouvera dans les divers exercices proposés des exemples de "petits programmes" pour de «petites tâches».

 
           exercices corrigés 

 

Code-source de cette page.

 

 

retour gH    Retour à la page principale de   (gH)