Les deux révisions précédentesRévision précédente | |
issue100:programmer_en_cobol [2015/08/31 16:01] – auntiee | issue100:programmer_en_cobol [2015/09/01 17:25] (Version actuelle) – andre_domenech |
---|
====== Programmer en COBOL ====== | ====== Programmer en COBOL ====== |
| |
Nous, les utilisateurs d'Ubuntu sommes des gens modernes. Nous utilisons des tablettes and des smartphones qui n'existaient même pas il y a dix ans. Nous attendons impatiemment que chaque version successive d'Ubuntu soit plus révolutionnaire que la dernière, parue il y a seulement six mois. N'est-ce pas le progrès ? N'est-ce pas bien là le 21ème siècle avec sa vitesse de l'éclair ? | Nous, les utilisateurs d'Ubuntu sommes des gens modernes. Nous utilisons des tablettes et des smartphones qui n'existaient même pas il y a dix ans. Nous attendons impatiemment que chaque version successive d'Ubuntu soit plus révolutionnaire que la dernière, parue il y a seulement six mois. N'est-ce pas le progrès ? N'est-ce pas bien là le 21e siècle avec sa vitesse de l'éclair ? |
| |
Il peut donc sembler assez bizarre d'écrire à propos d'un langage de programmation tel que le COBOL. Après tout, le Common Business-Oriented Language est né en l'an 1959, c'est-à-dire jadis, où la programmation ne consistait pas à exécuter du JavaScript dans un navigateur d'Internet et où le mot informatique ne se centrait pas encore sur la connexion de téléphones à écran tactile au dernier réseau mobile à haut débit. Dans ce temps-là, même regarder l'ordinateur vous faire des clignotements de lumière devait être toute une expérience. Pour mesurer la distance couverte par l'informatique pendant ces 56 années, disons seulement que je préférerais conduire tous les jours un véhicule construit en 1959 (un Land Rover Series II fera très bien l'affaire, merci) que la combinaison d'ordinateur et d'un compilateur de la même année. | Il peut donc sembler assez bizarre d'écrire à propos d'un langage de programmation tel que le COBOL. Après tout, le Common Business-Oriented Language est né en l'an 1959, c'est-à-dire jadis, où la programmation ne consistait pas à exécuter du JavaScript dans un navigateur d'Internet et où le mot informatique ne se centrait pas encore sur la connexion de téléphones à écran tactile au dernier réseau mobile à haut débit. Dans ce temps-là, même regarder l'ordinateur vous faire des clignotements de lumière devait être toute une expérience. Pour mesurer la distance couverte par l'informatique pendant ces 56 années, disons seulement que je préférerais conduire tous les jours un véhicule construit en 1959 (un Land Rover Series II fera très bien l'affaire, merci) que la combinaison d'ordinateur et d'un compilateur de la même année. |
It was mainly from a standpoint of historical interest that I installed this compiler, and managed to get an Euclidian Algorithm program up and running quite easily, with procedure calls and even some invocation of routines written in the C language by the side.** | It was mainly from a standpoint of historical interest that I installed this compiler, and managed to get an Euclidian Algorithm program up and running quite easily, with procedure calls and even some invocation of routines written in the C language by the side.** |
| |
Juste avant l'année 2000 et le fameux « bogue de l'année 2000 » qui devait nous mordre tous (mais qui ne l'a jamais fait – puisque nous y étions préparés !) il est arrivé à l'attention de beaucoup de directeurs d'informatique qu'une proportion non négligeable des logiciels en fonctionnement avaient été écrits originalement en COBOL. Ce fut vrai surtout dans le secteur des finances. Ces programmes avaient été passés d'une génération de matériel à l'autre et re-compilés plusieurs fois, mais traitaient la plupart des processus centraux et étaient bien partis pour survivre plus longtemps que les programmeurs que les avaient conçus au départ – et qui se dirigeaient vers la retraite ou étaient déjà retraités. Il se produisit donc une manque de programmeurs parmi les nouvelles générations qui soient capables de comprendre, et certainement pas de maintenir, du code écrit en COBOL. Quinze ans plus tard, cela est toujours un facteur de préoccupation, du moins d'après certains. Toutefois, une grand proportion des programmes a du être re-écrit à un certain moment, notamment pour s'adapter aux besoins des banques et du commerce électroniques ; on voit moins souvent aujourd'hui des logiciels en COBOL développés à partir de zéro. | Juste avant l'année 2000 et le fameux « bogue de l'année 2000 » qui devait nous mordre tous (mais qui ne l'a jamais fait, puisque nous y étions préparés !) il est arrivé à l'attention de beaucoup de directeurs d'informatique qu'une proportion non négligeable des logiciels en fonctionnement avaient été écrits originalement en COBOL. Ce fut vrai surtout dans le secteur des finances. Ces programmes avaient été passés d'une génération de matériel à l'autre et recompilés plusieurs fois, mais traitaient la plupart des processus centraux et étaient bien partis pour survivre plus longtemps que les programmeurs qui les avaient conçus au départ, et qui se dirigeaient vers la retraite ou étaient déjà retraités. Il se produisit donc un manque de programmeurs parmi les nouvelles générations qui soient capables de comprendre, et certainement pas de maintenir, du code écrit en COBOL. Quinze ans plus tard, cela est toujours un facteur de préoccupation, du moins d'après certains. Toutefois, une grande proportion des programmes a du être réécrite à un certain moment, notamment pour s'adapter aux besoins des banques et du commerce électroniques ; on voit moins souvent aujourd'hui des logiciels en COBOL développés à partir de zéro. |
| |
Cela étant dit, le langage COBOL paraît avoir toujours été maintenu, avec même la parution d'une version orientée-objets en 2002 et un standard plus avancé publié en 2014. IBM sembla être toujours un participant important, bien qu'il apporte aussi son appui actif à d'autres options (telles que le Java) pour ce qui est de la programmation d'ordinateurs centraux. Du côté GNU/Linux, OpenCOBOL (http://www.opencobol.org/) est apparu pour nous donner la possibilité de compiler des programmes utiles sur les systèmes Ubuntu les plus récents ; il a été ré-baptisé (remplacé par) GNU Cobol depuis la version 1.1. | Cela étant dit, le langage COBOL paraît avoir toujours été maintenu, avec même la parution d'une version orientée objets en 2002 et un standard plus avancé publié en 2014. IBM sembla être toujours un participant important, bien qu'il apporte aussi son appui actif à d'autres options (telles que le Java) pour ce qui est de la programmation d'ordinateurs centraux. Du côté GNU/Linux, OpenCOBOL (http://www.opencobol.org/) est apparu pour nous donner la possibilité de compiler des programmes utiles sur les systèmes Ubuntu les plus récents ; il a été rebaptisé (remplacé par) GNU Cobol depuis la version 1.1. |
| |
J'ai installé ce compilateur surtout pour son intérêt historique et suis arrivé à construire assez facilement un programme de Division Euclidienne, avec des appels à procédures et même l'invocation de routines écrits dans le langage C. | J'ai installé ce compilateur surtout pour son intérêt historique et suis arrivé à construire assez facilement un programme de Division Euclidienne, avec des appels à procédures et même l'invocation de routines écrits dans le langage C. |
===== Installation ===== | ===== Installation ===== |
| |
Son installation suit le procédure habituel sur des systèmes *buntu, puisque OpenCOBOL est disponible directement depuis les dépôts. Utilisez simplement votre gestionnaire de logiciels préféré pour installer le paquet open-cobol: | Son installation suit la procédure habituelle sur des systèmes *buntu, puisque OpenCOBOL est disponible directement depuis les dépôts. Utilisez simplement votre gestionnaire de logiciels préféré pour installer le paquet open-cobol : |
| |
# aptitude install open-cobol | # aptitude install open-cobol |
Les dates nous montrent que le développement de ce compilateur n'avance pas aux vitesses supersoniques que l'on voit chez certains projets de code Open Source. Mais cela concorde assez bien avec la mentalité de COBOL qui préfère cheminer doucement selon le principe de « qui va piano va sano » plutôt que de chercher à obtenir des résultats immédiats. | Les dates nous montrent que le développement de ce compilateur n'avance pas aux vitesses supersoniques que l'on voit chez certains projets de code Open Source. Mais cela concorde assez bien avec la mentalité de COBOL qui préfère cheminer doucement selon le principe de « qui va piano va sano » plutôt que de chercher à obtenir des résultats immédiats. |
| |
La documentation du compilateur nous informe sur les dialectes de COBOL qui sont pris en charge. La version séminale de 2002 y est, mais non (ou pas encore) celle de la mise-à-jour de 2014 : | La documentation du compilateur nous informe sur les dialectes de COBOL qui sont pris en charge. La version séminale de 2002 y est, mais non (ou pas encore) celle de la mise à jour de 2014 : |
| |
std=<dialect> Compile for a specific dialect : | std=<dialect> Compile for a specific dialect : |
Once saved, let us compile our first program. We will need to use option "-x" to request the compiler to perform linkage as well as compilation proper, and produce an executable file:** | Once saved, let us compile our first program. We will need to use option "-x" to request the compiler to perform linkage as well as compilation proper, and produce an executable file:** |
| |
Notez que cette syntaxe - conçue originalement pour les cartes perforées - est basée sur le compte de caractères. Les premiers six caractères de chaque line (les colonnes 1 à 6) sont réservés pour la numérotation de chaque ligne du programme – bien que les numéros de ligne ne soient plus obligatoires aujourd'hui. La colonne numéro 7 est utilisée pour indiquer que la ligne est un commentaire, avec le caractère « * ». Enfin, seulement 72 caractères en tout peuvent être utilisés pour chaque ligne, ne laissant que 72 - 7 = 65 caractères pour l'écriture du code lui-même. | Notez que cette syntaxe - conçue originalement pour les cartes perforées - est basée sur le compte de caractères. Les premiers six caractères de chaque ligne (les colonnes 1 à 6) sont réservés pour la numérotation de chaque ligne du programme, bien que les numéros de ligne ne soient plus obligatoires aujourd'hui. La colonne numéro 7 est utilisée pour indiquer que la ligne est un commentaire, avec le caractère « * ». Enfin, seulement 72 caractères en tout peuvent être utilisés pour chaque ligne, ne laissant que 72-7 = 65 caractères pour l'écriture du code lui-même. |
| |
Lancez votre éditeur de textes préféré et tapez ou collez-y ce texte. Enregistrez le fichier comme « hello.cob » ou « hello.cbl »" – les extensions de fichiers source COBOL varient un peu. Malheureusement, il n'existe guère d'éditeurs sous Ubuntu qui sachent gérer le coloriage de la syntaxe COBOL. Mais le logiciel jedit est disponible, facile à installer depuis les dépôts, et le fait très bien : | Lancez votre éditeur de textes préféré et tapez ou collez-y ce texte. Enregistrez le fichier comme « hello.cob » ou « hello.cbl »" – les extensions de fichiers source COBOL varient un peu. Malheureusement, il n'existe guère d'éditeurs sous Ubuntu qui sachent gérer le coloriage de la syntaxe COBOL. Mais le logiciel jedit est disponible, facile à installer depuis les dépôts, et le fait très bien : |
**It is noteworthy that, since I was doing this on a 64-bit version of Linux Mint, what the compiler produced is in fact a 64-bit executable file! I wonder what the original creators of the language would have thought of that:** | **It is noteworthy that, since I was doing this on a 64-bit version of Linux Mint, what the compiler produced is in fact a 64-bit executable file! I wonder what the original creators of the language would have thought of that:** |
| |
Il est intéressant de noter que, puisque je faisais cette compilation sous une version 64-bits de Linux Mint, le compilateur vient en fait de produire un fichier exécutable en code 64-bits ! Je me demande ce que les concepteurs originels du langage en auraient pensé :. | Il est intéressant de noter que, puisque je faisais cette compilation sous une version 64-bits de Linux Mint, le compilateur vient en fait de produire un fichier exécutable en code 64-bits ! Je me demande ce que les concepteurs originels du langage en auraient pensé : |
| |
$ ldd hello | $ ldd hello |
===== La forme libre et les procédures ===== | ===== La forme libre et les procédures ===== |
| |
Le monde de la programmation a avancé un peu depuis que la spécification originelle de COBOL fut publiée. Parmi d'autres points, il ne considère plus que le fait d'écrire des programmes UNIQUEMENT EN MAJUSCULES soient la seule manière de procéder et les jeunes concepteurs de scripts aujourd'hui auraient quelques difficultés à suivre la syntaxe en colonnes très stricte des versions antérieures. C'est pourquoi les dialectes de COBOL plus récents ont progressivement réduit les contraintes formelles de présentation, allant vers une syntaxe de forme libre. Certaines parties du programme, comme la Identification division, ne doivent plus être obligatoirement incluses. Le même programme Hello World peut être écrit en forme libre de la manière suivante : | Le monde de la programmation a avancé un peu depuis que la spécification originelle de COBOL fut publiée. Parmi d'autres points, il ne considère plus que le fait d'écrire des programmes UNIQUEMENT EN MAJUSCULES soient la seule manière de procéder et les jeunes concepteurs de scripts aujourd'hui auraient quelques difficultés à suivre la syntaxe en colonnes très stricte des versions antérieures. C'est pourquoi les dialectes de COBOL plus récents ont progressivement réduit les contraintes formelles de présentation, allant vers une syntaxe de forme libre. Certaines parties du programme, comme l'Identification division, ne doivent plus être obligatoirement incluses. Le même programme Hello World peut être écrit en forme libre de la manière suivante : |
| |
program-id. HelloWorld. | program-id. HelloWorld. |
Now, for the procedure TestSub. This must be written in a new program-id section, that may be inserted within the same file as the main program. For example:** | Now, for the procedure TestSub. This must be written in a new program-id section, that may be inserted within the same file as the main program. For example:** |
| |
Une nouvelle Data division est apparue devant la Procedure division. Elle contient une section Working-storage, où les variables locales sont déclarées avec la syntaxe PIC. Les variables peuvent être initialisées immédiatement avec le mot clé value. | Une nouvelle Data division est apparue devant la Procedure division. Elle contient une section Working-storage, où les variables locales sont déclarées avec la syntaxe PIC. Les variables peuvent être initialisées immédiatement avec le mot-clé value. |
| |
Ecrivons maintenant la procédure TestSub. Elle doit être déclarée dans une nouvelle section program-id, mais qui peut se trouver dans le même fichier que le programme principal. Par exemple : | Ecrivons maintenant la procédure TestSub. Elle doit être déclarée dans une nouvelle section program-id, mais qui peut se trouver dans le même fichier que le programme principal. Par exemple : |
===== Faire appel à un code en C depuis COBOL ===== | ===== Faire appel à un code en C depuis COBOL ===== |
| |
En préparant le programme précédent, je n'étais pas tellement convaincu par l'affichage des nombres sur l'écran. Les zéros initiales semblent pour le moins assez mal venus. Je préférerais donc une fonction printf dans le style de C pour formater le résultats, mais qui ne semble pas être facilement disponible en COBOL. | En préparant le programme précédent, je n'étais pas tellement convaincu par l'affichage des nombres sur l'écran. Les zéros initiaux semblent pour le moins assez mal venus. Je préférerais donc une fonction printf dans le style de C pour formater le résultats, mais qui ne semble pas être facilement disponible en COBOL. |
| |
Dans l'intérêt de l'expérimentation, au lieu d'écrire une procédure semblable en COBOL pur, faisons-le plutôt en C et invoquons la procédure en C depuis le programme principal du COBOL. La fonctionnalité de type wrapper a été écrite en C autour de deux fonctions: | Dans l'intérêt de l'expérimentation, au lieu d'écrire une procédure semblable en COBOL pur, faisons-le plutôt en C et invoquons la procédure en C depuis le programme principal du COBOL. La fonctionnalité de type wrapper a été écrite en C autour de deux fonctions : |
| |
- prettyNumber prend un nombre entier envoyé depuis le COBOL, le transforme et l'affiche à l'écran. Puisque chaque nombre est présenté sous la forme d'un tableau de 15 caractères, une simple boucle for est utilisée pour traverser le tableau, en combinaison avec le drapeau leading_zeros pour indiquer si nous sommes toujours en train de passer les zéros initiales (valeur: TRUE) ou si nous sommes déjà parmi les chiffres significatives du nombre (valeur: FALSE). | - prettyNumber prend un nombre entier envoyé depuis le COBOL, le transforme et l'affiche à l'écran. Puisque chaque nombre est présenté sous la forme d'un tableau de 15 caractères, une simple boucle for est utilisée pour traverser le tableau, en combinaison avec le drapeau leading_zeros pour indiquer si nous sommes toujours en train de passer les zéros initiaux (valeur: TRUE) ou si nous sommes déjà parmi les chiffres significatifs du nombre (valeur: FALSE). |
| |
- Print est déclarée comme une fonction externe, et sera donc accessible depuis l'extérieur du fichier objet correspondant à la procédure en C. Il prend les trois paramètres A, B et G depuis le COBOL, et les affiche en utilisant prettyNumber. | - Print est déclarée comme une fonction externe, et sera donc accessible depuis l'extérieur du fichier objet correspondant à la procédure en C. Il prend les trois paramètres A, B et G depuis le COBOL, et les affiche en utilisant prettyNumber. |
**The "-c" flag tells the C compiler to halt once the object code is produced, before linking. The object file may then simply be added to the COBOL compiler's input file list. Execution is then performed in the usual way, producing much nicer visual results:** | **The "-c" flag tells the C compiler to halt once the object code is produced, before linking. The object file may then simply be added to the COBOL compiler's input file list. Execution is then performed in the usual way, producing much nicer visual results:** |
| |
Le drapeau « -c » indique au compilateur C de s'arrêter une fois que le code objet du sous-programme est produit, et avant l'étape du linking. Le fichier objet peut alors être rajouté à la liste des fichiers d'entrée du compilateur COBOL. On peut alors exécuter le programme final de la manière habituelle, en produisant des résultats beaucoup plus jolis: | Le drapeau « -c » indique au compilateur C de s'arrêter une fois que le code objet du sous-programme est produit, et avant l'étape du linking. Le fichier objet peut alors être rajouté à la liste des fichiers d'entrée du compilateur COBOL. On peut alors exécuter le programme final de la manière habituelle, en produisant des résultats beaucoup plus jolis : |
| |
$ ./gcd-c | $ ./gcd-c |
===== Conclusions ===== | ===== Conclusions ===== |
| |
Comme il a été dit au début, l'objectif de ce court article a été surtout de regarder un peu en arrière et voir comment les efforts d'un groupe de programmeurs dédiés ont ramené à la vie un langage de programmation assez ancien (en termes d'informatique) dans une distribution GNU/Linux moderne. Ni le matériel (ordinateur portable au lieu d'un ordinateur central des années 1950) ni le système d'exploitation (UNIX-like à la place d'un système propriétaire) ont grand-chose à voir avec ce que les développeurs originaux du COBOL avaient l'habitude de gérer – mais il fonctionne, et peut nous donner un aperçu de comment les choses se passaient dans le « bon vieux temps » de l'informatique. | Comme il a été dit au début, l'objectif de ce court article a été surtout de regarder un peu en arrière et voir comment les efforts d'un groupe de programmeurs dédiés ont ramené à la vie un langage de programmation assez ancien (en termes d'informatique) dans une distribution GNU/Linux moderne. Ni le matériel (ordinateur portable au lieu d'un ordinateur central des années 1950) ni le système d'exploitation (UNIX-like à la place d'un système propriétaire) ont grand-chose à voir avec ce que les développeurs originaux du COBOL avaient l'habitude de gérer, mais il fonctionne, et peut nous donner un aperçu de comment les choses se passaient dans le « bon vieux temps » de l'informatique. |
| |
Bien que le langage lui-même ait vu quelques évolutions depuis sa conception initiale, sa syntaxe en général et sa philosophie sont visiblement celles d'un autre âge. Cela n'exclut nullement que des tendances modernes telles que la conception orienté-objets ou l'implantation de services Web puissent être traitées avec le COBOL. Au contraire, si l'intérêt était suffisant pour l'écriture des bibliothèques intermédiaires nécessaires, il n'existerait de mon point de vue aucune raison pourquoi le COBOL - et, plus précisément, Open/GNU COBOL - ne puisse tenir la comparaison avec d'autres langages plus modernes. Mais les pièces nécessaires formeraient nécessairement une couche supplémentaire de logiciel par-dessus ce qui est à la base un langage de programmation des années 1950 et, à ce titre, les additions pourraient sembler assez étrangères à la philosophie originale du langage. | Bien que le langage lui-même ait vu quelques évolutions depuis sa conception initiale, sa syntaxe en général et sa philosophie sont visiblement celles d'un autre âge. Cela n'exclut nullement que des tendances modernes telles que la conception orientée objets ou l'implantation de services Web puissent être traitées avec le COBOL. Au contraire, si l'intérêt était suffisant pour l'écriture des bibliothèques intermédiaires nécessaires, il n'existerait de mon point de vue aucune raison pourquoi le COBOL - et, plus précisément, Open/GNU COBOL - ne puisse tenir la comparaison avec d'autres langages plus modernes. Mais les pièces nécessaires formeraient nécessairement une couche supplémentaire de logiciel par-dessus ce qui est à la base un langage de programmation des années 1950 et, à ce titre, les additions pourraient sembler assez étrangères à la philosophie originale du langage. |
| |
En revanche, la connexion à des bases de données a toujours été un des points forts du COBOL, qui a été conçu surtout dans cet objectif. Donc, si (ou quand) des gens intéressés peuvent arriver à connecter COBOL avec des systèmes de gestion de bases de données tels que PostgreSQL ou MariaBD (une partie du travail a déjà été accompli avec Oracle) - ou, mieux encore, un système générique de connexion avec SQL - ce projet pourrait trouver sa place dans le monde moderne, au moins pour ce qui est de la programmation de dorsales de bases de données. | En revanche, la connexion à des bases de données a toujours été un des points forts du COBOL, qui a été conçu surtout dans cet objectif. Donc, si (ou quand) des gens intéressés peuvent arriver à connecter COBOL avec des systèmes de gestion de bases de données tels que PostgreSQL ou MariaBD (une partie du travail a déjà été accomplie avec Oracle), ou, mieux encore, un système générique de connexion avec SQL, ce projet pourrait trouver sa place dans le monde moderne, au moins pour ce qui est de la programmation de dorsales de bases de données. |
| |
| |
**Author biography: Alan teaches computer science at Escola Andorrana de Batxillerat (high-school). He has previously given GNU/Linux courses at the University of Andorra and taught GNU/Linux systems administration at the Open University of Catalunya (UOC).** | **Author biography: Alan teaches computer science at Escola Andorrana de Batxillerat (high-school). He has previously given GNU/Linux courses at the University of Andorra and taught GNU/Linux systems administration at the Open University of Catalunya (UOC).** |
| |
Biographie de l'auteur: Alan enseigne l'informatique à la Escola Andorrana de Batxillerat. Il a donné des cours de GNU/Linux à l'Université d'Andorre et, auparavant, avait enseigné l'administration des systèmes GNU/Linux à l'Université ouverte de Catalogne (UOC). | Biographie de l'auteur : Alan enseigne l'informatique à la Escola Andorrana de Batxillerat. Il a donné des cours de GNU/Linux à l'Université d'Andorre et, auparavant, avait enseigné l'administration des systèmes GNU/Linux à l'Université ouverte de Catalogne (UOC). |
| |