Cobol ANS 74/Structure générale

Le code source en COBOL peut utiliser un format fixe (hérité des cartes perforées) ou un format libre depuis COBOL 2002.

Les perforations des cartes perforées ne permettait que l'encodage des lettres en capitales ; cela explique que les mots-clés et les noms en COBOL n'utilisent pas de lettres en minuscules.

Format fixe

modifier

Le format fixe est hérité des cartes perforées utilisées pour écrire les premiers programmes en COBOL.

 
Carte perforée d'une ligne de COBOL commençant à la colonne 12

Les lignes sont limitées à 80 caractères (80 colonnes) qui sont divisées comme suit :

Colonnes Description
1 à 6
 
Paquet de cartes perforées d'un programme COBOL pour système IBM 370.

Numéro de séquence, utilisé à l'origine pour numéroter les cartes, c'est-à-dire les lignes car une carte perforée stocke une ligne de code. Cette partie est ignorée par le compilateur.

Lors de la présentation des cartes perforées à la machine, ce numéro peut être utilisé pour mémoriser les lignes dans le bon ordre. Cependant beaucoup de machines ne tenaient pas compte de ce numéro, mais les cartes perforées pouvaient être triées automatiquement par une machine de tri.

Ce numéro de 6 chiffres peut être décomposé en deux parties : 3 chiffres pour le numéro de page, et 3 chiffres pour le numéro de ligne dans la page.

7 Caractère indiquant le type de la ligne entière :
  • ​ ​ – (espace) Ligne de code normale.
  • D – Ligne de code active en mode de débogage seulement, sinon ignorée par le compilateur.
  • - – Ligne continuant la précédente, celle-ci pouvant être interrompue au milieu d'une chaîne de caractères.
  • * – Ligne de commentaire.
  • / – Ligne de commentaire à imprimer en haut d'une nouvelle page.
8 à 11 Zone A où débute certaines lignes : DIVISION, SECTION, en-têtes de procedure, descripteurs de fichier ou rapport de niveau 01 et 77.
12 à 72 Zone B où débute toutes les autres lignes.
73 à 80 Nom du programme, servant à identifier à quel programme appartient la carte perforée, ignoré par le compilateur.
12345678901234567890123456789012345678901234567890123456789012345678901234567890
      *A   B
       IDENTIFICATION DIVISION.
       PROGRAM-ID. HELLO.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
      ***** Variables
       77 NOM PIC X(20).
       77 COMPTEUR PIC 9(3).
       PROCEDURE DIVISION.
      ***** Initialisation
           MOVE "monde" TO NOM.
           MOVE 99 TO COMPTEUR.
      ***** Affichage
           DISPLAY 'Bonjour ' NOM ' !'.
           DISPLAY 'Vous avez ' COMPTEUR ' messages.'.
           STOP RUN.

Des feuilles découpées en 72 colonnes permettaient de préparer un programme sur papier[1].

 
Feuille pour préparer un programme COBOL sur papier.

On peut remarquer que le dernier chiffre du numéro de ligne est vierge (0), et donc que le numéro est incrémenté par pas de 10. Cette technique permet de corriger un programme par insertion de nouvelles lignes sans avoir à renuméroter les lignes suivantes. Par exemple, pour insérer une ligne entre 010 et 020, une nouvelle ligne sera numérotée 015.

Cette technique peut également être appliquée aux numéros de pages.

Format libre

modifier

Les systèmes modernes n'emploient plus de cartes perforées ; les contraintes du format fixes ne sont plus obligatoires avec le format libre. Le format libre est possible en COBOL à partir de la version 2002 :

  • La position du début de ligne (indentation) n'est plus imposée ;
  • Il n'y a plus de limitation à 80 caractères par ligne ;
  • Les indicateurs sont supprimés :
    • L'indicateur * pour une ligne de commentaire est remplacé par *> en début de ligne.
    • L'indicateur - de continuation n'est plus nécessaire vu qu'il n'y a plus de limitation de longueur de ligne.
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
*>**** Variables
77 NOM PIC X(20).
77 COMPTEUR PIC 9(3).
PROCEDURE DIVISION.
*>**** Initialisation
MOVE "monde" TO NOM.
MOVE 99 TO COMPTEUR.
*>**** Affichage
DISPLAY 'Bonjour ' NOM ' !'.
DISPLAY 'Vous avez ' COMPTEUR ' messages.'.
STOP RUN.

