La voix du secrétaire (Jean)
Présents à la réunion, en fonction de l'ordre d'arrivée :
Nous avons mangé des salades composées au chèvre ou aux lardons, des entrecôtes et des rumsteacks. Nous avons bu de la Petrus, deux vodkas (mais pas la même personne) et un Ricard.
Nous avons parlé de Perl, d'Internet, d'informatique et de points divers.
$whap -= $ooooff; $clunk *= $bam; $swish = $glurpp * $zwappen COBOL est :
SUBTRACT ooooff FROM whap. MULTIPLY clunk BY bam. MULTIPLY glurpp BY zwapp GIVING swish.avec des mots-clés de 8 (huit !) caractères. Éh oui, COBOL est un langage très verbeux. Rappelons à ce sujet que le sujet a déjà été évoqué lors d'une réunion précédente et que quelqu'un avait cité la remarque suivante : « On voit que COBOL a été écrit par une femme, tellement le langage est verbeux. » Je fait remarquer que l'article sur COBOL de la Wikipedia francophone a réussi à pondre un exemple montrant que COBOL peut, de temps en temps, être plus concis que C. L'exemple donné est :
total_jour += montant; total_mois += montant; total_annee += montant;en C, ce qui donne en COBOL :
ADD montant TO total-jour total-mois total-annee.David trouve que le fait de faire trois fois la même opération sur trois variables différentes est un drapeau rouge d'alerte (il a dit red flag) indiquant qu'il y a quelque chose à revoir dans la logique du traitement.
01 enreg-entree. 05 kayo PIC X(3). 05 crunch PIC 9999. 05 bang PIC S9(7)V99. 05 bap PIC X(30). 01 enreg-sortie. 05 kayo PIC X(3). 05 bap PIC X(30). 05 zlopp PIC S9(7)V99. 05 crunch PIC 99.alors l'instruction :
MOVE CORRESPONDING enreg-entree TO enreg-sortie.est remplacée à la compilation par :
MOVE kayo OF enreg-entree TO kayo OF enreg-sortie MOVE crunch OF enreg-entree TO crunch OF enreg-sortie MOVE bap OF enreg-entree TO bap OF enreg-sortie.sans être perturbé par l'ordre différent des variables dans les deux groupes, ni par la présence des intrus bang et zlopp.
pave-de-traitement. MOVE 0 TO compteur. MOVE 5 TO increment. ALTER pave-de-traitement TO GO TO pave-de-traitement-apres-init. pave-de-traitement-apres-init. ADD 1 TO compteur. * et la suite...C'est l'équivalent des variables d'état de Perl 5.10. [ Voir en annexe des constructions qui montrent que ce n'était peut-être pas une si bonne idée que cela de vouloir s'inspirer de l'anglais parlé. ]
IF couleur = noir OR rougeau lieu d'être obligé d'écrire comme dans les autres langages:
IF couleur = noir OR couleur = rougeun peu comme un adepte de Perl 6 (ou de Quantum::Superpositions) écrirait :
if ($couleur eq any($noir, $rouge))Sauf que ce n'est pas du tout pareil avec COBOL. Prenons le cas d'un individu, portant une casquette et des chaussettes rouges. Si cet individu affirme : « Je porte un bonnet et des chaussettes noires ou rouges. », vous le traiterez de menteur. En Perl 6,
$coiffure = $casquette; $chaussettes = $rouge; if $coiffure eq $bonnet && $chaussettes eq any($noir, $rouge) { say "C'est bien"; } else { say "Menteur !"; }imprimera « Menteur ! ». En revanche, en COBOL,
MOVE casquette TO coiffure MOVE rouge TO chaussettes. IF coiffure = bonnet AND chaussettes = noir OR rouge DISPLAY "C'est bien" ELSE DISPLAY "Menteur !".imprimera « C'est bien ». Pourquoi ? Parce que COBOL commence par une phase de réécriture pour éliminer le sucre syntaxique. Dans ce cas, la réécriture produit :
... IF coiffure = bonnet AND chaussettes = noir OR chaussettes = rouge ...et donc, avec la priorité du AND sur le OR, qui existe en mathématiques mais pas nécessairement dans les langues naturelles comme l'anglais, on voit que l'on obtient le résultat inverse. La solution est en fait d'ajouter des parenthèses (qui ont un rôle complètement différent de leur rôle dans les langues naturelles) pour écrire :
... IF coiffure = bonnet AND (chaussettes = noir OR rouge) ...qui sera alors réécrit en :
... IF coiffure = bonnet AND (chaussettes = noir OR chaussettes = rouge) ...et correctement évalué. Sauf que...
$coiffure = $bonnet; $chaussettes = $vert; if $coiffure eq $bonnet && $chaussettes ne any($vert, $bleu) { say "C'est bien"; } else { say "Menteur !"; }Il a donc écrit :
... IF coiffure = bonnet AND chaussettes NOT = (bleu OR vert) ...sans oublier les parenthèses. Vous le savez tous, avec les lois de Morgan, « not (p or q) » est équivament à « not p and not q ». Le problème, c'est que la phase de réécriture du compilateur COBOL, elle, ne le sait pas et qu'elle n'en a rien à secouer. Elle a réécrit la condition en
MOVE bonnet TO coiffure MOVE vert TO chaussettes. IF coiffure = bonnet AND (chaussettes NOT = bleu OR chaussettes NOT = vert) DISPLAY "C'est bien" ELSE DISPLAY "Menteur !".Donc, si l'individu ment à propos de ses chaussettes, tout en étant sincère à propos de son couvre-chef, le programme COBOL considérera qu'il a été sincère tout le temps, car il avait raison de dire qu'il ne portait pas de chaussettes bleues.