# Cobol ANS 74/Structure générale

* Généralités
* Environnement de développement
* Structure générale
* Bases du Cobol
* Divisions, sections paragraphes
* Fichiers
* Tables
* Liens
* Généralités
* Environnement de développement
* Structure générale
* Bases du Cobol
* Divisions, sections paragraphes
* Fichiers
* Tables
* Liens
[ Modifier le sommaire ]

## Format

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

Le 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 | 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. |
Des feuilles découpées en 72 colonnes permettaient de préparer un programme 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

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.

### Affichage

Les deux exemples précédents sont équivalents et affichent :
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

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

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 :
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 :
Le point marque la fin des noms de division, de clause et des valeurs associées à ces clauses.

### Environnement du programme

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é.
Exemple :

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

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

### Traitements (procédures)

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.

### Fin du programme

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 :

## Premier programme

Le programme ci-dessous affiche "Bonjour monde !" après avoir effacé l'écran.
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

* 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)
** 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

PICTURE [V 9 X A]
EDITION [. , / B 0] // [+ - $ CR DB] // [Z *] // [+ - $] SIGN // {LEADING/TRAILING} SEPARATE
VALUE
USAGE // {DISPLAY/COMP}
REDEFINE
RENAMES
FILLER // Var
BLANK WHEN ZERO

### Nombre niveau

* reservé
    66 champ renommé
    77 champ indépendant (non groupé)
    88 réservé aux noms-conditions (vrai/faux)
* de groupage

### EXPR ARITHMETIQUE

[+ - * / **(exp)]

### INSTRUCTIONS
#### élémentaires

* 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
    -> 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.
    ADD A, B GIVING C; ON SIZE ERROR [instruction].
    -> A+B=1026 - trop grand pour C >> exec d'instruction

#### de contrôle

IF [c1] [ins]
* Condition de relation
* Condition de classe
* Condition de signe
* Condition de nom-condition
ETAT-CIVIL-FAUTIF si 0,5,6,7,8,9 (vrai) sinon (faux)
* Condition composée
[( ) NOT AND OR]
* Condition de relation simplifiee

### Feuille de programme

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

. Le point ferme l'instruction en Cobol et il est suivi d'un espace.
,; (facultatif) séparateur pour clarifier la notation
* ↑ https://www.mainframestechhelp.com/tutorials/cobol/coding-sheet.htm