Affichage

modifier

Les deux exemples précédents sont équivalents et affichent :

Bonjour monde                !
Vous avez 099 messages.

Cet affichage montre que les variables sont affichées pleinement, sans suppression des espaces finaux ou des zéros initiaux :

  • La variable nom est définie comme une chaîne (PIC X) de 20 caractères : 77 NOM PIC X(20).
  • La variable compteur est définie comme un entier (PIC 9) sur 3 chiffres : 77 COMPTEUR PIC 9(3).

Quatre Divisions par programme

modifier

Un programme est constitué de quatre divisions (elles-mêmes constituées de sections), permettant de structurer le programme en séparant les informations d'identifications, la définition des variables et leur traitement (procédures).

Identification du programme

modifier

Cette division est la première dans un programme ; elle est obligatoire. Elle définit les caractéristiques du programme : nom, auteur, ... La syntaxe est la suivante :

IDENTIFICATION DIVISION.

La clause PROGRAM-ID est obligatoirement présente et définit le nom donné au programme ; celui-i sert à le référencer depuis d'autres programmes pour l’utiliser. Cette clause est suivie de l'identification du programme composé de 1 à 30 caractères.

L'identifiant du programme, les noms de paragraphes et de variables peuvent utiliser les lettres et les chiffres et contenir des tirets comme séparateur (mais pas au début ou à la fin).

Exemple :

IDENTIFICATION DIVISION.
 PROGRAM-ID. EXEMPLE.
 AUTHOR. FR-WIKIBOOKS-ORG.

Le point marque la fin des noms de division, de clause et des valeurs associées à ces clauses.

Environnement du programme

modifier

Cette division facultative décrit l'environnement dans lequel s'exécute le programme :

  • Ordinateur utilisé pour compiler le programme source,
  • Ordinateur utilisé pour exécuter le programme compilé.
ENVIRONMENT DIVISION.

Exemple :

ENVIRONMENT DIVISION.
 SOURCE-COMPUTER. CPU1.
 OBJECT-COMPUTER. CPU1.
 INPUT-OUTPUT SECTION.
  FILE-CONTROL.
   SELECT ...

Déclaration des données (variables, structures)

modifier

Cette division facultative sert à définir les variables et structures utilisées par le programme.

DATA DIVISION.

Traitements (procédures)

modifier

Cette division facultative contient les instructions du programme, sont regroupées en paragraphes. Un paragraphe est formé d’un nom suivi d’un point, et d’une séquence d'instructions, chacune terminée par un point.

PROCEDURE DIVISION.

Fin du programme

modifier

La fin des division d'un programme est signalée par une ligne END PROGRAM suivie du nom du programme.

L'instruction STOP RUN met fin à l'exécution du programme, en provocant la fermeture de tous les fichiers ouverts.

Exemple de programme complet :

IDENTIFICATION DIVISION.
 PROGRAM-ID. EXEMPLE.
 AUTHOR. FR-WIKIBOOKS-ORG.
ENVIRONMENT DIVISION.
 SOURCE-COMPUTER. CPU1.
 OBJECT-COMPUTER. CPU1.
 INPUT-OUTPUT SECTION.
  FILE-CONTROL.
   SELECT ...
DATA DIVISION.
 FILE SECTION.
  FD FNOM LABEL RECORD STANDARD/OMITTED
  01 FENR.
     02 NOM1 PIC X(10).
 WORKING-STORAGE SECTION.
  66 NOM RENAMES NOMA THRU NOMB.
  77 INDEP PIC X(10)
     88 IND-OK VALUES 1 THRU 10.
     88 IND-KO VALUES 11 THRU 20.
PROCEDURE DIVISION.
END PROGRAM EXEMPLE.

Premier programme

modifier

Le programme ci-dessous affiche "Bonjour monde !" après avoir effacé l'écran.

IDENTIFICATION DIVISION.
  PROGRAM-ID. bonjour-monde.
  DATE-WRITTEN. 2024/08/13.
  AUTHOR FR-WIKIBOOKS-ORG.

