Le minimum à connaître avant de lire une source COBOL
· Mis à jour le: · Go Komura · 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
.cblou.cpy - Les noms de variables sont tous en majuscules
- Des
01,05,77,88s’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 DIVISIONne donne que la moitié de l’histoire. Il faut d’abord regarder laDATA DIVISION PICdécrit la forme d’une rubrique,USAGEindique dans quelle représentation elle est conservéeCOMP-3désigne un packed decimal. On le rencontre constamment dans l’univers des montants et des quantités88n’est pas tant une variable séparée qu’un nom de condition attaché à la valeur de la rubrique précédenteREDEFINESest 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,WRITEetCALL, 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.
- Lire un enregistrement depuis un fichier ou une base de données
- Le placer dans des rubriques de la
WORKING-STORAGE - Effectuer un branchement conditionnel
- Le reconditionner dans un autre enregistrement
- 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 SECTIONContient les définitions d’enregistrements des fichiers d’entrée-sortieWORKING-STORAGE SECTIONContient les variables courantes, les indicateurs, les compteurs, les buffers de travailLOCAL-STORAGE SECTIONPeut contenir des zones réinitialisées à chaque appelLINKAGE SECTIONPeut 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 continuationD: 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 tout02à49: les niveaux en dessous77: une rubrique élémentaire indépendante88: un condition-name. Il attache un nom à une valeur de la rubrique précédente366: pourRENAMES. 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èresPIC 9(5)V99→ 5 chiffres entiers + 2 chiffres décimauxPIC 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
PERFORMout-of-line, qui désigne un paragraphe ou une section - Le
PERFORM ... END-PERFORMinline, 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-IFEND-PERFORMEND-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.
READWRITEREWRITESTARTCALL
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.
- Recenser tous les
COPYOuvrir les copybooks si possible. Sinon, chercher un listing ou la source développée - Relever les définitions d’enregistrements de niveau
01Dresser la liste des rubriques de plus haut niveau dans laFILE SECTION, laWORKING-STORAGEet laLINKAGE SECTION - Lire les
PICet lesUSAGEIdentifier les montants, dates, quantités, codes, indicateurs - Rechercher
READ/WRITE/REWRITE/CALL/EXEC SQL/EXEC CICSSaisir d’abord les entrées-sorties et les frontières externes - Suivre uniquement le premier chemin principal
Remonter l’enchaînement des
PERFORMdepuis le début de laPROCEDURE DIVISION - Regarder les
88et les rubriques de statut Le sens de l’EOF, du succès/échec et des codes de type devient plus facile à lire - Marquer chaque
REDEFINES/OCCURS DEPENDING ON/COMP-3Cela finira toujours par jouer un rôle plus tard, autant les signaler à l’avance comme des zones sensibles - Pour les fichiers, regarder le
FILE STATUSCela 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
PICetUSAGE - Marquer chaque
COMP-3,REDEFINES,OCCURS,88etCOPY - Suivre
PERFORM,READ,WRITEetCALL - Fixer les frontières externes via
FILE STATUS,EXEC SQLetEXEC 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.
-
IBM, “Reference format” / IBM, “Area A or Area B” / Micro Focus, “Fixed Format” ↩ ↩2
-
IBM, “Level-numbers” ↩ ↩2
-
IBM, “Format 2: condition-name value” ↩ ↩2
-
IBM, “Examples: numeric data and internal representation” ↩ ↩2
-
IBM, “PACKED-DECIMAL (COMP-3)” ↩
-
IBM, “The EBCDIC character set” / IBM, “Handling differences in ASCII SBCS and EBCDIC SBCS characters” ↩ ↩2 ↩3
-
IBM, “REDEFINES clause” ↩ ↩2
-
IBM, “OCCURS DEPENDING ON clause” ↩ ↩2
-
IBM, “COPY statement” ↩ ↩2
-
IBM, “PERFORM statement” / IBM, “Procedure division structure” ↩
-
IBM, “Scope terminators” / IBM, “Coding a choice of actions” ↩ ↩2 ↩3 ↩4
-
IBM, “FILE STATUS clause” / IBM, “Using file status keys” ↩
-
IBM, “Elementary move rules” ↩
Articles associés
Articles récents partageant les mêmes étiquettes, pour approfondir des sujets proches.
Modifier en toute sécurité une application métier legacy sans tests — Tests de caractérisation et refactorisation en pratique
Pour modifier en toute sécurité une application métier sans tests, cet article explique, avec des exemples en C#, la procédure du test de...
Quand vous héritez d'un système sans code source ni documentation — Procédure pratique pour l'exploiter et le maintenir sans interruption
Ce guide présente la procédure pratique pour démarrer l'exploitation et la maintenance d'un système métier sans code source ni cahier des...
La gestion d'incident ne s'arrête pas au rétablissement — Un modèle de postmortem (prévention de la récurrence) pour les petites équipes de développement
Traiter un incident comme terminé une fois corrigé et les excuses présentées garantit que vous le reproduirez. Cet article traduit le pos...
Introduction à l'ADR (Architecture Decision Record) — la méthode minimale pour conserver « pourquoi on a choisi cette conception » sur un petit projet
Le code ne dit jamais pourquoi il a été écrit ainsi. Nous expliquons comment utiliser l'ADR (Architecture Decision Record) — un fichier M...
Versionner le schéma de base de données d'une application métier — pratiques de migration pour éviter que « chaque client ait une base différente »
Guide pratique pour versionner le schéma de base de données d'applications métier dont les bases sont dispersées chez chaque client. Impl...
Sujets associés
Ces pages replacent le sujet dans un contexte plus large de services et de décisions.
Thèmes techniques Windows
Portail des sujets sur le développement Windows, l'analyse des incidents et la valorisation des actifs existants.
Migration ActiveX
Choisir de conserver, encapsuler ou remplacer des composants COM / ActiveX / OCX.
Services liés à ce sujet
Cet article est directement lié aux services suivants.
Conseil technique et revue de conception
Comprendre les actifs COBOL existants, identifier le point d'entrée d'une modification, cartographier les frontières externes et structurer une évaluation avant migration : autant de sujets qui se marient bien avec le conseil technique et la revue de conception.
Analyse des bugs et des causes
La gestion des incidents juste après une reprise de projet, ou la recherche de l'origine d'une incohérence dans un actif COBOL, se traite naturellement comme une enquête de bogue et une analyse des causes racines.
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.
Liens publics