Chap. 7. Gestion de la mémoire à l exécution Il existe 2 allocations mémoires : 1. statique (à la compilation). 2. dynamique (à l exécution). La gestion de la mémoire à l exécution est plus délicate. Certains langages (comme Fortran) n autorise que l allocation statique de la mémoire. M. KRAJECKI 1 Licence Informatique 1. Gestion de la mémoire par allocation statique 2 étapes 1. À la compilation : le compilateur calcule la taille mémoire nécessaire à la bonne exécution du programme. 2. À l exécution : le système d exploitation vérifie s il dispose d assez de mémoire pour exécuter le programme ; dans le cas contraire, l exécution est annulée. M. KRAJECKI 2 Licence Informatique
2. Allocation dynamique de la mémoire L utilisation d une pile et éventuellement d un tas (pour l allocation des variables) est nécessaire pour : allouer de la mémoire ; autoriser l appel de fonctions et procédures. Pascal et C utilisent une pile pour effectuer ces opérations. M. KRAJECKI 3 Licence Informatique Organisation de la mémoire Pour exécuter un programme, il faut placer en mémoire : le code cible du programme ; les données (allouées statiquement) ; la pile et le tas (si nécessaire). Par convention, la taille de la pile augmente quand l adresse du sommet diminue Code Code Données / constantes Données / constantes Tas sommet de la pile Pile Gestion sans tas Pile Gestion avec un tas M. KRAJECKI 4 Licence Informatique
Organisation de la mémoire Quand un module veut s exécuter, on lui donne la mémoire nécessaire à sa bonne exécution. Quand le module se termine, on lui reprend la mémoire durée de vie d une variable = temps d exécution du module où elle est définie. Les définitions de fonctions autorisées en C et en Pascal sont différentes : en C, il n existe qu un seul niveau d utilisation En Pascal, il existe plusieurs niveaux d utilisations : il est possible de définir localement une fonction dans une fonction. M. KRAJECKI 5 Licence Informatique Un enregistrement d activation d une fonction C main( ) { un seul niveau d utilisation } P( ) { mais le récursivité est autorisée } Q( ) { } Q( ) Q( ) P( ) main( ) Mémoire statique Appel récursif Pile d exécution M. KRAJECKI 6 Licence Informatique
Un enregistrement d activation d une fonction C SP (pour Stack Pointer : un registre) est une base par rapport à laquelle on recherche les informations du module dont les données sont au sommet de la pile d exécution. p(t1, t2,..., tn) n emplacement pour tn... emplacement pour t2 emplacement pour t1 enregistrement d activation du module p M. KRAJECKI 7 Licence Informatique Un enregistrement d activation d une fonction C On ne peut pas toujours recalculer la valeur SP du module appelant : nous devons donc sauvegarder cette valeur. Il faut également pouvoir reprendre l exécution du module appelant au bon endroit (exécution de la prochaine instruction) : il faudra également sauvegarder l adresse de retour. Enfin, nous devons prévoir un emplacement mémoire pour sauvegarder le résultat de la fonction. M. KRAJECKI 8 Licence Informatique
Un enregistrement d activation d une fonction C mémoires locales mémoires temporaires ancienne valeur de SP adresse de retour résultat Accès à une variable : SP courant + décalage nombre de paramètres paramètres M. KRAJECKI 9 Licence Informatique Génération de code pour l appel de fonction La grammaire : Instr Flist id(flist) Flist, E E Problème : comme pour les tableaux, nous aurons besoin du nom de la fonction pour générer l enregistrement d activation. Donc : Instr Flist Flist) Flist, E id(e M. KRAJECKI 10 Licence Informatique
B # Génération de code pour l appel de fonction Que faut-il faire avant l appel de la fonction? Au début et à la fin de l appel? Rappel : en C, seul le passage par valeur est autorisé. Supposons que p(t1,..., tn) soit la prochaine instruction : il faudra empiler la valeur de chaque paramètre sur la pile ; on suppose qu un attribut place est défini pour chaque ti. La fonction empiler peut être définie ainsi : empiler(x){ *top = x ; /* top est l adresse mémoire */ top = top -1 ; /* du sommet de la pile */ } M. KRAJECKI 11 Licence Informatique Génération de code pour l appel de fonction "! { $#%# &,- 0 & (')+*.(/ 1*32 } 4 5 6&798 :5;< "! { $#%# & 0 =798 :% (')+* (') & 0 > 5 6&798 :< 1* @?A2 } 4 5 6 { 5 6C D#%#6/ EF 9 6 ;C;;< $G<H 6 C (')I#%# 5J ; KMLONP; ;5KMLON taille de la valeur de retour # RQSN #%#C/ RQSNUTWVXKMLON?A2$#C/ } M. KRAJECKI 12 Licence Informatique
Génération de code pour l appel de fonction Remarques : la taille de la valeur de retour est connue au moment de la déclaration du module ; les trois derniers quadruplets peuvent également être généré par les première instructions de la fonction. Au début de la fonction, il faut également modifier le sommet de la pile : 9KYL NZTWVAKYL N[J]\ taille des mémoires locales) À la fin de l exécution de la fonction, il faut restaurer le contexte d exécution. M. KRAJECKI 13 Licence Informatique Génération de code pour l appel de fonction TOP SP mémoires locales + mémoires temporaires ancienne valeur de SP L ancienne valeur de SP est stockée à l adresse SP résultat Le résultat de la fonction est stockée à l adresse SP+1 adresse de retour (quad) L adresse de retour est stockée à l adresse SP+2 nombre de paramètres paramètres M. KRAJECKI 14 Licence Informatique
Un enregistrement d activation pour Pascal Pascal autorise : 2 types de modules : fonction et procédure ; les modules imbriqués. 2 types de passages de paramètres : valeur et variable ; Dans le cas d un passage par valeur, un emplacement de la pile contiendra directement la valeur. Pour un passage par variable, un emplacement de la pile contiendra l adresse de la variable. M. KRAJECKI 15 Licence Informatique Un enregistrement d activation pour Pascal M. KRAJECKI 16 Licence Informatique
mémoires locales Le problème : il existe des variables globales ancienne valeur de SP résultat adresse de retour (quad) nombre de paramètres Une variable locale est accesible facilement : SP courant + décalage Une variable définie ailleur (globale) est accesible par : Un autre SP + décalage Le problème : comment déterminer lequel? paramètres M. KRAJECKI 17 Licence Informatique La table des symboles i 1 0 x 1 0 y 0 décalage par rapport à SP niveau Nous devons également sauvegarder la valeur des SP dans une table particulière appelée Environnement ou Display. M. KRAJECKI 18 Licence Informatique
Gestion de l environnement La fonction ^`_%a&bdcegfhrikj est chargée de renvoyer la valeur du SP de niveau i. Attention : il peut exister plusieurs modules de même niveau. Lors des appels, il est donc nécessaire de sauvegarder (empiler) l environnement. M. KRAJECKI 19 Licence Informatique Conclusion Ce cours ne constitue qu une introduction à la compilation. Les techniques d analyse classique ont été abordées : analyse lexicale et syntaxique (LL, LR, SLR, LALR). La traduction dirigée par la syntaxe a permis de définir une représentation intermédiaire. Il reste encore 2 étapes importantes qui n ont pas été abordées par manque de temps : l optimisation du code intermédiaire ; la génération du code exécutable. M. KRAJECKI 20 Licence Informatique