J'ai fait revivre l'atelier de mes débuts, dans un navigateur
En 2005, j'avais 20 ans et je découvrais mon premier poste de développeur. Il ne ressemblait en rien à ce que je fais aujourd'hui. Pas de framework, pas de Git, pas de navigateur. Un émulateur d'écran vert sur PC, 80 colonnes sur 24 lignes, un clavier avec des touches PF, et un générateur de COBOL : PACBASE.
On ne tapait pas du COBOL, ou très peu. On décrivait. Les rubriques d'abord, dans un dictionnaire commun à toute l'équipe : un code, un libellé, un format. Puis les enregistrements, qui assemblaient ces rubriques. Puis le traitement, ligne par ligne, dans un langage simplifié rangé en fonctions numérotées. Le générateur faisait le reste, et le reste, c'était des centaines de lignes de COBOL qu'on ne relisait presque jamais.
Ce qui m'est resté, c'est cet écran vert. Des lettres phosphorescentes sur fond noir, un curseur qui clignote, et rien d'autre.
Et il n'a pas complètement disparu. Regardez par-dessus l'épaule d'un vendeur dans certaines grandes enseignes, quand il cherche un produit ou passe une commande : il y a de bonnes chances que vous retrouviez le même écran. Quelque part derrière, du COBOL tourne encore.
Ce week-end, j'ai eu envie de savoir si je pouvais faire revivre cette façon de travailler. Pas pour refaire du COBOL : par curiosité, et un peu par nostalgie.
Ce que fait l'atelier
L'Atelier COBOL n'est pas une copie de PACBASE (ni son nom, ni ses écrans). C'est un générateur original, inspiré de son approche, qui tourne entièrement dans le navigateur :
- un dictionnaire de rubriques (code, libellé, format
PIC) ; - des enregistrements construits avec ces rubriques, et des ruptures sur trois niveaux au plus ;
- un langage structuré : on écrit des lignes rangées par fonction et sous-fonction, avec quelques opérateurs (M pour déplacer, A pour additionner, C pour calculer, MES pour afficher, ECR pour écrire un fichier, SQL pour la base) ;
- un squelette de batch généré autour : initialisations, lecture (avec lecture d'avance), détection des ruptures, fin de traitement, édition de l'état, dans des fonctions numérotées à l'ancienne ;
- une base de données façon DB2, avec des
EXEC SQLet un SQLCODE (0, 100, -803…) comme à l'époque ; - et un mode terminal 3270 : écran vert, tout au clavier, Tab, touches PF, clavier bloqué et Échap pour réinitialiser.
On décrit, on génère, on lit le COBOL produit (format fixe, colonnes 8 et 12, comme il se doit), et on l'exécute. La SYSOUT s'affiche, les fichiers en sortie aussi.
Comment on exécute du COBOL dans un navigateur ?
Ma première idée, c'était de faire comme pour PHP sur ce site : compiler le vrai compilateur en WebAssembly. Pour PHP, ça marche très bien. Pour le COBOL, c'est une autre histoire : GnuCOBOL traduit le COBOL en C, puis il faut un compilateur C. Embarquer les deux dans une page, ça pèse des dizaines de mégaoctets.
Alors l'atelier contient un interpréteur COBOL écrit en JavaScript (un peu plus de mille lignes, sans dépendance). Il ne couvre qu'un sous-ensemble du langage : fichiers séquentiels, SORT, PERFORM, COMPUTE, les PIC et leurs éditions (Z, 9, -, .)… Mais il lit vraiment le source : on peut modifier le COBOL généré à la main et relancer.
Le piège d'un interpréteur maison, c'est de se raconter des histoires. Donc chaque programme de test sans base de données est aussi compilé avec le vrai GnuCOBOL, et les deux sorties sont comparées ligne à ligne. Sur tous les cas de test (ruptures sur plusieurs niveaux, nombres négatifs, trois décimales, filtres…), elles sont identiques.
La base, elle, c'est SQLite compilé en JavaScript (sql.js). L'interpréteur transforme les :ZONES des EXEC SQL en paramètres liés et renvoie les SQLCODE de DB2. Il y a même un écran de requêtes interactives, pour ceux qui ont connu SPUFI.
Ce que ça m'a rappelé
Revoir ces écrans m'a surtout rappelé une idée qu'on a un peu oubliée : décrire plutôt qu'écrire. Un dictionnaire de données partagé, un squelette imposé, du code spécifique seulement là où il faut. Vingt ans plus tard, on retrouve ça dans nos générateurs de code (les makers de Symfony, par exemple), et maintenant dans le code que l'IA écrit pour nous. Mais c'est un autre article.
Et puis, il faut bien l'avouer : j'avais oublié beaucoup de choses. Les gestes au clavier, l'endroit où l'on déclarait les ruptures… Il a fallu rouvrir les vieux manuels pour m'en souvenir. Je me rappelais en revanche très bien l'ordre des fonctions : l'initialisation au début, la boucle de lecture au milieu, la fin en dernier.
À vous de jouer
L'atelier est en ligne, sans compte et sans rien installer : apprendre.forelse.fr/atelier-cobol (le mode terminal, écran vert compris, est sur /atelier-cobol/terminal).
Et pour ceux qui veulent mettre les mains dedans, voici le premier des défis du vieux : l'état des ventes. Nous sommes en 2005, le directeur commercial veut son état sur son bureau demain à 8 h : les ventes regroupées par vendeur, un sous-total et un nombre de ventes pour chacun, puis le total général. Les avoirs à zéro ne comptent pas. Le fichier et le dictionnaire sont prêts, il ne reste que le traitement : ouvrir le défi n°1.
Jamais connu ce genre d'outil ? La page mémo explique les écrans, les fonctions et les ruptures en dix minutes. Pas d'indice en revanche : c'est un défi.
L'atelier vérifie votre résultat. Quand il affiche « Défi réussi », cliquez sur « Envoyer ma solution » : elle arrive directement chez moi.
Et si vous avez connu les écrans verts, racontez-moi votre souvenir le plus tenace.
Dernière question : un parcours pour apprendre le COBOL de cette façon, en décrivant plutôt qu'en tapant, ça vous intéresserait ? Dites-le-moi en commentaire, ou par le formulaire de contact. Si vous êtes assez nombreux, je m'y mettrai.