PROCEDURE DIVISION.
  bonjour-monde.
    DISPLAY " " LINE 1 POSITION 1 ERASE EOS.
    DISPLAY "Bonjour " LINE 12 POSITION 20 NO ADVANCING.
    DISPLAY "monde !".
    STOP RUN.

END PROGRAM bonjour-monde.

L'instruction DISPLAY est suivie des valeurs à afficher et de directives :

LINE y
Positionner le curseur sur la ligne indiquée.
POSITION x
Positionner le curseur sur la colonne indiquée.
ERASE EOS
Effacer (erase) tout jusqu'à la fin de l'écran (EOS : End Of Screen).
NO ADVANCING
Ne pas avancer le curseur à la ligne suivante.

Éléments du Cobol

modifier
  • Ensemble de caractères
L'ensemble des caractères disponibles dépend du compilateur et de la plateforme. Toutes les versions supportent les caractères suivants :
  • les lettres majuscules ABCDEFGHIJKLMNOPQRSTUVWXYZ
  • les chiffres 0123456789
  • (espace) et les caractères "$.,;<>()-+/*=
  • Identificateurs (nom de variables, fonctions, paragraphes)
Les lettres et chiffres ainsi que le tiret sont autorisés : [A-Z][0-9][-]
Exemple : 128A 128 IF TOTAL SOUS-TOTAL
Les identifiants complètement numériques (que des chiffres) sont autorisés mais découragés pour éviter la confusion avec les nombres.
Un identifiant peut utiliser le tiret mais pas en première ou dernière position.
  • Constantes
    • Numériques : [0-9], . (jamais à droite),+- (tjs devant)
 ex.: .0 13.34.56 -.45 .+65 -12.
    • Alphabétiques : "..." ""->1"
    • Figuratives : prédéfinies (tout numérique sauf 0 = alphanumérique).
{zero, zeros, zeroes} :0
{space, spaces} :
{quote,quotes} : "
{high-value, high-values} : met plus grande valeur que var peut recevoir
{low-value, loww-values} : met plus petite valeur que var peut recevoir
ALL : demande de repeter const non numerique

ex: ZERO(alphanum) // "ZERO"(alpha) // 0(num) // 0.0(num) // ALL ZERO(alpha) // ALL "ZERO"(alpha) // ALL (0(doit être non num))

Clauses

modifier

PICTURE [V 9 X A]

77 A PIC 9(4)V99; VALUE 193654 >> |1|9|3|6|.|5|4|
77 B PIC X(3)XX; VALUE "A24ZE" >> |A|2|4|Z|E|
77 C PIC A;VALUE "Z" >> |A|

EDITION [. , / B 0] // [+ - $ CR DB] // [Z *] // [+ - $] SIGN // {LEADING/TRAILING} SEPARATE

77 A PIC S999;LEADING SEPARATE. (- devant)
77 B PIC S999;TRAILING SEPARATE. (- derriere)
77 C PIC S999;LEADING. (¢ devant)
77 D PIC S999;TRAILING. (¢ derriere)

VALUE

77 A PIC 999; VALUE 199.

USAGE // {DISPLAY/COMP}

77 B PIC 999;DISPLAY. (sauvé en car)
77 B PIC 999;COMP-0/3. (sauvé en bin).

REDEFINE

01 MONTANT PIC 9(4)V99.
01 REDEF REDEFINES MONTANT.
   02 EURO PIC 9(4).
   02 CENT PIC 99.
01 A REDEFINES MONTANT PIC 9(6).

RENAMES

66 NM RENAMES NB1 THRU DEF1.

FILLER // Var

01 ENREG.
   02 FILLER PIC X(30).
   02 CP PIC 9(4).
   02 FILLER PIC X(6).
      88 OK VALUE SPACE.

BLANK WHEN ZERO

77 A PIC 999; BLANK ZERO; VALUE ZERO.
77 B PIC ZZ9; BLANK ZERO; VALUE ZERO.
A<->" "/B<->" "

Nombre niveau

modifier
  • reservé
66 champ renommé
77 champ indépendant (non groupé)
88 réservé aux noms-conditions (vrai/faux)
  • de groupage
