Micro Systèmes n°103 décembre 1989
Micro Systèmes n°103 décembre 1989
  • Prix facial : 30 F

  • Parution : n°103 de décembre 1989

  • Périodicité : mensuel

  • Editeur : Société Parisienne d'Edition

  • Format : (203 x 271) mm

  • Nombre de pages : 222

  • Taille du fichier PDF : 182 Mo

  • Dans ce numéro : la recherche française en informatique.

  • Prix de vente (PDF) : gratuit

Dans ce numéro...
< Pages précédentes
Pages : 196 - 197  |  Aller à la page   OK
Pages suivantes >
196 197
TECHNIQUE A partir de celles-ci, appelées primitives, des fonctions de manipulation de base des atomes comme "+" et "DE" l'ensemble des fonctions formant le système LISP peut être défini. Structure interne de l'interpréteur LISP L'interpréteur LISP fait partie de la sémantique du langage LISP. On ne va donc pas rechercher le classique découpage analyseur lexical/analyseur syntaxique/machine virtuelle. Mais on va suivre une structure qui correspond aux différentes fonctions internes de l'interpréteur. On va distinguer trois parties principales : — la partie de gestion/initialisation de l'interpréteur ; — les primitives LISP : "EQ", "CAR", "CDR", "CONS", "EVAL" ; — les autres fonctions LISP internes à l'interpréteur : les fonctions de manipulation des atomes ; les fonctions d'Entrée/Sortie ; les fonctions de gestion de la mémoire. Pour décrire l'interpréteur, la première étape consiste à définir les structures de données permettant de manipuler les objets du langage. On a vu principalement trois objets : les listes, les symboles et les nombres dont voici les types correspondants : typedef long objet/* l'objet generique./typedef short entier/* les nombres entiers "I typedef struct (objet car ; objet cdr ; 1 doublet ; /* le doublet : lien de liste */typedef struct ptchar nom ; /* pointeur sur le nom du symbole */objet cval ; /* valeur du symbole comme argument */.nt ftype ; /* type de fonction (interne ou utilisateur)./union/* valeur du symbole comme fonction./objet (*subr)() ; I. fonction interne */objet expr ; /. fonction "liste" */I fval ; 1 syrbc: ; /* le symbole */Ces quatre types sont les structures de données essentielles de l'interpréteur. H faut noter qu'un nombre, un symbole ou une liste peuvent être tous trois définis par une variable du type générique « objet ». Elle représente le nombre lui-même, le pointeur sur le symbole ou le pointeur vers le premier doublet de la liste. Pour des raisons d'optimisation mémoire et de performance, on a choisi de prendre pour le type « objet » un type simple du langageC, ce qui pose le problème de pouvoir retrouver le type LISP de celui-ci (liste, symbole ou entier) en fonction de sa valeur. La valeur 0 est réservée à NIL. L'allocation des doublets et des symboles se fera dans deux zones mémoire distinctes délimitées une par les variables "de_doub" et "fi_doub", l'autre par "de_symbol" et "fi_symbol". Pour coder les entiers de —32768 à 32767, on utilise une zone mémoire de 65 536 octets. L'entier 0 sera un pointeur sur le premier octet de cette zone et —1 (Oxffff) sur le dernier. La zone mémoire choisie doit être disjointe des zones réservées aux symboles et aux doublets et doit être de préférence une zone interdite aux données (contenant du code ou réservée au système d'exploitation). Voici les macros gérant les conversions pointeur-entier dans une zone mémoire allant de Ox10000 à Ox lffff : 196 - MICRO-SYSTEMES #defineMASKINT OxffffL #defineTAGINT 0x100001 #defineFROMINT(a) ((objet)(((unsigned)(a)&MASKINTflTAGINT)) #defineTOINT(e) ((short)(MASKINT&(unsigned)(a))) Le codage d'entiers à l'intérieur de champs pointeurs est évidemment machine-dépendant, d'une part pour le choix de la zone mémoire et, d'autre part, pour la taille des types pointeurs. Une implémentation comme celle donnée ici impose une représentation des entiers comme des « short » sur 16 bits et des pointeurs comme des « long » sur 32 bits. Cela ne pose généralement pas de problème, sauf sur PC où, pour certains compilateurs, cela nécessite l'emploi de pointeurs longs normalisés généralement introduits par le mot réservé « huge ». Nous abordons maintenant la description des différentes parties de l'interpréteur. Le module principal C'est le gestionnaire de l'interpréteur. Il a deux rôles : l'initialisation du système et la gestion du fonctionnement de l'interpréteur. L'initialisation de l'interpréteur porte sur deux éléments principaux : — Allocation de la mémoire pour les différentes données. — Initialisation de la table des symboles avec les fonctions internes de l'interpréteur. L'allocation de la mémoire concerne les différentes structures de l'interpréteur : la table des symboles, la zone des doublets, une pile interne et une zone de gestion des noms des symboles. Une fois allouées, ces zones sont initialisées à 0 (ou NIL), sauf pour la zone des doublets. Ceux-ci sont chaînés entre eux pour former la liste des doublets libres, la tête de liste sera pointée par une variable globale "pt_doub". Cette étape terminée, on remplit la table des symboles avec les fonctions internes à l'interpréteur. Cette initialisation se fait à l'aide de la fonction "entre_subr()", dont le premier paramètre est la fonction interne correspondant au symbole, le second le type de cette fonction et le dernier l'identificateur du symbole. Voici un exemple d'initialisation : objet f_car() ; entre_subr(f_car,SUBR,"CAR") ; la fonction "entre_subr()" est très simple : entre_subr(fction,type,nom) objet (.fction)() ; entier type ; ptchar nom ; ptsymbol cur ; cur = trouve_ptr(nom) ; cur->ftype = type ; cur->fval.subr = fction ; La fonction "trouve_ptr()" gère la table des symboles, elle retourne un pointeur sur le symbole correspondant au nom. Ceci constitue la totalité des initialisations. Une fois cel- Décembre 1989
PROGRAMMATION les-ci achevées, on entre dans la partie principale de l'interpréteur. La boucle de gestion de l'interpréteur est minimale puisque l'interpréteur est pratiquement inclus dans le langage LISP. Il suffit de mettre en oeuvre les fonctions internes correspondantes, ce qui donne : memo=pt_doub ; pt_doub=(ptdoublet)(pt_doub->cdr) ; memo->ca=ca ; memo->cdr.cd ; return((objet)(memo)) ; main(argc,argv) int argc ; char..argv ; analyse_arguments(argc,argv) ; finit (; setjmp(env) ; while(1) f_print (f_eval (f_read())) ; "analyse_arguments()" analyse les paramètres d'appel de l'interpréteur ; ceux-ci peuvent être soit la taille de la table des symboles, soit le choix du prompt de l'interpréteur. "init()" effectue les initialisations de l'interpréteur. "setjmp()" est la fonction de bibliothèque d'initialisation de sauts non locaux qui est très souvent utilisée comme point de reprise après une erreur. L'interpréteur possède à sa disposition un certain nombre de macros ; ERRNOCAR, ERRNOCDR, ERRLIA... provoquant l'affichage d'un message et un saut non local vers "setjmp(env)". La fonction "f_printQ" est la fonction interne équivalant à la fonction LISP "PRINT" qui affiche la liste passée en argument, La fonction "f_evalQ" correspond à la primitive "EVAL" qui évalue son argument et la fonction "f_readQ" constitue l'équivalent interne de la fonction "READ" qui retourne la liste lue en entrée. Un interpréteur LISP s'écrirait de la même manière en LISP. Les primitives Les primitives sont lês cinq fonctions de base de l'interpréteur LISP. Quatre d'entre elles sont très simples : CAR, CDR, EQ, CONS. objet f car(obj) objet oFj ; return((obj==NIL) ? NIL : (((ptdOublet)obj>=de_doub&d((ptdoublet)objcar : ERRNOCAR) ; objet f_cdr(obj) objet obj ; return(lobj==N/L) ? NIL : (((ptdoublet)obj>=de_doub&S,(ptdoublet)objcdr : ERRNOCDR) ; objet objet f eq(x,y) x,7 ; return((objet)(x==y ? true:NIL)) ; objet f_cons(ca,cd) objet ca,cd ; doublet memo ; Ces fonctions peuvent être appelées de façon externe par l'intermédiaire d'un symbole ou de façon interne par les autres fonctions internes. Pour des raisons d'optimisation, on définira pour CAR, CDR et EQ des macros pour l'utilisation interne. L'évaluateur, qui est constitué par la fonction "EVAL", est la partie la plus complexe de l'interpréteur. Il va avoir deux rôles. Il va générer l'appel à une fonction interne (SUBR) de l'interpréteur quand le CAR de la liste à évaleur est un atome représentant une telle fonction. Si le CAR est un atome représentant une fonction utilisateur (EXPR), il va faire le lien entre la liste des arguments de la lambda-expression et le CDR de la liste évaluée pour ensuite réévaluer le résultat. Voici un codage simplifié de EVAL : objet f_eval(list) objet list ; objet calist ; objet cdlist ; if (NULL(list)) return(NIL) ; if (ENTIERP(list)) return(list) ; if (SYMBOLP(list)) return((objet)(((ptsymbol)list)->cval)) ; cdlist = CDR(list) ; calist = CAR(list) ; if (NULL(calist)) return(NULL(cdlist)PNIL:ERREVA) ; if (! SYMBOLP(calist)) ERREVA ; switch (((ptsymbol)calist)->ftype) I case SUBR : return ((.((ptsymbol)calist)->fval.subr)(cdlist)) ; case EXPR : (objet memo ; objet relist ; calist = ((ptsymbol)calist)->fval.expr ; memo = save_envrt (CAR(calist)) ; liens (CAR(calist),cdlist) ; utlist = CDR(calist) ; relist = NIL ; white (INULL(utlist)) I relist = f eval(CAR(utlist)) ; utlist CER (utlist) ; restaure_envrt (memo) ; return (relist) ; default : ERREVA ; Les macros ENTIERP, SYMBOLP, NULL déterminent si leur argument est un entier, un symbole ou NIL. La fonction "save_envrt()" sauvegarde les valeurs des variables qui servent de paramètres à la fonction évaluée. Les liaisons qui vont être effectuées pour l'évaluation seront valables globalement. Les liaisons sont faites par la fonction "liens()" dont voici l'implémentation : liens(l_var,l_val) objet l_var ; objet l_val ; if (NULL(l_var)) if (NULL(l_val)) return, Décembre 1989 MICRO-SYSTEMES - 197



Autres parutions de ce magazine  voir tous les numéros


Liens vers cette page
Couverture seule :


Couverture avec texte parution au-dessus :


Couverture avec texte parution en dessous :


Micro Systèmes numéro 103 décembre 1989 Page 1Micro Systèmes numéro 103 décembre 1989 Page 2-3Micro Systèmes numéro 103 décembre 1989 Page 4-5Micro Systèmes numéro 103 décembre 1989 Page 6-7Micro Systèmes numéro 103 décembre 1989 Page 8-9Micro Systèmes numéro 103 décembre 1989 Page 10-11Micro Systèmes numéro 103 décembre 1989 Page 12-13Micro Systèmes numéro 103 décembre 1989 Page 14-15Micro Systèmes numéro 103 décembre 1989 Page 16-17Micro Systèmes numéro 103 décembre 1989 Page 18-19Micro Systèmes numéro 103 décembre 1989 Page 20-21Micro Systèmes numéro 103 décembre 1989 Page 22-23Micro Systèmes numéro 103 décembre 1989 Page 24-25Micro Systèmes numéro 103 décembre 1989 Page 26-27Micro Systèmes numéro 103 décembre 1989 Page 28-29Micro Systèmes numéro 103 décembre 1989 Page 30-31Micro Systèmes numéro 103 décembre 1989 Page 32-33Micro Systèmes numéro 103 décembre 1989 Page 34-35Micro Systèmes numéro 103 décembre 1989 Page 36-37Micro Systèmes numéro 103 décembre 1989 Page 38-39Micro Systèmes numéro 103 décembre 1989 Page 40-41Micro Systèmes numéro 103 décembre 1989 Page 42-43Micro Systèmes numéro 103 décembre 1989 Page 44-45Micro Systèmes numéro 103 décembre 1989 Page 46-47Micro Systèmes numéro 103 décembre 1989 Page 48-49Micro Systèmes numéro 103 décembre 1989 Page 50-51Micro Systèmes numéro 103 décembre 1989 Page 52-53Micro Systèmes numéro 103 décembre 1989 Page 54-55Micro Systèmes numéro 103 décembre 1989 Page 56-57Micro Systèmes numéro 103 décembre 1989 Page 58-59Micro Systèmes numéro 103 décembre 1989 Page 60-61Micro Systèmes numéro 103 décembre 1989 Page 62-63Micro Systèmes numéro 103 décembre 1989 Page 64-65Micro Systèmes numéro 103 décembre 1989 Page 66-67Micro Systèmes numéro 103 décembre 1989 Page 68-69Micro Systèmes numéro 103 décembre 1989 Page 70-71Micro Systèmes numéro 103 décembre 1989 Page 72-73Micro Systèmes numéro 103 décembre 1989 Page 74-75Micro Systèmes numéro 103 décembre 1989 Page 76-77Micro Systèmes numéro 103 décembre 1989 Page 78-79Micro Systèmes numéro 103 décembre 1989 Page 80-81Micro Systèmes numéro 103 décembre 1989 Page 82-83Micro Systèmes numéro 103 décembre 1989 Page 84-85Micro Systèmes numéro 103 décembre 1989 Page 86-87Micro Systèmes numéro 103 décembre 1989 Page 88-89Micro Systèmes numéro 103 décembre 1989 Page 90-91Micro Systèmes numéro 103 décembre 1989 Page 92-93Micro Systèmes numéro 103 décembre 1989 Page 94-95Micro Systèmes numéro 103 décembre 1989 Page 96-97Micro Systèmes numéro 103 décembre 1989 Page 98-99Micro Systèmes numéro 103 décembre 1989 Page 100-101Micro Systèmes numéro 103 décembre 1989 Page 102-103Micro Systèmes numéro 103 décembre 1989 Page 104-105Micro Systèmes numéro 103 décembre 1989 Page 106-107Micro Systèmes numéro 103 décembre 1989 Page 108-109Micro Systèmes numéro 103 décembre 1989 Page 110-111Micro Systèmes numéro 103 décembre 1989 Page 112-113Micro Systèmes numéro 103 décembre 1989 Page 114-115Micro Systèmes numéro 103 décembre 1989 Page 116-117Micro Systèmes numéro 103 décembre 1989 Page 118-119Micro Systèmes numéro 103 décembre 1989 Page 120-121Micro Systèmes numéro 103 décembre 1989 Page 122-123Micro Systèmes numéro 103 décembre 1989 Page 124-125Micro Systèmes numéro 103 décembre 1989 Page 126-127Micro Systèmes numéro 103 décembre 1989 Page 128-129Micro Systèmes numéro 103 décembre 1989 Page 130-131Micro Systèmes numéro 103 décembre 1989 Page 132-133Micro Systèmes numéro 103 décembre 1989 Page 134-135Micro Systèmes numéro 103 décembre 1989 Page 136-137Micro Systèmes numéro 103 décembre 1989 Page 138-139Micro Systèmes numéro 103 décembre 1989 Page 140-141Micro Systèmes numéro 103 décembre 1989 Page 142-143Micro Systèmes numéro 103 décembre 1989 Page 144-145Micro Systèmes numéro 103 décembre 1989 Page 146-147Micro Systèmes numéro 103 décembre 1989 Page 148-149Micro Systèmes numéro 103 décembre 1989 Page 150-151Micro Systèmes numéro 103 décembre 1989 Page 152-153Micro Systèmes numéro 103 décembre 1989 Page 154-155Micro Systèmes numéro 103 décembre 1989 Page 156-157Micro Systèmes numéro 103 décembre 1989 Page 158-159Micro Systèmes numéro 103 décembre 1989 Page 160-161Micro Systèmes numéro 103 décembre 1989 Page 162-163Micro Systèmes numéro 103 décembre 1989 Page 164-165Micro Systèmes numéro 103 décembre 1989 Page 166-167Micro Systèmes numéro 103 décembre 1989 Page 168-169Micro Systèmes numéro 103 décembre 1989 Page 170-171Micro Systèmes numéro 103 décembre 1989 Page 172-173Micro Systèmes numéro 103 décembre 1989 Page 174-175Micro Systèmes numéro 103 décembre 1989 Page 176-177Micro Systèmes numéro 103 décembre 1989 Page 178-179Micro Systèmes numéro 103 décembre 1989 Page 180-181Micro Systèmes numéro 103 décembre 1989 Page 182-183Micro Systèmes numéro 103 décembre 1989 Page 184-185Micro Systèmes numéro 103 décembre 1989 Page 186-187Micro Systèmes numéro 103 décembre 1989 Page 188-189Micro Systèmes numéro 103 décembre 1989 Page 190-191Micro Systèmes numéro 103 décembre 1989 Page 192-193Micro Systèmes numéro 103 décembre 1989 Page 194-195Micro Systèmes numéro 103 décembre 1989 Page 196-197Micro Systèmes numéro 103 décembre 1989 Page 198-199Micro Systèmes numéro 103 décembre 1989 Page 200-201Micro Systèmes numéro 103 décembre 1989 Page 202-203Micro Systèmes numéro 103 décembre 1989 Page 204-205Micro Systèmes numéro 103 décembre 1989 Page 206-207Micro Systèmes numéro 103 décembre 1989 Page 208-209Micro Systèmes numéro 103 décembre 1989 Page 210-211Micro Systèmes numéro 103 décembre 1989 Page 212-213Micro Systèmes numéro 103 décembre 1989 Page 214-215Micro Systèmes numéro 103 décembre 1989 Page 216-217Micro Systèmes numéro 103 décembre 1989 Page 218-219Micro Systèmes numéro 103 décembre 1989 Page 220-221Micro Systèmes numéro 103 décembre 1989 Page 222