COBOL

Une définition du Jargon Français.
Aller à : Navigation, rechercher

Dr enus.png sigle.  [langage]. COmmon Business-Oriented Language (langage de programmation universel pour la gestion). Il s'agit ici de gestion d'entreprise. Créé par Grace Hopper en 1960, il fut, après ALGOL et Fortran, l'un des tous premiers langages évolués mis au point.

Outre le souci d’universalité (COmmon) qui a présidé à sa conception, l'intention première était d’élaborer un langage répondant au mieux aux spécificités des traitements informatiques relatifs à la gestion des entreprises (Business). À la fin des années 1990, 57% des développements dans le monde étaient encore réalisés en COBOL.

Direction.png Voir aussi : la chronologie des langages.

Caractéristiques générales du langage

Portabilité, langage universel normalisé

La CODASYL, qui en 1959 publia les spécifications du langage, l'a voulu universel : une phase exécutable d'un programme COBOL devait pouvoir être « [porter|portée]] » d'un environnement d'exécution à un autre sans modification. Pour ce faire, les compilateurs COBOL devaient de respecter scrupuleusement les spécifications définies par cette commission, en contrepartie les spécifications du langage relevaient du domaine public. Dans la réalité, bien que les divergences soient minimes ou le plus souvent inexistantes, il est préférable, ne serait-ce que pour s'en assurer, de compiler dans l'environnement d'accueil le code source de tout programme.

Proche du langage humain

Cela représentait une évolution notable. À l’époque, excepté ALGOL, Fortran et Lisp (aucun n'est d'un emploi aisé lorsqu'il s'agit de « gestion »), les langages en vigueur étaient le langage machine et l’assembleur.

Langage structuré

L'aspect structuré du COBOL est très souvent perçu par les débutants comme une contrainte. C'est regrettable car le découpage de tout programme en 4 divisions principales, elles mêmes subdivisées en sections et/ou paragraphes, invite à un classement par catégorie des éléments constitutifs. Dans le cadre d’une investigation, en maintenance ou en développement, cette organisation du code source permet une localisation rapide d'un élément et précise d'emblée ses relations avec d'autres. Une telle organisation doit être comprise comme un premier niveau de documentation et non comme une astreinte ou une lourdeur.

Il est d'ailleurs significatif de constater que cette particularité et ce qu'elle suppose de méthodologie, datant de 1960, se retrouve préconisée par les normes de développement des langages récents, plus libéraux et quelque peu minimalistes.

