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.
À 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.
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.
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.
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.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.
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.
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.
* pour un commentaire · 8 à 11 : zone A (divisions, paragraphes, niveaux 01) · 12 à 72 : zone B (instructions)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.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.
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.
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.
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.
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.