Le minimum à connaître avant de lire une source COBOL

· Mis à jour le: · · COBOL, Technologie legacy, Systèmes métier, Maintenance, Mainframe

Une passation, une intervention sur incident, la maintenance d’un progiciel fourni par un éditeur. Dans ce genre de situation, il arrive qu’un jour, sans prévenir, une source COBOL vous tombe dessus.

  • Les fichiers portent l’extension .cbl ou .cpy
  • Les noms de variables sont tous en majuscules
  • Des 01, 05, 77, 88 s’alignent les uns à côté des autres
  • On tombe sur des écritures du genre PIC S9(7)V99 COMP-3, à mi-chemin entre la formule magique et le logiciel de comptabilité
  • Et en plus c’est truffé de COPY, si bien que le seul fichier ouvert ne montre pas l’ensemble

À ce stade, le cerveau se met un peu en miettes.

Pourtant, la carte nécessaire pour le lire n’est pas si grande. COBOL varie selon les compilateurs et les produits, mais le squelette à saisir en premier pour lire un système métier existant reste largement le même partout. Dans cet article, en gardant à l’esprit le COBOL de type IBM et le COBOL métier typique, nous rassemblons le socle minimal pour les personnes qui doivent soudainement lire une source COBOL.

1. La conclusion d’abord (en une phrase)

Pour le dire d’emblée de façon assez brute, mais utile en pratique, voici l’essentiel.

  • Avant d’être un langage de logique, COBOL est très fortement un langage de définition d’enregistrements
  • Lire uniquement la PROCEDURE DIVISION ne donne que la moitié de l’histoire. Il faut d’abord regarder la DATA DIVISION
  • PIC décrit la forme d’une rubrique, USAGE indique dans quelle représentation elle est conservée
  • COMP-3 désigne un packed decimal. On le rencontre constamment dans l’univers des montants et des quantités
  • 88 n’est pas tant une variable séparée qu’un nom de condition attaché à la valeur de la rubrique précédente
  • REDEFINES est un mécanisme permettant de voir la même mémoire sous une forme différente. Ce n’est pas une copie
  • S’il y a un COPY, la source actuellement ouverte n’est pas encore complète. Impossible de voir l’ensemble sans consulter le copybook
  • En sachant suivre PERFORM, IF, EVALUATE, READ, WRITE et CALL, on saisit l’essentiel du déroulement
  • Les sources anciennes utilisent le format fixe, où la position des colonnes porte du sens. L’espace visible n’est pas une simple décoration1

En résumé : DIVISION, PIC, USAGE, COMP-3, REDEFINES, OCCURS, 88, COPY, PERFORM. Une fois que l’on sait lire ces éléments, le risque de se perdre diminue nettement.

2. Considérer d’abord COBOL comme un langage sur la forme des données

Avec des réflexes hérités de C# ou de Java, on a d’abord envie de suivre les if, les for et les appels de fonction. Mais avec COBOL, avant d’en arriver là, il est plus rapide de cerner « quels enregistrements ce programme reçoit-il, quels enregistrements produit-il, et quels buffers détient-il ».

Un COBOL métier typique suit à peu près le déroulement suivant.

  1. Lire un enregistrement depuis un fichier ou une base de données
  2. Le placer dans des rubriques de la WORKING-STORAGE
  3. Effectuer un branchement conditionnel
  4. Le reconditionner dans un autre enregistrement
  5. L’écrire en sortie

Autrement dit, la disposition tend à passer avant l’algorithme.

Voici, par exemple, un squelette typique.

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE01.

       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT SALES-FILE ASSIGN TO ...

       DATA DIVISION.
       FILE SECTION.
       FD  SALES-FILE.
       01  SALES-REC.
           05  SALE-ID       PIC 9(8).
           05  SALE-AMOUNT   PIC S9(7)V99 COMP-3.

       WORKING-STORAGE SECTION.
       01  WS-EOF            PIC X VALUE 'N'.
           88  EOF           VALUE 'Y'.

       PROCEDURE DIVISION.
           PERFORM UNTIL EOF
               READ SALES-FILE
                   AT END
                       SET EOF TO TRUE
                   NOT AT END
                       PERFORM PROCESS-SALE
               END-READ
           END-PERFORM
           STOP RUN.

