COBOL
Une définition du Jargon Français.
sigle→. [langage]. COmmon Business Oriented Language (langage de programmation universel orienté gestion). Créé par Grace Hopper en 1960, il fut, après ALGOL et Fortran, l'un des tous premiers langages évolués mis au point dans l'histoire de l'informatique. 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.
| |
| http://www.developpez.net/forums/forumdisplay.php?f=156 | Forum de développeurs COBOL francophones. |
[modifier] Caractéristiques générales du langage
[modifier] 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 se 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 les nouveaux arrivants dans l'environnement d'accueil.
[modifier] COBOL 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.
[modifier] Langage structuré
L’aspect structuré du COBOL est très souvent perçu comme une contrainte par les débutants. Ceci est regrettable car le découpage de tout programme en 4 divisions principales, elles mêmes subdivisées en sections et/ou paragraphes, oblige à un classement par catégorie des éléments constitutifs. Dans le cadre d’une investigation, en maintenance ou en développement, cette organisation de l'ensemble du code permet une localisation rapide de l’élément recherché et précise ainsi que de leurs 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.
[modifier] Les 4 divisions d'un programme et les principaux paragraphes et/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).
[modifier] 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).
[modifier] 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, contrôle rendu 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.
[modifier] Structure d'une ligne, positionnement des instructions où 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).
- ↑ 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 ?
[modifier] 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.