Divisions d'un programme et principaux paragraphes ou sections associés

  • IDENTIFICATION DIVISION 
    Elle renferme des indications générales ; le nom du programme, sa date d’écriture, l’auteur.... Seul le nom du programme est obligatoire (PROGRAM-ID. COBOLPRO.), mais n'est-il pas naturel de signer son travail ? (AUTHOR. UNTEL Olivier. par exemple).
  • ENVIRONMENT DIVISION 
    La première section de cette division, la CONFIGURATION SECTION, précise certains éléments spécifiques au contexte d'exécution du programme ; le signe monétaire en vigueur, la marque décimale utilisée, .... (paragraphe SPECIAL-NAMES). La seconde l'INPUT-OUTPUT SECTION nomme, par la clause SELECT du paragraphe FILE-CONTROL, le(s) fichier(s) en ligne, leur mode d'accès (ACCESS MODE IS...) et leur organisation (ORGANIZATION IS...).
  • DATA DIVISION 
    Certaines caractéristiques propres aux fichiers ainsi que le nom et la structure de chaque enregistrement (buffer I/O) sont décrits dans la FILE SECTION. Les variables de travail se trouvent, quant à elles, décrites dans la WORKING-STORAGE SECTION laquelle désigne, comme l’indique son nom, un emplacement mémoire réservé à cet usage (définition des compteurs, tableaux, indices, des lignes d'édition .....)
  • PROCEDURE DIVISION 
    Renferme les ordres de programmation nécessaires à la réalisation du traitement (l'algorithme).

Accent mis sur les opérations d’entrée/sortie, utilitaires intégrés au langage

En 1960, seules les unités d'impression des résultats, (les imprimantes, la console pupitre de type machine à écrire), et les unités de lecture/perforation de cartes perforées ou de bande perforée, étaient accessibles en output et/ou en input avec des instructions dont disposaient certains langages évolués.

Les programmes batch traitant des problèmes de gestion mettent en œuvre (à peu près) systématiquement un ou plusieurs fichiers et produisent bien souvent une édition papier. Pour répondre à ce besoin COBOL fut d'emblée doté d'instructions synthétiques d’entrée/sortie permettant d'écrire (WRITE ... pour les fichiers magnétiques ou WRITE ... AFTER ADVANCING... pour les imprimantes) et de lire (READ ... AT END ...) les enregistrements de fichiers, à organisation séquentielle uniquement[1], présents sur les bandes magnétiques et les unités de disques (amovibles à cette époque).

En 1968 un utilitaire de tri nommé SORT fut ajouté au langage ainsi qu’un générateur d’états imprimés (REPORT WRITER). En 1974 furent ajoutés les ordres d'accès aux enregistrements des fichiers à organisation directe ou séquentielle indexée, tels que : READ...KEY IS... - WRITE ... - REWRITE... suivis de l'option INVALID KEY, ainsi qu'un module de fusion (SORT/MERGE).

Il est possible d'exploiter séquentiellement des fichiers à organisation directe ou séquentielle indexée (READ ... NEXT - REWRITE ... précédé par un ordre READ).

Homogénéité dans la représentation interne des valeurs, notion de blocs d'échange de données

  • Une particularité de la clause PICTURE : une variable définie sur n octets en USAGE DISPLAY (ou l’équivalent pour certaines variables de type numérique faisant l’objet de calculs. USAGE COMP et COMP-3) restitue toujours la valeur qu’elle contient représentée avec un nombre d’octets conforme à sa définition (soit n),
  • la règle de cadrage en vigueur lors du déplacement d'une valeur numérique ou alphanumérique vers une zone réceptrice de même type,
  • l’imbrication possible des descriptions des zones mémoire, hiérarchisée par l'emploi des nombres niveaux allant de 01 à 49

avec un pas de progression choisi (voir 01, 05, 10, ... ci-dessous),

Cela permet l'utilisation d'ensembles de données réunies sous une même entité descriptive de taille constante, appelée zone groupée. Aussi simple soit-elle, cette particularité du langage amène une grande souplesse de programmation.

Ébauche de programme COBOL définissant la structure d’un enregistrement et son écriture dans le fichier :

000010****************************************************************  
000020*  DEFINITION D'UN ENREGISTREMENT ET ECRITURE DANS UN FICHIER  *
000030****************************************************************
000040* 
000050 IDENTIFICATION                     DIVISION.
000060 PROGRAM-ID.    NOMPGM.
000070 AUTHOR.        CMOI.
000080*
000090 ENVIRONMENT                        DIVISION.
000100 CONFIGURATION               SECTION.
000110 SPECIAL-NAMES. DECIMAL-POINT IS COMMA                    (identifie la virgule comme marque décimale.) 
000120                CURRENCY SIGN IS 'F'.                     (précise le symbol monétaire, ici F) 
000130 INPUT-OUTPUT                SECTION.
000140 FILE-CONTROL.
000150         SELECT  FICH-ETAT-CIVIL
000160                 ASSIGN  TO    UT-....                    (lien : nom du fichier dans le pgm => nom réel.)
000170                 ACCESS  MODE  IS  ...                    (mode d'accès : SEQUENTIAL, RANDOM, DYNAMIC.)  
000180*
000190 DATA                               DIVISION.
000200 FILE                        SECTION.
000210 FD  FICH-ETAT-CIVIL .... DATA RECORD IS ENREG-ETAT-CIVIL. 
000220 01  ENREG-ETAT-CIVIL.                                    (zone groupée alphanumérique de 78 octets……et +) 
000230     05  EC-NOM             PIC  X(25).                   (zone élémentaire alphanumérique de 25 octets.)
000240     05  EC-PRENOM          PIC  X(15).                   (zone élémentaire alphanumérique de 15 octets.) 
000250     05  EC-ADRESSE.                                      (zone groupée alphanumérique de 38 octets……et +)
000260         10  EC-NO-RUE      PIC  9(03).                   (zone élémentaire numérique de 3 octets.)
000270         10  EC-LIBEL-RUE   PIC  X(35).                   (zone élémentaire alphanumérique de 35 octets.)
000280         10  EC-...(suite de la description).........
000290     05  EC-.........................................        
......     ..  ..........(suite de la description).........
......*
000400 WORKING-STORAGE             SECTION.
000410 77  W-CPT-WRITE            PIC  S9(4) COMP VALUE 0.      (description des variables et zones de travail.)
...... 01  ...........            ...  .... 
000490* 
000500 PROCEDURE                          DIVISION.
000510*
000520     OPEN    OUTPUT     FICH-ETAT-CIVIL.                  (ouverture du fichier, blocage de la ressource.)
......     .... ..........   ..  .............
000620 PARAGRAPHE-WRITE.
000630     MOVE ..........   TO  EC-..........                  (affectation d'une valeur aux variables EC-...).
......     .... ..........   ..  .............                    
000900     WRITE             ENREG-ETAT-CIVIL.                  (écriture de l'enregistrement dans le fichier.) 
......     ADD   1           TO   W-CPT-WRITE.
......     .... ..............................                    
001000     CLOSE              FICH-ETAT-CIVIL.                  (fermeture du fichier, libération de la ressource.)
001010     STOP RUN.                                            (fin d'exécution, main rendue au superviseur.)

Commentaires :

Si ADECIMAL est le nom, EC-NOM contient la valeur ‘ADECIMALbbbbb...‘. (zone alphanumérique cadrage à gauche et padding à droite avec des espaces (b) si nécessaire.)

Si Alex est le prénom, EC-PRENOM contient la valeur ‘Alexbbbbbb....‘. (idem EC-NOM.)

Si 43 est le numéro de la rue, EC-NO-RUE contient la valeur 043. (zone numérique, cadrage à droite, sur la marque décimale implicite et padding à gauche avec des zéros (0) si nécessaire.)

En se limitant à ces 3 variables, la zone groupée ENREG-ETAT-CIVIL contient : ADECIMALbbbbbbbbbbbbbbbbbAlexbbbbbbbbbbb043........

L'ordre d'écriture WRITE ENREG-ETAT-CIVIL crée un enregistrement dans le fichier FICH-ETAT-CIVIL. Un autre traitement pourra ultérieurement y accéder par un ordre READ FICH-ETAT-CIVIL.... ce qui aura pour effet de renseigner l'équivalent de la zone groupée : 01 ENREG-ETAT-CIVIL avec cette même chaîne de caractères. Et bien entendu chacune des zones élémentaires (et des zones groupées) qui lui sont subordonnées (nombres niveaux > 01) sera, par le fait, initialisée à sa valeur d'origine.

Structure d'une ligne, positionnement des instructions ou l'héritage des cartes perforées

À l'époque de sa conception les ordres et instructions du COBOL s'écrivaient, à raison de un caractère par case, sur des feuilles de papier quadrillées composées d’une vingtaine de lignes de 80 colonnes. Ces feuilles étaient ensuite remises à une opératrice de saisie, dotée d'une machine (une perforatrice), dont la fonction consistait à transcoder chaque caractère frappé à son clavier, en une combinaison univoque de perforations sur l'une des 80 colonnes d'un support cartonné. Une ligne de programme correspondait par conséquent à une carte perforée, dont la structure a conditionné, et conditionne encore, l'écriture de bien des lignes de programmes.

                                                 Les colonnes 73 à 80 ──┐──────┐ sont ignorées par les compilateurs.
                                                                        ▼      ▼ 
000500 PROCEDURE                          DIVISION.                     --------      
000505*▲                                                                --------   
000530▲│   OPEN    OUTPUT    FICH-ETAT-CIVIL.                           --------                                         
▲     ││   ▲                                                                                                     
│     ││   └────────────────  colonnes 12 à 72: codification des ordres ou instructions (marge B).                  
│     │└────────────────  colonnes 8 à 11: début des déclarations des divisions, sections et paragraphes (marge A).
│     └─────────────  colonne 7: statut particulier de la ligne;  continuation (-), commentaire(*), débogage(D).   
└───────────────  colonnes 1 à 6: numérotation des lignes (optionnelle).                                            
  1. Ne soyons pas injustes, jusqu'à ces derniers temps les moniteurs vidéo ne disposaient pas d'une amplitude d'affichage supérieure à 80 colonnes. N'est-ce pas suffisant ?

Instructions du COBOL 1960

MOVE 
Déplace un littéral ou le contenu d’une variable dans une variable de même type en respectant les règles de cadrage énoncées plus haut :
000010     MOVE  0             TO    CDE-TOT.
MULTIPLY 
Multiplication : L'opération s'interprète de la gauche vers la droite, le résultat se trouve dans la variable numérique qui suit le mot réservé GIVING.
000020     MULTIPLY LIG-PU     BY    LIG-QTE    GIVING W-LIG-TOT.
SUBTRACT 
Soustraction  : Idem, le résultat se trouve dans la variable numérique qui suit le mot réservé "FROM".
000030     SUBTRACT LIG-RIST   FROM  W-LIG-TOT.
DIVIDE 
Division  : Idem, le résultat se trouve dans la variable numérique qui suit le mot réservé "INTO".
000040     DIVIDE 1.2          INTO  W-LIG-TOT. 
ADD 
Addition  : Idem, le résultat se trouve dans la variable numérique qui suit le mot réservé "TO".
000050     ADD W-LIG-TOT       TO    CDE-TOT. 
COMPUTE 
Expression arithmétique (équivalente aux ordres synthétiques précédents): Idem, le résultat se trouve dans la variable numérique qui précède le signe "=".
000060     COMPUTE CDE-TOT = CDE-TOT + (((LIG-PU * LIG-QTE) - LIG-RIST) / 1.2). 

Note: COBOL effectue les calculs arithmétiques en virgule fixe (maximum 18 chiffres, y compris la partie fractionnaire).

EXAMINE 
Modifie une chaîne de caractères et, si nécessaire, dénombre les occurrences d’un caractère.

Soit ENREG-ETAT-CIVIL contenant :

ADECIMALbbbbbbbbbbbbbbbbbAlexbbbbbbbbbbb043 .....

Après l'exécution de :

000010     EXAMINE ENREG-ETAT-CIVIL TALLYING ALL SPACES REPLACING BY '*'.

Le résultat (28) se trouve dans un registre appelé TALLY (recueil), les 28 espaces sont remplacés par des '*' :

ADECIMAL*****************Alex***********043 .....
DISPLAY 
Affiche des données élémentaires à la console pupitre.
000200    DISPLAY 'NOMPGM : ', NOMPGM, 'ENTREZ LA DATE DE TRAITEMENT SOU
000210-           'S LA FORME: JJMMAAAA'                   UPON CONSOLE.

ACCEPT : Crée une interruption d'exécution et intercepte des données élémentaires entrées et validées à la console pupitre.

000010 WORKING-STORAGE             SECTION.
000020 01  DATE-TRAIT.
000030     05  JJ-TRAIT            PIC X(02).
000040     05  MM-TRAIT            PIC X(02).
000050     05  AAAA-TRAIT          PIC X(04).
000060 PROCEDURE                             DIVISION.
......    ....................
000200    DISPLAY 'NOMPGM : ', NOMPGM, 'ENTREZ LA DATE DE TRAITEMENT SOU
000210-           'S LA FORME: JJMMAAAA'                   UPON CONSOLE.
000210    ACCEPT DATE-TRAIT                                FROM CONSOLE.
......    ....................   
OPEN 
Ouverture de fichier(s), identification et verrouillage pour d'autres traitements des ressources fichier(s).
000010    OPEN   OUTPUT        FICH-ETAT-CIVIL.                   
CLOSE 
Fermeture de fichier(s), libération des ressources fichier(s).
001020    CLOSE                FICH-ETAT-CIVIL.
WRITE 
Écriture d’un enregistrement dans un fichier à organisation et accès séquentiels ouvert en écriture (OPEN OUTPUT ..).
000500    WRITE                ENREG-ETAT-CIVIL.                  
READ 
Lecture d’un enregistrement placé dans un fichier à organisation et accès séquentiels ouvert en lecture (OPEN INPUT ...).
000400    READ                 FICH-ETAT-CIVIL   AT  END .

Note. Entrée/Sortie en COBOL : on écrit un enregistrement (WRITE nom-enregistrement) dans un fichier, alors qu'il faut lire le fichier (READ nom-fichier) pour accéder à un enregistrement.

;USE : Définit la procédure à exécuter en cas d’erreur d’entrée/sortie.
000030    USE  AFTER STANDARD ERROR PROCEDURE ON FICH-ETAT-CIVIL.
ENTER 
Permet l’utilisation de plusieurs langages dans le même programme (absence d'éditeur de liens en 1960).
ALTER 
Modifie l’ordre d’exécution d’une séquence d’instructions prédéterminée. Obsolète et dangereux, à ne pas utiliser !
NOTE 
Est suivie d’un commentaire libre documentant le programme.
000010 NOTE. CES ORDRES DU COBOL60 PRESENTENT LE LANGAGE SOUS SA FORME NATIVE.
GO TO 
Ordre de branchement inconditionnel vers une séquence d’instructions référencée par un nom de paragraphe :
......    .........................
000900    GO  TO               ALEAS.
000910 PARAGRAPHE-SKIPPED.
000920 NOTE. LA SEQUENCE SUIVANTE SERA EXECUTEE UNIQUEMENT SI UN ORDRE 
000930 NOTE. GO TO  OU  PERFORM  FAIT REFERENCE A PARAGRAPHE-SKIPPED. 
......    ..........................
......    ..........................
002000 ALEAS.
......    .......................... 
......    .........................
PERFORM 
Ordre de débranchement d’une séquence d’instructions vers une autre et retour à l’instruction qui suit l'ordre PERFORM (pas d'itération possible intrinsèque à l'ordre).
EXIT 
Inopérant à l'exécution, précise le point de sortie d’une séquence d’instructions appelée par l'ordre PERFORM.
......    .........................
000300    PERFORM  DEBUT-SEQUENCE      THRU        FIN-SEQUENCE.
......    .........................
......    .........................
000800 DEBUT-SEQUENCE.
......    ..........................
......    .........................  
000900 FIN-SEQUENCE. 
000910    EXIT.
000920 FIN-DU-CODE.

NB. Toujours employer l'ordre PERFORM nom-parag1 avec l'option THRU nom-parag2, lequel paragraphe doit être constitué du seul ordre EXIT.


IF ... THEN ... ELSE ... 
Instructions conditionnelles, plusieurs niveaux d'imbrications possibles.
000100 NOTE. CONTROLE DE NUMERICITE SUR LA DATE ENTREE AU PUPITRE.
000110* 
000120    IF DATE-TRAIT   IS NOT NUMERIC
000130       THEN DISPLAY 'NOMPGM : ' NOMPGM,   'DATE : ', DATE-TRAIT,  
000140            ' NON NUMERIQUE, TRAITEMENT IMPOSSIBLE'  UPON CONSOLE
000150            STOP     RUN
000160       ELSE .........................
......    ..................
......    ..................
STOP RUN 
Arrête l’exécution du programme et rend le contrôle au superviseur.
DEFINE 
Définition de verbes (fonctions).
INCLUDE 
Incorpore au programme le contenu d'une bibliothèque.