En lisant ce code, ce qu’il faut regarder en premier, avant même le PERFORM, ce sont le type de SALE-AMOUNT et le sens de EOF. Lu dans cet ordre, COBOL s’apaise soudainement.

3. Regarder d’abord les quatre DIVISION

Une source COBOL se divise d’abord globalement en quatre grandes DIVISION.

DIVISION Ce qu’il faut regarder en premier
IDENTIFICATION DIVISION Nom du programme, anciens commentaires, origine
ENVIRONMENT DIVISION Fichiers, ressources externes, hypothèses d’entrée-sortie
DATA DIVISION Définitions d’enregistrements, zones de travail, paramètres
PROCEDURE DIVISION Les étapes de traitement proprement dites

Les parties suivantes sont particulièrement importantes.

  • FILE SECTION Contient les définitions d’enregistrements des fichiers d’entrée-sortie
  • WORKING-STORAGE SECTION Contient les variables courantes, les indicateurs, les compteurs, les buffers de travail
  • LOCAL-STORAGE SECTION Peut contenir des zones réinitialisées à chaque appel
  • LINKAGE SECTION Peut contenir des paramètres transmis depuis l’extérieur, le point de réception d’un sous-programme

Si l’on aperçoit une LINKAGE SECTION et un PROCEDURE DIVISION USING ..., il y a de fortes chances que le programme ne soit pas autonome et fonctionne à partir de données reçues de l’extérieur.

4. Ne pas se laisser intimider par l’apparence du format fixe

Dans le COBOL ancien, la position même des colonnes sur une ligne de source porte du sens. Sans le savoir, on ne comprendra jamais pourquoi il y a cette marge étrange à gauche.1

En format fixe, en gros, cela donne :

  • Colonnes 1 à 6 : numéro de séquence
  • Colonne 7 : indicateur
  • Colonnes 8 à 11 : zone A (Area A)
  • Colonnes 12 à 72 : zone B (Area B)

La colonne 7 est particulièrement importante.

  • * ou / : ligne de commentaire
  • - : ligne de continuation
  • D : ligne de débogage (debugging line)
  • *> : commentaire pouvant aussi être placé en milieu de ligne

Pour alléger la pression visuelle, voici un schéma assez sommaire.

1234567 8901 23456789012345678901234567890
      * commentaire
       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE01.

L’espace vu ici n’est pas de la « mise en forme » au sens moderne : il fait en partie office de syntaxe. Convertir les tabulations dans un éditeur, tout aligner à gauche, ou copier-coller sans précaution, cela casse le code purement et simplement. En regardant une source ancienne, commencez par vous demander si le fichier est en fixed format ou en free format. Appliquer un formateur moderne à du fixed format fait tout exploser, et pas qu’un peu.

5. Le strict minimum de la DATA DIVISION

5.1 Les numéros de niveau

Les définitions de données en COBOL construisent leur hiérarchie avec des numéros de niveau, et non avec l’indentation.2

       01  WS-ORDER.
           05  WS-ORDER-ID    PIC 9(8).
           05  WS-AMOUNT      PIC S9(7)V99 COMP-3.
           05  WS-STATUS      PIC X.
               88  WS-OK      VALUE '0'.
               88  WS-ERROR   VALUE '9'.

       77  WS-COUNT           PIC 9(4).

Il suffit, au minimum, de retenir ceci.

  • 01 : l’enregistrement ou groupe de plus haut niveau formant un tout
  • 02 à 49 : les niveaux en dessous
  • 77 : une rubrique élémentaire indépendante
  • 88 : un condition-name. Il attache un nom à une valeur de la rubrique précédente3
  • 66 : pour RENAMES. On le croise rarement, mais il existe

