# Cobol

Cobol est un langage de programmation créé en 1959. Son nom est l’acronyme de COmmon Business Oriented Language qui révèle sa vocation originelle : être un langage commun pour la programmation d'applications de gestion. Aujourd'hui, il est surtout utilisé dans les secteurs de la banque, des assurances, des grandes administrations.

## Histoire et spécifications

Le Cobol a initialement été créé en 1959 (officiellement le 18 septembre 1959) par le Short Range Committee, un des trois comités proposés à une rencontre au Pentagone en mai 1959 organisée par Charles Phillips du département de la défense des États-Unis. Le comité a été formé pour recommander une approche à court terme pour un langage commun, indépendant des constructeurs, pour les applications de gestion de l'administration américaine. Il était constitué de membres représentant six constructeurs d'ordinateurs et trois agences gouvernementales. Les six constructeurs informatiques étaient Burroughs Corporation, IBM, Minneapolis-Honeywell, RCA, Sperry Rand, et Sylvania Electric Products. Les trois agences du gouvernement étaient le US Air Force, le David Taylor Model Basin, et l’Institut national des standards. Ce comité était présidé par un membre du NBS. Des comités à moyen et long terme ont également été proposés au Pentagone. En revanche, même si le premier a été fondé, il n'a jamais été opérationnel, et le dernier n'a jamais été fondé. En fin de compte, un sous-comité du Short Range Committee a été formé avec six membres :
* William Selden et Gertrude Tierney de IBM ;
* Howard Bromberg et Howard Discount de RCA ;
* Vernon Reeves et Jean E. Sammet de Sylvania Electric Products.
Ce sous-comité a terminé les spécifications de Cobol fin 1959. Elles étaient largement inspirées par le langage FLOW-MATIC inventé par Grace Hopper, surnommée « la mère du langage Cobol », et par le langage COMTRAN d'IBM, inventé par Bob Bemer.
Ce langage ayant été conçu aux débuts de l'informatique, sa relative complexité rebute nombre de programmeurs de notre époque, ce qui lui a valu deux interprétations ironiques de son acronyme : Compiles Only Because Of Luck (fonctionne uniquement par chance) et Completely Obsolete Business Oriented Language (Langage orienté gestion complètement obsolète).

## Histoire des standards Cobol

