Un langage symbolique destiné à l'enseignement : LSE
Jacques Hebenstreit, Yves Noyelle
Dans le cadre de l'effort entrepris depuis deux ans par le Ministère de l'Éducation nationale, et plus précisément par Monsieur le Chargé de Mission à l'informatique auprès du Ministère, pour introduire l'informatique dans l'enseignement secondaire, la décision a été prise d'implanter un certain nombre de systèmes en temps partagé dans des lycées, tant à Paris qu'en province.
Dès lors se posait le problème du langage de programmation à implémenter sur ces systèmes, et ceci dans le cadre d'un certain nombre de contraintes :
Les « mots réservés » du langage devaient nécessairement appartenir à la langue française car il eut été impensable, compte tenu du temps consacré à l'enseignement du français dans le secondaire, d'obliger les élèves à utiliser l'anglais pour communiquer avec un ordinateur, sans compter que l'on risquait ainsi implicitement de faire apparaître aux yeux des élèves l'anglais comme la langue privilégiée de communication avec les ordinateurs.
La décision ayant été prise, de ne pas introduire l'Informatique comme une discipline supplémentaire dans l'enseignement secondaire mais de tenter de transmettre aux élèves la méthodologie de l'informatique su travers des disciplines existantes moyennant un recyclage des professeurs, il fallait un langage adapté à ce but.
Le langage devait être conversationnel tant à la compilation qu'à l'exécution, afin de faciliter l'accès au système à la fois aux professeurs et aux élèves.
Le langage devait pouvoir être utilisable à la fois par les scientifiques et par les littéraires, en vue de leurs applications spécifiques.
Le langage devait comporter un noyau minimal, facile à apprendre et à utiliser mais, étant destiné à l'enseignement, il devait également, pour des raisons pédagogiques, offrir les possibilités des langages évolués (procédures avec appel par valeur et appel par nom, récursivité, fonctions d'une complexité raisonnable, etc.).
Une restriction majeure provenait du fait que ce langage devait être implémenté en temps partagé sur un mini-ordinateur (16 Koctets, un disque de 100 Koctets et 8 terminaux).
1. Les instructions arithmétiques
Ce sont pratiquement celles du langage ALGOL, à ceci près que toutes les variables sont de type réel (pas de variable entière). Compte tenu de la faible taille mémoire, on a introduit l'instruction LIBERER qui permet de rendre disponible l'espace pris en mémoire par des variables ou des tableaux. Ceci permet de pallier l'absence de bloc, Pour faciliter l'écriture des programmes de simulation, on a ajouté aux fonctions classiques la fonction ALE(1) qui donne à chaque appel, un nombre aléatoire compris entre 0 et 1 (bornes exclues).
2. Les instructions sur chaînes de caractères
On distingue les constantes-chaîne qui doivent être écrites entre apostrophes et les variables-chaîne auxquelles on peut affecter des chaînes de caractères.
Les variables-chaîne doivent être déclarées de type CHAINE.
Exemple :
CHAINE DATE
DATE = '11 AVRIL 1972'
2.1. Les opérateurs-chaîne
Il n'y en a qu'un, à savoir l'opérateur de concaténation qui s'écrit !.
Exemple :
X = 1
REMISE = 'RABAIS 1 DE' ! X
2.2. Les fonctions portant sur les chaînes
2.2.1. Fonctions ayant pour résultat une chaîne a
a) Fonction sous-chaîne (SCH)
Cette fonction permet d'extraire une sous-chaîne d'une chaîne.
SCH(α β, y ,δ) est une expression-chaîne dont la valeur donne la chaîne origine est une expression arithmétique désignant la position du premier caractère de la sous-chaîne dans la chaîne y est le critère d'arrêt de la sous-chaîne ; si c'est une expression arithmétique, sa valeur indique la longueur de la sous-chaîne ; si c'est une chaîne, elle est considérée comme une liste de caractères d'arrêt, à savoir que la sous-chaîne s'arrêtera lors de la rencontre de l'un quelconque des caractères d'arrêt, d, est un paramètre optionnel ; ce doit être une variable arithmétique à laquelle la fonction SCH affectera soit le numéro de la position du premier caractère non inclus dans la sous-chaîne, soit la longueur de la chaîne origine augmentée d'une unité si la sous-chaîne inclut le dernier caractère de la chaîne.
Exemples :
SCH ('ABCD',2,2,J) donne 'BC' avec J=4
SCH ('ABCD'3,4,L) donne 'CD' avec L=5
SCH ('AB'!'CD :E',2,' ; :') donne 'BCD'
b) Fonction groupe de lettres (GRL)
Elle s'écrit : GRL(α, β, δ)
Cette fonction permet d'extraire d'une chaîne de caractères quelconques une sous-chaîne formée exclusivement de lettres.
Les paramètres α, β et δ ont le même rôle que ci-dessus.
La fonction GRL analyse la chaîne origine de gauche à droite, à partir de la position indiquée par b. Tous les caractères qui ne sont pas des lettres sont sautés et, à partir de la rencontre d'une lettre, on recopie toutes les lettres rencontrées jusqu'à ce que se présente un caractère qui n'est pas une lettre ou la fin de la chaîne d'origine.
Exemple :
GRL ('JE_ _SUIS, DONC',4,K) donne 'SUIS' et K=10.
c) Fonction conversion en caractères (CCA)
Elle s'écrit : CCA(α)
Cette fonction permet d'obtenir une chaîne de caractères représentant un nombre ; la valeur de ce nombre est obtenue en effectuant l'expression arithmétique b.
Exemple :
CCA (3+0.125) donne '3.125'
CCA (2-5) donne '-3'
On notera que le résultat est une chaîne de caractères et non un nombre.
d) Fonction équivalent caractère (EQC)
Elle s'écrit : EQC(α)
Cette fonction a pour résultat une chaîne de un caractère dont l'équivalent numérique en code ASCII est la valeur de l'expression arithmétique M (b doit être non négatif et inférieur à 128).
Exemple :
EQC(65) donne 'A'
e) Fonction date (DAT)
Cette fonction n'a pas d'argument et donne, sous forme d'une chaîne de caractères, la date et l'heure courante.
Exemple :
Si DAT est exécuté le 3 novembre 1971 à 13h 3min 52s,
on obtiendra '03/11/71 _ 13 :03 :52'
2.2.2 - Fonctions ayant un résultat numérique
a) Fonction longueur (LGR)
Elle s'écrit LGR(α)
Cette fonction donne la longueur de la chaîne après évaluation de l'expression-chaîne α .
Exemple :
LGR('LA'! ' _ CHAÎNE') donne 9.
b) Fonction position (POS)
Elle s'écrit POS(α, β, y) α et y sont des expressions-chaînes et β une expression arithmétique.
Cette fonction permet de déceler si, à partir de la position β de la chaîne α, il existe une chaîne identique à y. La valeur de la fonction est la position du premier caractère d où commence la chaîne y ; si y n'existe pas dans d, le résultat de POS est zéro.
Exemple :
POS ('CABCABD',1, 'AB') donne 2
POS ('CABCABD',3, 'AB') donne 5
c) Fonction conversion numérique (CNB)
Elle s'écrit : CNB (α, β, δ)
Cette fonction convertit une chaîne de caractères représentant un nombre bien constitué en son équivalent numérique. La conversion de la chaîne α commence à la position définie par β tandis que δ (qui est une variable) contient la position du premier caractère qui a arrêté la conversion.
Exemple :
CNB('23%~OU J 6',1,J) donne 23 avec J=3.
d) Fonction équivalent numérique (EQN)
Elle s'écrit : EQN(α, β)
Cette fonction donne l'équivalent numérique (code ASCII) du caractère ayant la position β dans la chaîne α.
e) Fonction pointeur (PTR)
Elle s'écrit : PTR (α, β, y)
La valeur de la fonction PTR est la même que celle du paramètre ci dans la fonction SCH(α, β, y, δ).
f) Fonction saut (SKP)
Elle s'écrit : SKP (α, β, y)
Cette fonction permet d'obtenir la position dans la chaîne du premier caractère différent de tous ceux qui figurent dans la chaîne y.
Exemple :
SKP('_._; H', 1, '_; ,') résultat : 5.
3. Les instructions de contrôle
a) L'instruction de rupture de séquence s'écrit ALLER EN, suivi d'une étiquette qui doit être un nombre (toutes les lignes sont numérotées et il peut y avoir plusieurs instructions par ligne).
b) Les instructions conditionnelles s'écrivent :
SI (condition) ALORS i1
SI (condition) ALORS i1 SINON i2
plusieurs instructions conditionnelles peuvent être imbriquées (dans ce cas, chaque SINON est associé au SI immédiatement précédant, qui n'avait pas encore de SINON associé).
Exemple :
SI A = B ALORS SI x = 0 ALORS i1 SINON i2 sera interprété comme
SI A = B ALORS (SI x = 0 ALORS i1 SINON i2)
c) Il existe des instructions composées (au sens d'ALGOL) commençant par DEBUT et s'achevant par FIN.
d) Les expression booléennes (au sens d'ALGOL) font partie du langage.
e) Il existe une instruction de boucle qui n'écrit :
FAIRE e pour V ← ea1 PAS ea2 JUSQUA ea3
FAIRE e pour V ← ea1 PAS ea2 TANT QUE eb
où e est une étiquette, eal, ea2 et ea3 des expressions arithmétiques et eb une expression booléenne.
f) L'instruction PAUSE arrête l'exécution du programme en coure et entraîne l'impression, à la console, du numéro de la ligne où ce trouve l'instruction PAUSE. Si cette instruction as trouve dans le corps d'une procédure, on imprime, en plus, le numéro de la ligne d'où l'on a appelé la procédure. L'utilisateur peut, par ailleurs, reprendre l'exécution au point où il s'est arrêté (voir le langage de commande ci-dessus).
g) L'instruction EXECUTER permet d'appeler un programme rangé en mémoire auxiliaire, à partir d'un programme en coure d'exécution. Cette instruction a été prévue pour pallier la faible taille mémoire du système ; elle permet, en effet, de fractionner les progression, main le passage d'information du programme appelant au programme appelé doit se faire par l'intermédiaire de fichiers.
h) L'instruction d'entrée n'écrit LIRE et l'instruction de sortie n'écrit AFFICHER avec toutes les possibilités de mise en page.
i) Les instructions de rangement et de chargement. L'instruction de rangement permet de garer des informations dans une mémoire auxiliaire, informations qui pourront être relues par un autre programme ou par le même programme, grâce à l'instruction de chargement.
L'information est garée soue forme d'enregistrements ; chaque enregistrement peut contenir soit un tableau, soit une variable-chaîne, soit une variable simple.
Un fichier est un ensemble d'enregistrements. Chaque fichier sera repéré par un nom de fichier qui est une chaîne de caractères ; à chacun des enregistrements d'un fichier sera affecté un numéro. La taille d'un enregistrement est quelconque mais ne peut dépasser la taille de la mémoire centrale.
L'instruction de rangement s'écrit GARER α, β, y
α est le nom du fichier, β est une expression arithmétique qui est le numéro de l'enregistrement et y est un identificateur (nom de tableau, de variable-chaîne ou de variable simple).
Exemple :
CHAINE XA ; XA ← 'LUNDI' ; GARER XA,3,'CAL' ;
L'exécution rangera la chaîne 'LUNDI' dans le troisième enregistrement du fichier CAL.
L'instruction de chargement s'écrit CHARGER α, β , y , δ
α, β et y ont la même signification que ci-dessus ; δ est un nom de variable arithmétique.
L'instruction CHARGER déclare implicitement la nature de α au moment du chargement en mémoire. En faisant imprimer la valeur de d après exécution de l'instruction CHARGER, on obtient une information supplémentaire indiquant si le fichier existe, si l'enregistrement existe, ou la nature de l'information chargée (variable simple, tableau ou variable-chaîne).
EXECUTER A PARTIR DE n1, n2 : fait passer la console en mode « exécution », l'exécution commençant à la ligne n1 et s'arrêtant à la ligne n2. Si n2 est absent, on exécute jusqu'à la fin.
CONTINUER : reprend l'exécution interrompue par l'instruction PAUSE.
REPRENDRE EN n : permet de continuer l'exécution mais à partir d'une ligne différente de celle où l'on s'est arrêté.
PAS A PAS : utilisée avant la commande EXECUTER ou CONTINUER, entraîne l'arrêt après l'exécution de chaque ligne.
NORMAL : annule l'effet de la commande PAS A PAS.
Le système de temps partagé étant muni d'une bibliothèque, on a ajouté un certain nombre de commandes permettant de gérer cette bibliothèque.
Avant de créer ou de modifier un fichier de la bibliothèque, il faut utiliser la commande IDENTIFICATION n, où n est un numéro de compte propre à l'utilisateur. Les numéros de compte légaux sont fournis au système au moment où celui-ci est lancé, en précisant les attributs des divers numéros (taille et type de fichiers permis, etc.).
RANGER (nom de fichier) : gare une image du programme dans la bibliothèque.
APPELER (nom de fichier) : charge en mémoire le programme précédemment garé dans la bibliothèque.
SUPPRIMER (nom du fichier) : élimine un programme de la bibliothèque.
MODIFIER (non de fichier) : remplace un programme par le programme courant de l'utilisateur.
CATALOGUER nom1, nom2 : rend permanent, sous l'appellation nom2, le fichier temporaire (obtenu par l'instruction GARER nom1).
4. Le langage de commande
Les principales commandes sont les suivantes :
BONJOUR : à utiliser lorsque l'utilisateur arrive à la console ; cette commande fait passer la console du mode « dormant » au mode « moniteur ».
AU REVOIR : à utiliser en quittant la console ; ceci remet la console dans l'état « dormant ».
LISTER A PARTIR DE n1, n2 : affiche à la console le programme de l'utilisateur depuis la ligne n1 jusqu'à la ligne n2.
NUMERO A PARTIR DE n1, n2 : affiche uniquement les numéros de ligne utilisés dans le programme.
EFFACER LIGNES n1, n2, ... , ni : supprime dans 1e programme les lignes correspondantes.
EXECUTER A PARTIR DE n1, n2 : fait passer la console en mode « exécution », l'exécution commençant à la ligne n1 et s'arrêtant à la ligne n2. Si n2 est absent, on exécute jusqu'à la fin.
CONTINUER : reprend l'exécution interrompue par l'instruction PAUSE.
REPRENDRE EN n1 : permet de continuer l'exécution mais à partir d'une ligne différente de celle où l'on s'est arrêté.
PAS A PAS : utilisée avant la commande EXECUTER ou CONTINUER, entraîne l'arrêt après l'exécution de chaque ligne.
NORMAL : annule l'effet de la commande PAS A PAS.
Le système de temps partagé étant muni d'une bibliothèque, on a ajouté un certain nombre de commandes permettant de gérer cette bibliothèque.
Avant de créer ou de modifier un fichier de la bibliothèque, il faut utiliser la commande IDENTIFICATION n, où n est un numéro de compte propre à l'utilisateur. Les numéros de compte légaux sont fournis au système au moment où celui-ci est lancé, en précisant les attributs des divers numéros (taille et type de fichiers permis, etc.).
RANGER (nom de fichier) : gare une image du programme dans la bibliothèque.
APPELER (nom de fichier) : charge en mémoire le programme précédemment garé dans la bibliothèque.
SUPPRIMER (nom du fichier) : élimine un programme de la bibliothèque.
MODIFIER (non de fichier) : remplace un programme par le programme courant de l'utilisateur.
CATALOGUER nom1, nom2 : rend permanent, sous l'appellation nom2, le fichier temporaire (obtenu par l'instruction GARER nom1).
5. Le mode machine de bureau
Chaque fois que le système est en mode « moniteur », il est possible d'utiliser la console en mode « machine de bureau ». On peut ainsi, après PAUSE, obtenir la valeur d'une variable du programme courant en affichant son nom suivi du signe = ; on peut également effectuer tous calculs en écrivant les expression arithmétiques correspondantes.
Enfin, si l'on a, en machine de bureau, changé la valeur de variables figurant dans le programme, la valeur prise en compte lorsqu'on utilise CONTINUER est la dernière valeur affectée à ces variables en mode de machine de bureau.
6. Conclusions
On a essayé d'inclure dans un même langage les instructions arithmétiques et des instructions de manipulation de chaînes, ainsi que des commandes facilitant l'utilisation du système en temps partagé Un certain nombre d'options qui paraissaient utiles ont cependant dfl être abandonnées à cause de la taille du système et, plus particulièrement, à cause de la faible taille mémoire.
On aurait naturellement pu étendre le langage mais au détriment de l'efficacité, c'est-à-dire en allongeant le temps d'attente moyen à la console.
Jacques Hebenstreit
Yves Noyelle
Paru dans le Bulletin de l'EPI n° 6 de décembre 1973, p. 10-18.
|