L’important est de ne pas considérer 88 comme une variable booléenne à part. Il n’existe pas de zone séparée appelée WS-OK ; c’est plutôt que, lorsque WS-STATUS vaut '0', on peut la lire sous le nom WS-OK — c’est cette sensation-là.

Autre point important : c’est le numéro de niveau, et non l’espace, qui détermine la hiérarchie. L’indentation visuelle est utile à titre indicatif, mais ce en quoi il faut finalement avoir confiance, c’est 01 / 05 / 10 / 88.2

5.2 PICTURE

PIC exprime la forme de la rubrique. Voici ce que l’on rencontre le plus souvent.

Notation Signification approximative
X Caractère
9 Chiffre
S Signé
V Point décimal purement logique
X(10) 10 caractères
9(5) Nombre à 5 chiffres
S9(7)V99 Signé, 7 chiffres entiers + 2 chiffres décimaux

Par exemple :

  • PIC X(10) → 10 caractères
  • PIC 9(5)V99 → 5 chiffres entiers + 2 chiffres décimaux
  • PIC S9(7)V99 → signé, 7 chiffres entiers + 2 chiffres décimaux

Ce qui compte particulièrement ici, c’est V. V ne contient aucun caractère . réel. PIC 9(5)V99 est traité comme « un nombre à 2 décimales », mais aucun caractère point n’est présent dans les données. Interpréter un fichier ou un dump comme « la chaîne de caractères visible » mène donc presque toujours à une chute.

5.3 USAGE / DISPLAY / COMP / COMP-3

Si PIC est la forme, USAGE correspond à la représentation dans laquelle la rubrique est conservée. Retenir ne serait-ce que ce qui suit permet déjà de lire une grande partie du code.45

Notation Signification approximative Point de vigilance à la lecture
DISPLAY Décimal externe visible sous forme de caractères Sur mainframe, l’EBCDIC est parfois présupposé6
COMP / BINARY Binaire Le nombre de chiffres visible et la représentation interne sont deux choses différentes
COMP-3 / PACKED-DECIMAL Packed decimal Paraît illisible si on le lit comme du texte

Par exemple :

       01  WS-AMOUNT-DISP   PIC S9(7)V99.
       01  WS-AMOUNT-BIN    PIC S9(7) COMP.
       01  WS-AMOUNT-PACK   PIC S9(7)V99 COMP-3.

Ces trois rubriques sont toutes des « nombres », mais leur façon de conserver le contenu diffère.

Ce qui rapporte le plus en pratique, c’est le réflexe à avoir dès que l’on voit COMP-3.

  • C’est du packed decimal
  • Probablement un montant, une taxe, une quantité ou un taux
  • Il est normal que cela paraisse illisible vu comme du texte
  • Le regarder avec un état d’esprit CSV ou UTF-8 provoque un accident

Garder cette compréhension en tête évite de paniquer inutilement devant l’apparence d’un dump ou d’un fichier binaire.

Une dernière précision : DISPLAY ne signifie pas forcément une chaîne ASCII. Sur les systèmes z/OS, l’EBCDIC est présupposé, si bien que même quand les chiffres apparaissent comme des caractères, les valeurs d’octet peuvent différer des '0' à '9' ASCII.6

5.4 REDEFINES / OCCURS / COPY / FILLER

Ces quatre éléments sont les points où l’on cale à la lecture.

REDEFINES

REDEFINES est un mécanisme permettant de voir la même zone sous une forme différente. Ce n’est pas une copie.7

       01  REC-BUF.
           05  REC-TYPE      PIC X.
           05  REC-DATA      PIC X(99).

       01  HEADER-REC REDEFINES REC-BUF.
           05  HDR-TYPE      PIC X.
           05  HDR-DATE      PIC 9(8).
           05  FILLER        PIC X(91).

