4. Le Superviseur d’exécution#
Ce paragraphe est à revoir profondément. Cela fait maintenant longtemps que le superviseur a été réécrit en Python. Au passage, ses fonctionnalités ont été fortement étendues.
4.1. Généralités#
Ce que l’on appelle “Superviseur” est l’ensemble des routines FORTRAN qui appartiennent à la bibliothèque SUPERVIS.
On peut le couper en deux logiquement :
SUP1 : |
ce qui sert à enchaîner les différentes commandes ; c’est-à-dire tout ce qui se trouve (dans l’arbre d’appel) entre le programme principal et les routines OP000i (y compris le programme principal). On inclut dans le superviseur le contenu de 3 commandes particulières : DEBUT, POURSUITE et FIN, |
SUP2 : |
ce qui permet la communication d’informations avec les OP000i : les routines GETXXX (D6.03.01 - Communication avec le Superviseur d’exécution : routines GETXXX) |
4.2. Fonctionnement général du Superviseur#
ouverture des 3 bases de données JEVEUX(D6.02.01 Gestion mémoire: JEVEUX) (en fait 3 fichiers d’accès direct).
base “LOCALE” c’est une base de travail réservée au Superviseur, cette base n’est pas sauvegardée en fin d’exécution
base “VOLATILE” c’est la base réservée aux objets de travail (hors Superviseur), cette base n’est pas sauvegardée en fin d’exécution,
base “GLOBALE” c’est la base de l’utilisateur. Elle contiendra en fin d’exécution les concepts correspondants aux commandes exécutées
lecture des catalogues
catalogues de commandes
catalogues d’éléments
lecture du fichier de commandes de l’utilisateur
lecture en format libre ; élimination des commentaires,
vérifications syntaxiques (à l’aide des catalogues de commandes),
orthographe des mots clés,
types des arguments,
exclusion des mots clés, …
affectation des valeurs par défaut,
création des concepts correspondants aux valeurs (DEFI_VALEUR [U4.21.10]) et aux fonctions interprétées (FORMULE [U4.21.11]),
évaluation des expressions numériques (mot clé EVAL [U4.21.11 §4.1]),
stockage des informations du fichier de commandes dans des objets JEVEUX (base locale).
demande d’exécution des commandes de l’utilisateur (Demande d’exécution des commandes),
impression du temps d’exécution de chaque commande,
validation (au fur et à mesure) des concepts créés par les commandes : ceci permet de “reprendre” un calcul qui s’est mal terminé,
fermeture des bases de données en fin d’exécution,
arrêt du programme.
4.3. Demande d’exécution des commandes#
Le Superviseur “boucle” deux fois sur les commandes lues dans le fichier de commandes de l’utilisateur :
1èrepasse : |
phase de vérifications supplémentaires : on vérifie les données de l’utilisateur (ce qui n’a pas pu être vérifié par le superviseur), |
2èmepasse : |
phase d’exécution : on exécute véritablement la commande. |
Si l’utilisateur a demandé :
DEBUT (PAR_LOT : ‘OUI’, …) (c’est la valeur par défaut)
le Superviseur exécute la 1ère passe sur toutes les commandes avant de commencer la 2ème passe. Ceci permet de vérifier tout le fichier de commandes avant de commencer l’exécution.
Sinon : DEBUT (PAR_LOT : ‘NON’, …)
Le Superviseur exécute les 2 passes l’une après l’autre pour chaque commande.
Remarque :
Le Superviseur enchaîne les commandes les unes après les autres. Les “phrases du langage” (les commandes) se suivent sans instructions de contrôle : IF THEN ELSE , boucles DO ,…
4.4. Commandes « Superviseur »#
Remarque :
Ce paragraphe peut être sauté en première lecture.
Le paragraphe précédent (Demande d’exécution des commandes ) concernait l’exécution des commandes “ordinaires”.
Les commandes ordinaires sont celles dont le numéro est compris entre 1 et 9998.
Les commandes qui ne sont pas ordinaires sont :
les commandes DEBUTet POURSUITEqui n’ont pas de catalogue externe,
la commande FINassociée au numéro 9999qui est chargée (entre autres choses) de décharger la mémoire et de fermer les bases de données,
les commandes dites “superviseur”.
Les commandes Superviseur ont un catalogue (comme les commandes ordinaires), mais leur numéro est un nombre négatif (mot clé NUMERO_SUPERVIS__ au lieu de NUMERO__). Les routines FORTRAN associées se nomment OPS00i.
Il existe aujourd’hui (01/10/94) 7 commandes Superviseur.
La différence de comportement entre une commande Superviseur et une commande ordinaire est que le superviseur effectue une passe préliminaire sur les commandes Superviseur. L’idée étant qu’après cette passe préliminaire, tout se passe comme si le fichier de commandes ne contenait que des commandes ordinaires. Cette passe préliminaire peut être considérée comme pré-traitement du fichier de commandes. L’“écho” du fichier de commandes (que l’on retrouve dans le fichier MESSAGE) représente l’état du fichier de commandes après cette phase préliminaire.
Les 7 commandes Superviseur actuelles se décomposent en deux : celles qui sont détruites à la fin de la passe préliminaire : INCLUDE, PROC, RETURN et MACRO_MATR_ASSE et celles qui ne sont pas détruites : DEFI_VALEUR, FORMULE et DETRUIRE. Pour ces 3 dernières, on passera donc trois fois dans la routine OPS00i associée : passe préliminaire, passe de vérifications supplémentaires et passe d’exécution.
L’intérêt principal des commandes Superviseur (outre d’avoir permis l’“include”, l’emploi des fonctions interprétées et des constantes nommées) est de permettre le développement de “macro” commandes ; MACRO_MATR_ASSE en est un exemple. Lors de la passe préliminaire, la commande MACRO_MATR_ASSE engendre dynamiquement le texte de plusieurs commandes ordinaires puis elle est détruite. Le développement de telles macro-commandes est documenté dans [D5.01.02].
Soit le fichier de commandes :
C_O1
C_S1
C_O2
C_S2
C_O3
où :
C_Oi |
sont des commandes ordinaires |
C_Si |
sont des commandes Superviseur |
C_S1 |
est une commande Superviseur de type macro commande qui engendre les commandes ordinaires C_O4 et C_O5. C_S1 se détruit à la fin de la passe préliminaire |
C_S2 |
est une commande Superviseur qui ne se détruit pas |
Séquence des passes si DEBUT (PAR_LOT : ‘OUI’)
passe préliminaire (pour les commandes superviseur seulement) : (pp)
|
pp |
|
pp |
passe de vérifications supplémentaires : (pv)
|
pv |
|
pv |
|
pv |
|
pv |
|
pv |
|
pv |
passe d’exécution : (pe)
|
pe |
|
pe |
|
pe |
|
pe |
|
pe |
|
pe |
Séquence des passes si DEBUT (PAR_LOT : ‘NON’)
- C_O1 pv
- C_O1 pe
- C_S1 pp
- C_O4 pv
- C_O4 pe
- C_O5 pv
- C_O5 pe
- C_O2 pv
- C_O2 pe
- C_S2 pp
- C_S2 pv
- C_S2 pe
- C_O3 pv
- C_O3 pe