Ces spécifications furent approuvées par le comité complet, puis par le comité exécutif (CODASYL) en janvier 1960 et envoyées au bureau d'impression du gouvernement qui les édita et imprima en les nommant Cobol 60. Le langage fut développé en moins de six mois de travail, et il est toujours utilisé aujourd'hui, après plusieurs révisions standardisées par l'ANSI et l'ISO, dont
* Cobol-68 (1968) : gestion des tables, accès séquentiel, accès aléatoire, random processing, tri, report writer, segmentation et bibliothèque
* Cobol-74 (1974)
* Cobol-85 (1985) qui témoigne d'un grand pas vers l'adoption de la programmation structurée par l'industrie informatique et d'autres mesures visant à faciliter le travail de maintenance du code existant : introduction de mots-clés comme marqueurs finaux de certaines instructions (END-IF, END-PERFORM, END-READ, etc.)$^,$$^,$, gestion de programmes imbriqués, etc.
* En 1989, les fonctions intrinsèques sont ajoutées au langage. Par défaut, l'utilisateur peut les invoquer par leur identifiant précédé du mot-clé FUNCTION et suivi de leurs éventuels arguments entre parenthèses. Il s'agit de quelques dizaines de fonctions diverses : fonctions mathématiques (valeur minimale ou maximale des arguments, valeur absolue, fonctions trigonométriques, générateur de nombre pseudo-aléatoire, valeur approchée de pi, etc.), opération sur des chaînes de caractères (conversion de casse, suppression de caractères aux extrémités d'une chaîne, concaténation, etc.), obtention de l'heure et de la date actuelles, etc.
* Le standard Cobol 2002 (ISO/CEI 1989:2002) introduit ou standardise de nombreuses fonctionnalités, parmi celles-ci$^,$$^,$$^,$ :
** programmation orientée objet (classes, dictionnaires…) ;
** support de l'Unicode et du XML ;
** paramètres régionaux et multiples symboles monétaires ;
** fonctions définies par l'utilisateur (en) ;
** prise en charge de la récursion ;
** pointeurs et allocation dynamique de mémoire ;
** support de nouveaux types : bits (pic 1 usage bit), booléens et types numériques natifs des processeurs modernes (entiers binaires et nombres à virgule flottante).

## Traits principaux

La totalité des variables et des structures de données utilisées sont définies au début du programme, avant la division procédurale contenant les instructions. La manière dont sont définies les variables, c'est-à-dire les espaces de stockage temporaire, est très particulière. C'est une structure arborescente définie par une suite de lignes de code. Chaque ligne commence par un nombre qui définit le niveau d'imbrication du champ ou du groupe de variables.
Par exemple :
qui définit une structure NomPrenom contenant les champs Prenom et Nom sur 20 caractères.
Autre exemple :
qui définit un code postal de France. Lorsqu'une valeur est assignée à CodePostal, cette définition permet l'assignation automatique du code de département à la variable Depart sans aucune autre opération de l'utilisateur.
Comme défini dans la spécification originale, Cobol possédait déjà les nombreuses fonctionnalités qui ont fait son succès : d'excellentes capacités d'auto-documentation, des méthodes pratiques de gestion des fichiers et des types de données variés, dont le format est précisé par la clause PICTURE.
La gestion des décimales en Cobol (nombres en virgule fixe), et la maîtrise des arrondis et des dépassements, permettent d'éviter les nombreux problèmes qui arriveraient en utilisant des nombres à virgule flottante pour les calculs financiers. Ce sont ses capacités arithmétiques en virgule fixe, notamment pour les traitements par lots où il présente d'excellentes performances, qui ont rendu le Cobol particulièrement populaire pour les traitements comptables.
Il intègre également un générateur de rapports, défini de la même manière que les autres structures de données. Sont intégrées des fonctions de tri, de fusion et de communication. Un module optionnel permettait également une forme de communication inter-processus par file de messages.
Le parti-pris initial de définir un langage de programmation proche du langage naturel (comme pour FLOW-MATIC) devait faciliter, sinon la programmation, du moins l'audit des programmes Cobol par des gestionnaires non-informaticiens. Ce choix a eu pour conséquence une syntaxe complexe (le langage naturel n'est pas simple), avec de nombreux mots réservés, et de nombreuses options (les opérations de gestion ne sont pas simples non plus) qui valent à Cobol une réputation de verbosité, qui n'est pas forcément fondée sur des faits.
Par exemple en Cobol l'instruction
ajoute montant aux variables total-jour, total-mois et total-annee, et s'exprimerait en C ou autres langages dérivés par
Comme d'autres langages de l'époque (par exemple Fortran II), Cobol offrait la possibilité de modifier du code pendant l'exécution à l'aide de la fameuse instruction ALTER X TO PROCEED TO Y (altérer X pour aller vers Y). Cette possibilité dangereuse, qui transposait une technique courante de la programmation en langage machine, a été éliminée des spécifications du langage. Rendant possible la modification à la volée de l'exécution d'un programme, cette commande permettait d'outrepasser des ordres GO TO, complexifiant ainsi la maintenance.
Les versions successives du standard ont modernisé le langage, par exemple en ajoutant des structures de contrôle améliorées et le support de la programmation objet, tout en préservant au maximum la compatibilité avec les versions précédentes, de façon à éviter d'avoir à modifier l'énorme stock de programmes Cobol en service.

## Le poids de l'héritage

Le Cobol est considéré comme un système hérité.
Le langage Cobol était de loin le langage le plus employé des années 1960 à 1980, et reste très utilisé dans de grandes entreprises, notamment dans les institutions financières qui disposent et développent encore de nombreux logiciels et applications en Cobol.
Écrites à une époque où les octets coûtaient cher, et où l'an 2000 était encore fort loin, ces applications ont fait craindre le fameux bogue de l'an 2000. Souvent, en effet, par mesure d'économie de mémoire, les services informatiques et programmeurs avaient codé les années et les tests d'année sur deux chiffres plutôt que sur quatre. De sorte que la préparation du passage à l'an 2000 coûta finalement d'énormes moyens humains, matériels et financiers. Pourtant, les banques, assurances et autres institutions financières géraient depuis très longtemps des dossiers sur dix, vingt voire trente ans (prêts, par exemple), mais sans systématiquement prendre en compte dans les tests de date la notion de siècle.
En 2001, le Gartner Group estimait que 75 % des données du monde des affaires étaient traitées par des programmes en Cobol et que 15 % des nouveaux programmes développés le seraient dans ce langage en 2005. Cependant, en juillet 2017, le Cobol est 25e dans l'Index TIOBE, qui mesure les langages de programmation selon leur popularité, avec une note de 1,135 %. Des enquêtes publiées par Micro Focus permettent d'appréhender l'évolution de l'utilisation du langage dans les milieux d'affaires : en 1999, elles révélaient que 87 % des entreprises de ce milieu faisaient un usage de COBOL ; en 2003, le pourcentage est descendu à 56 % ; cependant une autre série d'enquêtes aux caractéristiques similaires montrent que cet usage aurait de nouveau augmenté au cours de la décennie suivante (62 % en 2006, 64 % en 2012).
Dans les années 2010-2020, on estime qu'il existe 200 à 800 milliards de lignes de code en Cobol toujours utilisées$^,$.