Cela se rapproche de la sensation d’un union dans les langages de la famille C. On le rencontre souvent dans une écriture du type « interpréter une même zone de 100 octets comme des types d’enregistrement différents ».

OCCURS

OCCURS correspond à un tableau. En COBOL, on tend à l’appeler une table.

       05  WS-ITEM OCCURS 12 TIMES.
           10  WS-PRICE    PIC 9(5).

Si l’on rencontre en plus OCCURS DEPENDING ON, il s’agit d’une table de longueur variable. Dans ce cas, cela peut affecter jusqu’à la position des rubriques qui suivent : la suivre avec un état d’esprit de longueur fixe fait perdre pied.8

COPY

COPY est un include exécuté à la compilation (compile time). Autrement dit, la source actuellement ouverte n’est peut-être pas encore complète.9

       COPY CUSTOMER-REC.
       COPY ERROR-MAP.

Il est tout à fait courant que les définitions d’enregistrements, les indicateurs partagés, les host variables pour SQL et les interfaces externes soient repoussés dans des copybooks.

Quand l’abondance de COPY rend la lecture difficile, le plus rapide est de vérifier si l’on peut accéder à la source développée ou à un compiler listing. IBM Enterprise COBOL propose même une option nommée MDECK, destinée à écrire la source d’entrée après traitement des bibliothèques.10

FILLER

FILLER est une rubrique sans nom. Cela ne veut pas dire pour autant « inutile parce que jamais référencée ».

Elle sert couramment de :

  • Zone réservée
  • Trou de compatibilité avec une ancienne spécification
  • Ajustement pour caler une longueur d’enregistrement
  • Marge pour un REDEFINES

FILLER n’a simplement pas de nom, mais elle existe bel et bien en tant qu’octets. Oublier cela fait dériver, octet par octet, le mappage avec un fichier externe.

6. Le strict minimum de la PROCEDURE DIVISION

Si la DATA DIVISION est la carte, la PROCEDURE DIVISION est l’itinéraire parcouru.

6.1 PERFORM

PERFORM est le transfert de contrôle de base de COBOL. En gros, cela signifie appeler un traitement puis revenir.11

Voici les formes les plus courantes.

       PERFORM INIT-PROC
       PERFORM UNTIL EOF
           PERFORM READ-PROC
           IF NOT EOF
               PERFORM EDIT-PROC
               PERFORM WRITE-PROC
           END-IF
       END-PERFORM

PERFORM se décline en deux grandes familles.

  • Le PERFORM out-of-line, qui désigne un paragraphe ou une section
  • Le PERFORM ... END-PERFORM inline, qui écrit un bloc sur place

Dans du code plus ancien, on rencontre aussi couramment des spécifications de plage comme PERFORM A-100 THRU A-199. C’est pratique, mais ajouter un paragraphe au milieu risque facilement de l’entraîner accidentellement dans la plage ; à la lecture, il faut donc bien vérifier où se termine cette plage.

6.2 IF / EVALUATE / La portée (scope)

Pour le branchement conditionnel, IF est l’outil de base. Considérer EVALUATE comme l’équivalent d’un switch/case est globalement juste.

Ce à quoi il faut prêter attention, c’est la façon dont se termine une portée.12

Le code doté de terminateurs explicites tels que

  • END-IF
  • END-PERFORM
  • END-READ

reste encore lisible.

Le problème vient du code ancien. En COBOL, le . agit comme un terminateur de portée implicite et referme d’un coup toutes les instructions encore ouvertes.12

Autrement dit, un seul point change :

  • jusqu’où s’étend le IF
  • jusqu’où s’étend le PERFORM
  • à quel endroit commence la prochaine sentence

De plus, NEXT SENTENCE n’est pas équivalent à CONTINUE. NEXT SENTENCE avance jusqu’après le prochain point, si bien que sa destination varie selon l’emplacement du . suivant.12

Pour lire du vieux COBOL, se caler sur le point plutôt que sur la fin de ligne est à peu près la bonne approche.

6.3 READ / WRITE / CALL

