GAP II
Un ancien langage d'IBM
Le GAP II est un ancien langage d'IBM des années 70 destiné à la gestion. GAP signifie « Générateur Automatique de Programmes ». Il s'agit de la traduction française de RPG (Report Program Generator). Ce langage n'est quasiment plus utilisé. Il l'était autrefois sur des ordinateurs de type IBM 36 et IBM OS/390.
La logique du GAP repose sur le cycle GAP. Au sein de ce cycle, l'ouverture des fichiers est effectuée une fois au début et la fermeture une fois à la fin et les lectures se font à chaque tour de boucle. Il suffit donc au programmeur de décrire ses fichiers et ensuite de coder les traitements spécifiques qui doivent être fait à chaque itération. Il n'a plus à se soucier des ouvertures/fermetures de fichiers. Le GAP permet d'effectuer des appareillages de fichiers avec un fichier maître et d'autres fichiers lus en concordance. Il permet également de gérer automatiquement les ruptures sur des critères de tri définis dans la description des fichiers.
Ce langage n'est plus utilisé car il ne permet pas l'interractivité avec les bases de données ni l'utilisation d'interfaces écran. C'est un langage dédié aux traitements batches répétitifs. Ce langage à essentiellement été inventé pour faciliter la création d'états papier (reports en anglais).
Les principes de fonctionnement de ce langage sont repris dans le générateur de COBOL PACBASE.
Un langage adapté à l'utilisation des cartes perforées
La syntaxe du langage GAP est basée sur l'utilisation, à l'époque, des cartes perforées, et c'est pour cette raison que le langage suit un colonnage strict. C'est donc très lourd de programmer en GAP car si on ne place pas une instruction dans la bonne colonne il y a une erreur de syntaxe. Les lignes de code sont écrite sur 80 colonnes et on ne peut pas écrire une instruction sur plusieurs lignes ce qui rend les noms de variables très courts contrairement au COBOL qui peut utiliser des noms très parlants jusqu'à 32 caractères.
Il existe plusieurs types de "cartes" pour coder un programme GAP. Les cartes "C" correspondent aux spécifications de calcul, c'est-à-dire les traitements proprement dits. Mais avant les cartes "C" il est nécessaire de décrire tous les fichiers utilisés dans les cartes "F" (File). Une colonne bien précise de la carte F permet de préciser si le fichier est en entrée, en sortie ou en mise à jour. La description des enregistrements de ces fichiers est ensuite effectuée par l'intermédiaire des cartes "I" (Input). Les cartes "C" sont suivies par les cartes "O" (Output). Toutes les sorties sont donc effectuées à la fin d'un cycle et conditionnées par les indicateurs GAP. Mais il existe néanmoins la possibilité de provoquer des sorties exceptionnelles à tout moment dans le code en utilisant l'instruction EXCPT.
Une ancienne carte perforée de 80 colonnes correspondant à une ligne de JCL
Une des bases du langage : les indicateurs GAP
Le codage des "alternatives" (instructions de comparaison) est très spécial. Il existe à droite trois colonnes dans lesquelles on place des indicateurs. Si la valeur qui se trouve à gauche de l'instruction de comparaison est plus grande que la valeur qui se trouve à droite c'est l'indicateur qui se trouve dans la première colonne qui est positionné. En cas d'égalité c'est l'indicateur qui se trouve dans la troisième colonne qui est positionné. Pour tester le cas inférieur ou égal on place deux fois le même indicateur dans la colonne d'infériorité et dans la colonne d'égalité. Les indicateurs fonctionnent donc comme des drapeaux, ils sont ON ou OFF. On peut lors d'une même comparaison positionner jusqu'à 3 indicateurs différents.
Une fois les indicateurs positionnés on peut les utiliser de partout dans le programme pour conditionner l'exécution des lignes de code. Une instruction s'exécutera par exemple si les indicateurs 21 et 25 sont activés. Il suffit que l'un des deux ne le soit pas pour que la ligne d'instruction ne soit pas exécutée. Les conditionnements utilisent trois colonnes à gauche des instructions et on peut combiner les conditionnements sur plusieurs lignes avec les mots OR et AN.
La lecture d'un programme écrit en GAP II est donc assez peu pratique car il faut se maintenir un tableau des indicateurs pour se rappeler la signification de chacun de ces drapeaux qui peuvent être choisis parmi les chiffres de 00 à 99.
Les indicateurs GAP sont non seulement utilisés
pour contrôler l'exécution des lignes
d'instruction mais également pour contrôler les sorties.
Exemple :
Explications :
Les lignes 52 et 53 seront exécutées seulement si l'indicateur 02 est positionné. 02 vient sans doute du résultat de la lecture d'un fichier en entrée.
A la ligne 52 on commence par mettre à "OFF" les indicateurs 20 et 21.
La ligne 53 correspond à une comparaison. En cas d'égalité stricte entre IDENTA et PREVA l'indicateur 21 est positionné à "ON".
La ligne 59 n'est exécutée que si les deux indicateurs 02 et 21 sont à l'état "ON". On effectue alors une nouvelle comparaison destinée à positionner l'indicateur 20. Dans le cas où la ligne de code n'est pas exécutée l'indicateur 20 n'est ni mis "OFF" ni "ON", il reste à son état antérieur. Mais comme on a effectué un SETOF en ligne 52, il est donc à l'état "OFF".
La ligne 60 s'exécute donc uniquement en cas de rupture (changement de valeur) sur IDENTB. La première chose que l'on va faire est de stocker la nouvelle valeur de IDENTB dans la variable KEYH qui est définie avec une longueur de 7.