01 ARTICLE.
   02 DESCRIPTION PIC X(10).
      03 CODE-MAGASIN PIC XXX.
      03 NUMERO-COULEUR PIC 99.

EXPR ARITHMETIQUE

modifier

[+ - * / **(exp)]

COMPUTE A, C = A*(B**-3). // A=A*(B**-3), C=A*(B**-3) //

INSTRUCTIONS

modifier

élémentaires

modifier
  • ACCEPT [VAR]
  • MOVE (X) TO D, E, F, G, H.
  • OPERATION
ADD (X) TO A, B.
ADD (X) GIVING C, D.
-> X : somme // X+A>A, X+B>B, X>C, X>D
SUBTRACT (X) FROM A, B.
SUBTRACT (X) FROM x1 GIVING C, D.
-> X : somme // A-X>A, B-X>B, x1-X>C, x1-X>D
MULTIPLY x1 BY A, B.
MULTIPLY x1 BY x2 GIVING C, D.
-> x1*A>A, x1*B>B, x1*x2>C, x1*x2>D
DIVIDE x1 INTO A, B.
DIVIDE x1 {INTO/BY} x2 GIVING C, D REMAINDER E.
-> A/x1>A, B/x1>B, x2/x1>C (into), x2/x1>D (into), x1/x2>C (by), x1/x2>D (by), x1-x2*D>E (reste)
OPT / ROUNDED : +5 au premier digit décimal non inclu
 77 A PIC 99V99; VALUE 23.43.
 77 B PIC 99V99; VALUE 35.56.
 77 C PIC 99V9.
-> A+B=58.99
ADD A,B GIVING C.
-> c = |5|8|9| = 58.9
ADD A,B GIVING C ROUNDED.
-> c(Rounded) = 58.99 + .05 = 59.04 = |5|9|0| = 59.0
OPT / ON SIZE ERROR = Sur partie entière, si champ trop petit, le champ n'est pas rempli et exec d'instruction.
 77 A PIC 999; VALUE 876.
 77 B PIC 999; VALUE 150.
 77 C PIC 999.
ADD A, B GIVING C; ON SIZE ERROR [instruction].
-> A+B=1026 - trop grand pour C >> exec d'instruction

de contrôle

modifier

IF [c1] [ins]

  ELSE IF [c2] [ins]
  ELSE [ins]
  • Condition de relation

[= < > <= >=]

... [NOT]= ...
... [NOT]> ...
... [NOT]< ...

  • Condition de classe
... [NOT] {numeric/alphabetic}
  • Condition de signe
... [NOT] {POSITIVE/NEGATIVE/ZERO} 
  • Condition de nom-condition
77 ETAT-CIVIL PIC 9.
   88 CELIBATAIRE VALUE 1.
   88 MARIE       VALUE 2.
   88 DIVORCE     VALUE 3.
   88 VEUF        VALUE 4.
   88 ETAT-CIVIL-FAUTIF VALUES ARE 0, 5 THRU 9.
   88 SANS-CONJOINT     VALUES ARE 1, 3, 4.

ETAT-CIVIL-FAUTIF si 0,5,6,7,8,9 (vrai) sinon (faux)

  • Condition composée

[( ) NOT AND OR]

IF MARIE AND FEMME OR (AGE > 30).
  • Condition de relation simplifiee
IF A=B OR A=C OR A>D
IF A=B OR =C  OR >D
IF A=B OR C   OR >D

Feuille de programme

modifier

Feuille à 80 colonnes issue du modèle des cartes perforées.

Structure :

  • 1->6 : Num de séquence (facultatif)
  • 7 : Indicateur (*(cmt) /(cmt+nl) -(merge))
  • 8->72 : Ecriture du PRG (marge A : 8->11, marge B : 12->72)
  • 73->80 : Identification

Symboles

modifier

. Le point ferme l'instruction en Cobol et il est suivi d'un espace.

IF A = B MOVE 1 TO C
    ELSE MOVE 3 TO C
         MOVE 1 To B D.

,; (facultatif) séparateur pour clarifier la notation

ELSE MOVE 3 TO C;
     MOVE 1 TO B, D.
  1. https://www.mainframestechhelp.com/tutorials/cobol/coding-sheet.htm