Voici ce qui revient le plus souvent en COBOL métier.

  • READ
  • WRITE
  • REWRITE
  • START
  • CALL

READ ... AT END ... en particulier est le grand classique.

       READ IN-FILE
           AT END
               SET EOF TO TRUE
           NOT AT END
               PERFORM PROCESS-REC
       END-READ

S’il y a un CALL 'SUBPGM' USING ..., le contrôle saute vers un autre programme. Dans ce cas, regarder la LINKAGE SECTION et le PROCEDURE DIVISION USING du programme appelé rend la forme du transfert de données bien plus visible.

7. Ce qui vit hors de COBOL

Il arrive très souvent que le monde de COBOL ne soit pas entièrement contenu dans la source.

  • Les définitions de fichiers
  • L’environnement d’exécution
  • Les connexions à la base de données
  • L’environnement transactionnel
  • Le contrôle des jobs

vivent en effet à l’extérieur.

Au minimum, saisir les points suivants facilite grandement la lecture.

Les fichiers et le FILE STATUS

Il faut lire ensemble le FILE-CONTROL de l’ENVIRONMENT DIVISION et la FILE SECTION / FD de la DATA DIVISION — ils forment une paire.13

       SELECT IN-FILE ASSIGN TO ...
           FILE STATUS IS WS-FS.

       FD  IN-FILE.
       01  IN-REC.
           05 ...

S’il y a un FILE STATUS, il reçoit le code de résultat après chaque E/S. Pour lire les incidents liés aux fichiers ou la détection de fin de fichier (EOF), impossible même de commencer sans regarder cet élément.14

EXEC SQL

Sa présence signale du SQL embarqué.

       EXEC SQL
           SELECT ...
       END-EXEC.

Dans ce cas, COBOL n’est qu’un « contenant de host variables » ; les critères de sélection réels ou la cible des mises à jour se trouvent du côté SQL. Le raccourci consiste donc à lire le contenu de EXEC SQL comme du SQL ordinaire.

EXEC CICS

Sa présence signale un contexte transactionnel CICS.15

       EXEC CICS
           RECEIVE MAP(...)
       END-EXEC.

À cet instant, il ne s’agit plus d’une simple lecture de batch. Il faut la lire en intégrant le contexte externe : écrans, transactions, codes de réponse, COMMAREA, etc.

JCL et définitions d’exécution

Dans un batch mainframe, il n’est pas rare que le jeu de données réellement alloué ou l’ordre dans lequel les jobs s’enchaînent vivent en dehors de la source COBOL. Quand on regarde uniquement la source et qu’on n’arrive pas à savoir « où se trouve ce fichier », ce n’est en général pas le code qui est en cause : c’est simplement que le périmètre observé est encore trop restreint.

8. L’ordre de lecture minimal

Quand on se retrouve soudainement à devoir lire du COBOL, l’ordre suivant est le plus sûr.

  1. Recenser tous les COPY Ouvrir les copybooks si possible. Sinon, chercher un listing ou la source développée
  2. Relever les définitions d’enregistrements de niveau 01 Dresser la liste des rubriques de plus haut niveau dans la FILE SECTION, la WORKING-STORAGE et la LINKAGE SECTION
  3. Lire les PIC et les USAGE Identifier les montants, dates, quantités, codes, indicateurs
  4. Rechercher READ / WRITE / REWRITE / CALL / EXEC SQL / EXEC CICS Saisir d’abord les entrées-sorties et les frontières externes
  5. Suivre uniquement le premier chemin principal Remonter l’enchaînement des PERFORM depuis le début de la PROCEDURE DIVISION
  6. Regarder les 88 et les rubriques de statut Le sens de l’EOF, du succès/échec et des codes de type devient plus facile à lire
  7. Marquer chaque REDEFINES / OCCURS DEPENDING ON / COMP-3 Cela finira toujours par jouer un rôle plus tard, autant les signaler à l’avance comme des zones sensibles
  8. Pour les fichiers, regarder le FILE STATUS Cela réduit considérablement les erreurs de lecture liées aux E/S