## Structure d'un programme en Cobol

Un programme comporte quatre divisions. La norme Cobol-85 ne rend obligatoire que la première.
* IDENTIFICATION DIVISION.
    Contient des informations générales sur le programme (dont le nom).
* ENVIRONMENT DIVISION.
    Contient des informations sur l'environnement (matériel et logiciel) dans lequel le programme s'exécute.
* DATA DIVISION.
    Contient les descriptions (définitions) de données (variables, fichiers, paramètres et parfois description d'écran).
* PROCEDURE DIVISION.
    Contient les instructions du programme.
Chaque division est composée de sections, formées de paragraphes composés de phrases qui peuvent être des phrases impératives ou des clauses (chacune étant formée d'un verbe suivi d'une ou plusieurs opérandes). Chaque phrase doit être terminée par un point.

### Colonnage

Les six premières colonnes de chaque ligne de programme sont considérées comme une zone de commentaire, servant autrefois à numéroter les cartes perforées (en cas de chute du paquet, il suffisait de les passer sur une trieuse pour reconstituer la version correcte du programme).
La septième colonne contient un caractère de contrôle : espace pour les lignes actives, étoile pour les commentaires, tiret comme caractère de continuation, la lettre D qui, utilisée avec [WITH DEBUGGING MODE], ajoute la ligne lors de l'exécution.
La huitième colonne est le début des titres de paragraphes.
La douzième colonne est le début des instructions.
Certains compilateurs Cobol modernes permettent l'emploi d'un format libre qui n'impose plus le colonnage.

### Exemple de programme (Hello world !)

Écrit dans le style typique des programmes sur cartes perforées (années 1960-70), avec lignes numérotées
Note : ERASE EOS signifie « 'Erase End Of Screen' » La commande ligne 100300 a donc pour effet d'effacer l'écran.

### Exemple en format libre

Autre version du même exemple en Cobol-85 format libre :

### Return codes à l'exécution

Return code 203 : vérifier l'emplacement de l'ordre d'ouverture du fichier.

## Limitations et critiques de Cobol

Cobol a été développé à la marge de la communauté scientifique et informatique, et a fait l'objet de critiques sévères dans les rangs de celle-ci$^,$$^,$. Le célèbre mathématicien et informaticien Edsger Dijkstra a ainsi déclaré en 1975 : « L'utilisation de COBOL mutile l'esprit ; l'enseigner devrait, par conséquent, être considéré comme un délit pénal » (« The use of COBOL cripples the mind; its teaching should, therefore, be regarded as a criminal offence. »)$^,$$^,$.
La présence de très nombreux mot-clés ou mots réservés, entre environ 300 et plus de 1000 selon les implémentations$^,$ (contre une trentaine en langage C, par exemple), a été critiquée pour son manque de praticité et les difficultés qu'elle pouvait poser à l'apprentissage du langage. Un certain nombre sont de simple variantes formelles : abréviations (par exemple pic pour picture), ou mots visant à rendre plus naturelle la formulation de phrases qui se veulent proches de la langue anglaise (zero et ses variantes plurielles zeros / zeroes, time / times, etc.). De même, certains mots-clés sont facultatifs et sans valeur dans certains contextes.
Cobol fut élaboré avec l'idée d'être un langage commun et hautement portable. Toutefois, en 2001, on en recensait environ 300 dialectes différents, ce qui est source de problèmes d'intercompatibilité.
Cobol a souvent été critiqué pour sa grande verbosité. Il fut conçu à l'origine dans l'idée de produire un code auto-documenté (écrit de sorte à limiter la nécessité de commentaires), facile à apprendre, maintenir et utiliser par des non-spécialistes$^,$$^,$$^,$$^,$$^,$$^,$. Ceci a en réalité conduit à produire des quantités de code peu compréhensible, certains changements introduits notamment dans la version Cobol-85 ayant visé à limiter ces écueils.
Un autre problème est posé par le manque croissant de programmeurs formés en Cobol, avec les départs en retraite, Cobol n'étant pratiquement plus enseigné dans les milieux académiques. Pour y faire face, des migrations vers d'autres systèmes, en particulier Java, ont été effectuées ou envisagées, donnant parfois lieu à de grandes difficultés ou à des renoncements$^,$.