Informatique

COBOL, le langage des banques et des administrations

Conçu en 1959 pour que les programmes de gestion se lisent presque comme de l'anglais, COBOL a été écrit sur des cartes perforées, a traversé les ordinateurs centraux, le bogue de l'an 2000 et l'ère d'Internet, et fait encore tourner une grande partie des comptes bancaires, des assurances et des caisses de retraite. Cinq planches pour comprendre ses cartes, ses nombres décimaux, ses traitements par lots, son célèbre bogue, puis pour exécuter de vrais programmes COBOL.

Un langage commun pour la gestion

À la fin des années 1950, chaque constructeur d'ordinateurs a son propre langage, et les programmes de paie ou de facturation doivent être réécrits à chaque changement de machine. Le 28 mai 1959, à l'initiative du ministère de la Défense américain, des constructeurs et des utilisateurs se réunissent au Pentagone et fondent le comité CODASYL. En quelques mois, un groupe où figurent notamment Jean Sammet et Mary Hawes, et qui s'inspire largement du FLOW-MATIC de Grace Hopper, définit COBOL (COmmon Business-Oriented Language). En décembre 1960, le même programme COBOL fonctionne sur deux ordinateurs différents, un RCA 501 et un UNIVAC II : la portabilité est née. Un programme COBOL se lit comme un texte : ADD TAXE TO PRIX GIVING TOTAL.

Les éditions successives de la norme COBOL et quelques grands moments de son histoire. Le langage évolue lentement, mais sans casser les programmes existants.
Planche 1

Une ligne, une carte perforée

1959 – 1985

Pendant un quart de siècle, les programmes COBOL sont tapés sur des perforatrices, comme l'IBM 029 (1964) : chaque ligne devient une carte perforée de 80 colonnes, et un programme est un paquet de cartes, parfois plusieurs milliers. Chaque colonne porte un caractère, codé par des trous dans 12 rangées. Le format du langage en garde la trace : colonnes 1 à 6 pour le numéro de la carte (utile si le paquet tombe par terre), colonne 7 pour marquer un commentaire, zone A (colonnes 8 à 11) pour les titres de divisions et de paragraphes, zone B (12 à 72) pour les instructions, et colonnes 73 à 80 pour identifier le programme. Tapez une ligne et regardez-la se perforer.

La carte : rangées 12 et 11 en haut (les « zones »), puis 0 à 9. Les bandes colorées en haut délimitent les zones du format COBOL. Touchez une colonne pour voir son codage.
Colonne choisie : caractère / trous
—
Code EBCDIC (octet de l'ordinateur IBM)
—
Trous de la carte / zone de la colonne
—
Contrôle : codes EBCDIC du codec cp037 de Python et règle de passage carte ↔ octet (59 caractères)
—
Ce qu'il faut retenir. Le codage des cartes, hérité des machines de Herman Hollerith (1890), combine une perforation de « zone » (12, 11 ou 0) et une perforation de chiffre : A = 12 et 1, J = 11 et 1, S = 0 et 2. Le jeu de caractères EBCDIC des ordinateurs IBM en découle directement : A s'écrit C1 en hexadécimal, J D1, S E2, les chiffres F0 à F9. C'est pourquoi l'ordre alphabétique et numérique d'un ordinateur central IBM diffère de celui d'un PC, qui utilise l'ASCII : en EBCDIC, les chiffres viennent après les lettres. Les colonnes 73 à 80 sont ignorées par le compilateur : on y numérotait les cartes pour pouvoir les retrier, avec une trieuse mécanique, après une chute.
Planche 2

Des nombres décimaux, au centime près

1959 – 1964

Un programme de gestion manipule des montants : il ne doit jamais perdre un centime. COBOL décrit chaque donnée par une image (PICTURE) qui fixe exactement son nombre de chiffres : PIC S9(5)V99 désigne un nombre signé (S) de cinq chiffres avant la virgule implicite (V) et deux après. Les calculs se font en décimal, pas en binaire comme dans la plupart des langages. Le stockage peut être « étendu » (un octet par chiffre, le signe logé dans le dernier) ou « condensé » (COMP-3 : deux chiffres par octet, le signe dans le dernier demi-octet). Choisissez une image et une valeur.

En haut, les chiffres de la valeur alignés sur la virgule, et ceux qui tiennent dans l'image (les autres sont perdus). En bas, les octets réellement stockés, en hexadécimal, sur un ordinateur central IBM (EBCDIC).
Valeur stockée (affichage de DISPLAY)
—
Octets / taille
—
Chiffres perdus
—
0,10 ajouté dix fois : COBOL / nombre binaire (JavaScript)
—
Contrôle : 585 résultats de MOVE, COMPUTE et DIVIDE comparés à GnuCOBOL 3.1
—
Ce qu'il faut retenir. Si le nombre est trop grand pour l'image, COBOL perd silencieusement les chiffres de gauche : 123456 rangé dans PIC 9(4) devient 3456. C'est pourquoi les programmes sérieux ajoutent la clause ON SIZE ERROR, qui détecte le débordement (voir l'exemple 3 de la planche 5). En contrepartie, les calculs décimaux sont exacts : 0,10 ajouté dix fois donne bien 1,00, alors que les nombres binaires des autres langages donnent 0,9999999999999999. Les ordinateurs centraux IBM ont même des instructions spécialisées pour calculer directement sur les nombres condensés. L'arrondi (ROUNDED) s'écarte de zéro à mi-chemin : 2,345 devient 2,35 et −2,345 devient −2,35.
Planche 3