Avec cet ordre, on évite d’avoir à lire l’intégralité du texte en détail dès le départ. Plutôt que de chercher à tout comprendre à 100 % d’emblée, il est bien plus facile, avec COBOL, de fixer d’abord les trois points que sont les enregistrements, les frontières externes et le chemin principal, avant de s’attaquer aux détails.

9. Les points de blocage courants

Pour finir, voici un récapitulatif des endroits où les débutants trébuchent avec une probabilité assez élevée.

Penser que REDEFINES désigne « une variable différente »

C’est faux. Il s’agit de la même zone lue sous une forme différente. Modifier l’un des côtés change aussi la façon dont l’autre apparaît.7

Penser que 88 est « un booléen indépendant »

C’est faux. Il s’agit simplement d’un nom attaché à une valeur de la rubrique précédente. En coulisses, SET WS-OK TO TRUE place la valeur correspondante dans la rubrique de base.3

Ignorer les COPY et ne lire que le corps du programme

C’est comme partir en montagne en ayant replié la moitié de la carte. Il est courant qu’une bonne partie des définitions de champs, des indicateurs partagés et des host variables vivent entièrement à l’extérieur du fichier.9

Penser que MOVE est une simple affectation

MOVE n’est pas un simple memcpy. Selon le type de la rubrique réceptrice, il peut impliquer une conversion, un alignement des chiffres, un remplissage par des zéros, une troncature, ou une édition/dé-édition (editing/de-editing).16

Sous-estimer l’effet du point (.)

Le . de COBOL pèse plus lourd qu’on ne l’imagine. Dans du code ancien sans terminateur explicite, se tromper sur jusqu’où referme ce point fait mal lire le flux de contrôle.12

Penser qu’un packed decimal ou l’EBCDIC est du « mojibake »

Ce n’est pas forcément corrompu. Il arrive très souvent que ce ne soit tout simplement pas une chaîne de caractères dès le départ, ou que ce ne soit simplement pas de l’ASCII.46

Penser que ce qui suit OCCURS DEPENDING ON est à position fixe

Les rubriques qui suivent une table de longueur variable peuvent voir leur position se déplacer selon la valeur. Les lire avec un esprit de longueur fixe fait dériver tous les calculs de décalage (offset).8

10. Aide-mémoire : que regarder en premier

Mot rencontré Première chose à penser
01 Sommet d’un enregistrement ou d’un groupe. À partir de là, saisir la vue d’ensemble
88 Nom donné au sens d’un indicateur ou d’un code d’état. La clé pour lire les branchements
PIC X(...) Rubrique caractère
PIC 9(...) / S9(...)V... Rubrique numérique. Vérifier le nombre de chiffres et la position de la décimale
COMP Binaire
COMP-3 Packed decimal. Probablement un montant ou une quantité
REDEFINES La même zone réinterprétée différemment
OCCURS Tableau / table
OCCURS DEPENDING ON Longueur variable. Attention aussi aux positions qui suivent
FILLER Pas de nom, mais une longueur bien réelle
COPY Impossible de voir la forme complète sans le copybook
PERFORM Le squelette du chemin principal
READ / WRITE / REWRITE E/S sur fichier
EXEC SQL Traitement en base de données
EXEC CICS Traitement transactionnel
FILE STATUS Code de résultat des E/S

11. Résumé

COBOL n’est pas difficile parce qu’il est ancien. C’est simplement que les définitions de données, les fichiers externes et le contexte d’exécution sont étroitement imbriqués, ce qui rend le point d’entrée initial difficile à repérer.

Pour redonner une dernière fois le socle minimal de lecture :

  • Saisir la carte via les DIVISION
  • Lire d’abord la DATA DIVISION
  • Lire la forme des rubriques via PIC et USAGE
  • Marquer chaque COMP-3, REDEFINES, OCCURS, 88 et COPY
  • Suivre PERFORM, READ, WRITE et CALL
  • Fixer les frontières externes via FILE STATUS, EXEC SQL et EXEC CICS
  • Ne pas sous-estimer la portée du .

