CSI3525: Concepts des Langages de Programmation Notes # 12: Implementation des Sous-Programmes ( Lire Chapitre 9 )
2 Plan du Cours Generalites Environement dAppel Entierement Statique Structure de lenvironnement Appel a un sous-programme Environement dAppel fonde sur une Pile Structure de lenvironnement Appel a un sous-programme Chaine Statique Donnees a Longueur variable
3 Generalites Lappel a des sous-programmes se fait de facon imbriquee. Lappelant attend que lappele se termine pour poursuivre son execution. Toute activation de sous-programme est representee par un enregistrement dactivation. Celui-ci est cree lors de lexecution particuliere dun sous- programme et sa structure est geree par lenvironnement.
4 Environnement Entierement Statique Dans ce cas, toute la memoire requise pour les enregistrements peut etre allouee au chargement. Chaque variable se voit allouer un espace qui demeurera inchange tout au long de lexecution du programme. Un environement entierement statique ne permet pas la recursivite. Limplementation des sous-programme en Fortran (sauf le Fortran 90) se fait dans un environnement entierement statique.
5 Structure de lenvironnement Statique I Chaque enregistrement se structure ainsi: Addresse de retour Addresse de Storage (pour fonctions) Variables locales Parametres Espace temporaire Information sur Lappelant Information sur lappele
6 Structure de lEnvironnement Statique II Lenvironnement est defini comme suit: Aire Commune Enregistrement dactivation du programme principal Enregistrement dactivation du 1er sous-programme Enregistrement dactivation du 2eme sous-programme ….
7 Deroulement dun appel a un sous-programme dans un environnement statique 1. Les arguments sont evalues et leur emplacement est stocke dans lespace des parametres de lenregistrement dactivation (passage par reference). Si le passage se fait par valeur, les donnees passees doivent avoir une taille fixe. 2. Laddresse contenue dans le compteur dinstruction est place dans lespace pour laddresse de retour. 3. Le compteur programme peut alors etre mis a jour (a laddresse ou debute le sous-programme). 4. Si une valeur doit etre retournee, celle-ci est placee a linterieur dun registre ou de tout autre espace convenable.
8 Environnement fonde sur une Pile Dans les langages a portee lexicale qui permettent la recursivite, lenvironnement repose sur une pile. A chaque nouvel appel a un sous-programme, un nouvel enregistrement est cree a linterieur de la pile. Tous les enregistrements sont donc empiles, du sous-programme initial jusquau sous-programme en cours dexecution (qui se trouve au dessus de la pile). Les Langages Algols et leur descendants ont des environements fondes sur une pile et permettent donc la recursion et autres imbriquements.
9 Structure de lenvironnement fonde sur une Pile I Chaque enregistrement se structure ainsi: Lien dynamique Addresse de retour Addresse de storage (pour fonctions) Lien statique Variables locales Parametres formels Espace temporaire Information sur lappelant Information sur lappele
10 Structure de lenvironnement fonde sur une Pile II Lenvironnement est defini comme suit: Aire du Code Aire des donnees Information de Controle
11 Deroulement dun appel a un sous-programme dans un environnement a pile I 1. Un pointeur denvironnement contient lemplacement de lenregistrement dactivation courant 2. Laddresse de lenregistrement dactivation de lappelant est place dans le lien dynamique. 3. Laddresse de lenregistrement dactivation du parent statique est place dans le lien statique (si le langage le permet). Le lien statique peut aussi donner lemplacement de la zone contenant les variables globales. 4. Les arguments sont evalues et leur valeur est stocke dans lespace des parametres de lenregistrement dactivation.
12 Deroulement dun appel a un sous-programme dans un environnement a pile II 5. Laddresse contenue dans le compteur dinstruction est placee dans lespace pour laddresse de retour. 6. Le compteur programme peut alors etre mis a jour (a laddresse ou debute le sous-programme). 7. Si une valeur doit etre retournee, celle-ci est placee a linterieur dun registre ou de tout autre espace convenable. Note: La position de toute variable locale est toujours donnee de facon relative au pointeur denvironnement.
13 Quelques Examples Dans ces examples, on supposera un model simplifie, avec: Un pointeur a lenregistrement dactivation de lappelant, Un pointeur au premier bloc exterieur, Laddresse de retour (donnee sous forme symbolique) Les donnees locales (sil y en a) Les parametres actuels (sil y en a) Voir Diapositives 13 (a), (b) et (c) [i.e., les examples donnes dans la version Anglaise des notes].
14 Chaine Statique Dans un langage ou les sous-programmes peuvent etre imbriques, les variables stockees sur la pile ne sont pas accedees par leur nom. Dans un langage a portee statique, une variable doit donc etre localisee en remontant la chaine dimbrication statique. Laddresse de la variable V sur la pile se specifie a laide de deux nombres: Le nombre denregistrements quil faut remonter afin darriver a lenregistrement contenant la variable. La position de cette variable par rapport a lenregistrement.
15 Implementation des Fonctions sur la Pile Laffectation daddresse au fragments de programme doit etre un petit peu plus elaboree: program Main; var A: integer; function F (N: integer): integer; begin if N <= 1 then F:=1 else F := F(N-1) * N end; begin A := F(3); writeln(A) end.
16 Donnees a Longueur Variable I De telles donnees (telles que des tableaux locaux) doivent aussi etre stoocke sur la pile, mais il est preferable que laddresse soit determinee au moment de la compilation. On choisit de separer le mecanisme dacces aux donnees des donnees elles-meme. Un tableau sera donc decrit dans lenregistrement dactivation par un descripteur. Les elements du tableau seront stockes apres lenregistrement dactivation de lappelant, plus pres du haut de la pile. Il nya pas de restrictions sur la taille des tableaux (quoiquil ne faut pas exceder le montant de memoire disponible en general)
17 Donnees a Longueur Variable II Un descripteur contient: Les limites pour les indexes du tableau (ils peuvent etre utiles pour de la verification pendant lexecution) Une base (un pointeur jusquau debut de lespace des donnees). Afin dacceder a un element, il faut trouver son addresse en ajoutant a la base la distance du debut du tableau a lelement (en ordre row-major ou column-major).