Le traitement par lots : la mise à jour du fichier maître

1960 – 1990

Les grandes applications COBOL sont souvent des traitements par lots (en anglais batch), lancés chaque nuit. Exemple type : la mise à jour des comptes d'une banque. Le fichier maître des comptes et le fichier des mouvements de la journée (dépôts, retraits, créations, suppressions) sont triés par numéro de compte, souvent sur bandes magnétiques que l'on ne peut lire que dans l'ordre. Le programme les lit en parallèle, comme on fusionne deux paquets de cartes triés, et écrit un nouveau fichier maître et une liste d'anomalies. Suivez les deux têtes de lecture.

À gauche, l'ancien fichier maître et les mouvements, avec leurs têtes de lecture (flèches) ; à droite, le nouveau fichier maître et la liste des anomalies, écrits au fur et à mesure. Le programme compare les deux numéros lus : le plus petit passe en premier.
Ce que fait le programme
—
Enregistrements lus / écrits
—
Anomalies
—
Contrôle : nouveau fichier maître et anomalies calculés par Python
—
Ce qu'il faut retenir. Comme les deux fichiers sont triés, une seule lecture de chacun suffit, quelle que soit leur taille : c'est l'algorithme de l'« appariement », qui traite des millions de comptes en une nuit avec très peu de mémoire. L'ancien fichier maître n'est jamais modifié : en cas de problème, on peut toujours recommencer, avec la méthode des générations « grand-père, père, fils » des bandes de sauvegarde. Depuis la fin des années 1960, les ordinateurs centraux traitent aussi les opérations en temps réel, grâce à des moniteurs de transactions comme CICS (IBM, 1969) : un retrait au distributeur de billets est validé immédiatement, mais les traitements de nuit restent indispensables (calcul des intérêts, relevés, échanges entre banques).
Planche 4

Le bogue de l'an 2000

1960 – 2000

Dans les années 1960, un octet de mémoire ou une colonne de carte coûte cher : on écrit donc les années avec deux chiffres, PIC 99. La date de naissance 14 mars 1921 devient 210314. Personne n'imagine alors que ces programmes tourneront encore en l'an 2000, quand l'année courante deviendra « 00 ». Calculons l'âge de huit personnes le 1er janvier 2000, d'abord naïvement, puis avec la technique de la fenêtre : une année à deux chiffres inférieure à un pivot est considérée comme 20xx, les autres comme 19xx.