Une fois cela acquis, COBOL cesse d’être une « magie ancienne et mystérieuse » pour devenir « un langage de traitement d’enregistrements ». Une technologie legacy ne fait pas peur parce que son nom est ancien ; c’est simplement que se tromper d’échelle au premier regard la rend soudainement difficile à comprendre. Une fois l’échelle de la carte bien ajustée, elle se lit étonnamment normalement.

12. Références

Voici les principales sources citées dans cet article.

Articles récents partageant les mêmes étiquettes, pour approfondir des sujets proches.

Ces pages replacent le sujet dans un contexte plus large de services et de décisions.

Cet article est directement lié aux services suivants.

Questions fréquentes

Questions souvent posées lors d’une consultation sur le sujet de cet article.

Par où commencer la lecture d'une source COBOL ?
Lire uniquement la PROCEDURE DIVISION ne donne que la moitié de l'histoire. COBOL est, avant d'être un langage de logique, très fortement un langage de définition d'enregistrements : il faut donc d'abord regarder la DATA DIVISION. L'ordre de lecture sûr consiste à recenser tous les COPY et vérifier les copybooks, dresser la liste des définitions d'enregistrements de niveau 01, lire la forme des rubriques via PIC et USAGE, rechercher READ, WRITE, CALL, EXEC SQL et EXEC CICS pour saisir les entrées-sorties et les frontières externes, puis enfin suivre uniquement le chemin principal en remontant l'enchaînement des PERFORM depuis le début de la PROCEDURE DIVISION.
Que signifie PIC S9(7)V99 COMP-3 ?
PIC décrit la forme de la rubrique, USAGE indique dans quelle représentation elle est conservée. S9(7)V99 désigne un nombre signé avec 7 chiffres entiers et 2 chiffres décimaux, mais le V est un point décimal purement logique : aucun caractère point n'est réellement présent dans les données. COMP-3 correspond au packed decimal, que l'on retrouve couramment sur les rubriques de montants, de taxes, de quantités ou de taux. Il est donc normal que cela paraisse illisible lu comme du texte ; regarder un dump avec un état d'esprit CSV ou UTF-8 mène droit à l'accident.
Comment comprendre le niveau 88 et REDEFINES en COBOL ?
88 n'est pas une variable booléenne indépendante, mais un nom de condition (condition-name) attaché à la valeur de la rubrique précédente. En coulisses, SET WS-OK TO TRUE place la valeur correspondante dans la rubrique de base. REDEFINES est un mécanisme qui permet de voir la même zone mémoire sous une forme différente ; ce n'est pas une copie, mais plutôt un équivalent du union des langages de la famille C. Modifier l'un des côtés change aussi la façon dont l'autre apparaît, ce qui est fréquemment utilisé pour distinguer différents types d'enregistrement au sein d'une seule zone.
Que faire quand il y a trop d'instructions COPY pour voir l'ensemble ?
COPY est un include exécuté à la compilation : la source actuellement ouverte n'est donc peut-être pas encore complète. Il est tout à fait courant que les définitions d'enregistrements, les indicateurs partagés, les host variables pour SQL et les interfaces externes soient repoussés dans des copybooks. Quand la lecture devient difficile, le plus rapide est de vérifier si l'on peut accéder à la source développée ou au compiler listing ; IBM Enterprise COBOL propose d'ailleurs une option nommée MDECK qui permet d'écrire la source d'entrée après traitement des bibliothèques.

Profil de l’auteur

Page de présentation de l’auteur de l’article.

Go Komura

Représentant de KomuraSoft LLC

Spécialisé dans le développement de logiciels Windows, le conseil technique et l’analyse de pannes, notamment pour les systèmes existants et les incidents difficiles à reproduire.

Retour au blog