Cobol ANS 74/Structure générale
Format
modifierLe 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
modifierLe format fixe est hérité des cartes perforées utilisées pour écrire les premiers programmes en COBOL.
Les lignes sont limitées à 80 caractères (80 colonnes) qui sont divisées comme suit :
Colonnes | Description |
---|---|
1 à 6 |
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 :
|
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].
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
modifierLes 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.
- L'indicateur
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
modifierLes 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
modifierUn 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
modifierCette 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
modifierCette 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)
modifierCette division facultative sert à définir les variables et structures utilisées par le programme.
DATA DIVISION.
Traitements (procédures)
modifierCette 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
modifierLa 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
modifierLe 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
"$.,;<>()-+/*=
- les lettres majuscules
- 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.: .013.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
modifierPICTURE [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
modifierIF [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
modifierFeuille à 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.