50
Les huit fiches : date de naissance telle qu'elle est stockée (AAMMJJ), âge calculé et âge réel. Les erreurs sont en rouge.
Nombre d'âges faux selon le pivot choisi, de 0 à 99. Il n'y a aucune erreur tant que le pivot sépare bien les naissances du XXe siècle des dates à venir.
Âges faux
—
Pivots sans aucune erreur
—
Tri des dates 991231 et 000101
—
Contrôle : âges réels et erreurs pour les 100 pivots calculés par Python (datetime)
—
Ce qu'il faut retenir. Avec deux chiffres, 2000 − 1999 devient 00 − 99 = −99 : âges négatifs, intérêts calculés sur un siècle, échéances dépassées, tris dans le mauvais ordre. Dans les années 1990, entreprises et administrations relisent des milliards de lignes de code, pour un coût mondial estimé à plusieurs centaines de milliards de dollars. Deux solutions : passer les années à quatre chiffres (sûr, mais il faut modifier les fichiers) ou appliquer une fenêtre (rapide, mais elle ne fonctionne que si les dates d'un même champ couvrent moins d'un siècle, et le problème ressurgit quand l'année courante atteint le pivot). Le 1er janvier 2000, il n'y eut que des incidents mineurs, preuve que le travail avait été fait. COBOL n'est d'ailleurs pas en cause : c'est le choix de stocker deux chiffres qui l'était.
Planche 5 · signature

Exécuter de vrais programmes COBOL

2026

Voici un petit interpréteur COBOL, écrit pour cette page, qui exécute dans votre navigateur un sous-ensemble du langage : les quatre divisions, les données avec PICTURE, OCCURS, REDEFINES, VALUE, COMP-3 et niveaux 88, les images d'édition (Z, *, $, signes, virgule, B), et les instructions DISPLAY, MOVE, ADD, SUBTRACT, MULTIPLY, DIVIDE, COMPUTE (avec ROUNDED et ON SIZE ERROR), IF, EVALUATE, PERFORM (paragraphes, VARYING, UNTIL, TIMES), SET et STOP RUN. Les programmes sont écrits au format fixe : sept colonnes de marge, comme sur les cartes. Chaque exemple a aussi été compilé et exécuté par le vrai compilateur GnuCOBOL : les sorties sont comparées ligne à ligne.

Le programme

Colonnes 1 à 6 : numéro · 7 : * pour un commentaire · 8 à 11 : zone A (divisions, paragraphes, niveaux 01) · 12 à 72 : zone B (instructions)

Le listage imprimé


      

La mémoire (WORKING-STORAGE) en fin d'exécution

Instructions exécutées / octets de données
—
Message du compilateur
—
Contrôle : sortie identique à celle de GnuCOBOL 3.1 (exemple d'origine)
—
Ce qu'il faut retenir. COBOL sépare strictement la description des données (DATA DIVISION) des traitements (PROCEDURE DIVISION) : toutes les variables sont déclarées à l'avance, avec leur taille exacte, et occupent des octets contigus en mémoire, ce que montre le tableau de la mémoire. La clause REDEFINES permet de lire les mêmes octets de deux façons, par exemple un texte comme un tableau de nombres (exemples 4 à 6). Les images d'édition préparent l'impression des états, avec la virgule décimale à la française grâce à DECIMAL-POINT IS COMMA (exemple 2). Le vrai COBOL lit et écrit aussi des fichiers, ce que ce petit interpréteur ne fait pas : les données des exemples sont donc placées en mémoire.

Où trouve-t-on COBOL aujourd'hui ?

Banques et assurances

Tenue des comptes, virements, cartes bancaires, contrats d'assurance : une estimation souvent citée (Reuters, 2017) parlait de 220 milliards de lignes de COBOL en service et de 95 % des opérations aux distributeurs de billets aux États-Unis passant par du code COBOL.

Administrations

Impôts, retraites, allocations : au printemps 2020, plusieurs États américains, débordés par les demandes d'allocations chômage liées à la pandémie, ont lancé des appels publics pour trouver des programmeurs COBOL.

Ordinateurs centraux

Les ordinateurs centraux IBM (série Z), descendants du System/360 de 1964, exécutent encore des programmes COBOL écrits il y a des décennies, sans modification, à côté de Linux et de Java.

Modernisation

Réécrire ces applications coûte cher et comporte des risques : des outils de traduction automatique, et depuis 2023-2026 des assistants d'intelligence artificielle, aident à comprendre et à convertir ce code, un sujet très discuté dans les entreprises.

Frise des jalons

Pour aller plus loin

Les exemples de la planche 5 et les 585 cas de la planche 2 ont été compilés et exécutés par GnuCOBOL 3.1.2 au moment de la fabrication de la page ; les codes EBCDIC, la mise à jour séquentielle et les calculs d'âge ont été refaits en Python. Votre navigateur refait tous ces calculs et les compare. Les chiffres d'usage de COBOL sont des estimations publiées, difficiles à vérifier.