Procédure

variables locales à P ... dure ou une fonction qui n'est ni une variable locale, .... Boucle. P = for V in N..M loop S end loop. Nop (P,e)=∑ i=0. eM −eN Nop (S,fi(e)).
94KB taille 10 téléchargements 155 vues
Procédure Déclaration procedure P(X : in Natural; Y : in out Natural; Z : out Natural) is -- variables locales à P begin -- corps de P end P; Utilisation declare A : Natural := 5; B : Natural := 7; begin P(3,A,B); end;

1

Paramètres Paramètre formel : variable apparaissant dans l’entête d’une procédure (ou d’une fonction). Paramètre effectif : argument donné lors de l’appel d’une procédure (ou d’une fonction). Mode de passage : un paramètre d’une procédure peut être en entrée (in) en sortie (out) ou à la fois en entrée et en sortie (in out).

2

Procédure (sémantique 1) (passage par copie) P(3,A,B); declare X : constant Natural := 3; Y : Natural := A; Z : Natural; -- variables locales à P begin -- corps de P A := Y; B := Z; end;

3

A=5,B=7

A=5,B=7

Procédure (sémantique 2) (passage par adresse) P(3,A,B); declare -- variables locales à P begin -- corps de P[3/X,A/Y,B/Z] end;

4

A=5,B=7

A=5,B=7

Procédures imbriquées procedure Main is X : Natural := 0; procedure P(Y : in out Natural) is procedure Q(Z : in out Natural) is begin Z := Z + 1; end Q; begin Q(Y); Q(Y); end P; begin P(X); end Main;

5

Effet de bord Variable locale : variable déclarée dans une procédure (ou une fonction). Variable globale : variable utilisée dans une procédure ou une fonction qui n’est ni une variable locale, ni un paramètre formel de cette procédure (ou fonction). Effet de bord : affectation d’une variable globale (ou appel d’une procédure avec une variable globale en paramètre effectif d’un argument out ou in out). Un effet de bord peut être indirect lorsqu’une procédure appelle une autre procédure qui réalise un effet de bord.

6

Effet de bord (exemple) procedure Main is X : Natural := 0; procedure P(Y : Natural) is begin X := Y; end P; begin P(3); end Main;

7

Liaison statique Définition 1. La liaision statique des variables correspond à la possibilité de retrouver la déclaration d’une variable “statiquement” (sans executer le programme). Note 2. Dans tous les langages de programmation modernes, la liaison des variables est statique.

Remarque 3. Il est par conséquent possible de renommer les variables d’un programme à condition de commencer toujours par les déclarations (blocs declare, procédures ou fonctions) les plus imbriquées.

8

Liaison statique (exemple) procedure Main is X : Natural := 0; procedure P(X : in out Natural) is procedure Q(X : in out Natural) is begin X := X + 1; end Q; begin Q(X); Q(X); end P; begin P(X); end Main;

9

Liaison statique (exemple 2) procedure Main is X : Natural := 3; procedure P(Y : in out Natural) is begin Y := Y + X; end P; procedure Q(Z : in out Natural) is X : Natural := 4; begin P(Z); end Q; A : Natural := 1; begin Q(A); end Main;

10

Aliasing Définition 4. Appel d’une procédure avec la même variable utilisée comme paramètre effectif de plusieurs arguments dont au moins un est en out ou in out). Remarque 5. L’aliasing est strictement interdit par la norme Ada : le programme risque de donner des résultats différents suivant les compilateurs (en fonction de l’ordre d’évaluation des paramètres ou du choix passage par copie/passage par addresse). Remarque 6. Les effets de bord peuvent masquer des cas d’aliasing, ils sont donc à éviter (mais ils ne sont pas interdits).

11

Aliasing (exemple) procedure P(I,J : in out Integer) is begin I := I + 1; J := J - 1; end P; ... declare X : Integer := 3; begin P(X,X); end;

12

Procédure récursive Définition 7. Une procédure récursive est une procédure qui s’appelle elle-même (directement ou indirectement)

Exemple procedure Sum(N : Natural; S : out Natural) is begin if N = 0 then S := 0; else Sum(N - 1, S); S := S + N; end if; end Sum;

13

Fonctions Déclaration function Succ(N : Natural) return Natural is begin return N + 1; end Succ;

Utilisation K := Succ(2); L := Succ(Succ(K);

14

Traduction en procedure procedure Succ(N : Natural; Res : out Natural) is begin Res := N + 1; end Succ;

Utilisation Succ(2,K); declare Aux : Natural; begin Succ(K, Aux); Succ(Aux, L); end;

15

Flot des données Variables lues/écrites : une occurence d’une variable (dans une suite d’instruction) est en écriture si elle apparait à gauche d’une affectation ou comme paramètre effectif en mode out ou in out d’un appel de procédure. Les autres occurences sont en lecture. Une variable est en entrée d’une suite d’instructions si sa première utilisation peut être une lecture. Toute variable écrite est en sortie. Une variable peut à la fois être en entrée et en sortie.

16

Fonction calculée Séquence : la fonction calculée par une séquence d’instructions va du type de ses variables en entrée vers le type de ses variables en sortie. Elle est obtenue en composant les fonctions calculées par les instructions formant la séquence. Test : la fonction calculée par un test est définie par cas. Fonction : la fonction calculée par une fonction Ada (sans effet de bord) va du type de ses arguments vers le type de son résultat. C’est la fonction calculée par la séquence d’instructions qui forme son corps. Fonction récursive : la fonction calculée par une fonction récursive est définie par récurrence (la récurrence doit être bien fondée). Une boucle est traduite en fonction récursive. Une procédure est traduite en fonction. La fonction calculée par une procédure (sans effet de bord) va donc du type de ses arguments en in ou in out vers le type de ses arguments en out ou in out.

17

Fonction calculée (exemple) procedure P(I,J : in out Integer) is begin I := I + 1; J := J - 1; end P; Cette procédure calcule une fonction de Z × Z dans Z × Z définie par la séquence : I := I + 1; J := J - 1; La fonction calculée est donc : hI , J i

 hI , J − 1i ◦ hI , J i  hI + 1, J i

Ce qui est équivalent à : hI , J i

 hI + 1, J − 1i

18

Complexité Complexité en temps en nombre d’opérations “op” (légende : E=expression, I=instruction, S=séquence) pour l’entrée e •

Séquence P = I; S N op (P , e) = N op (I , e) + N op (S , f (e)) où f est la fonction calculée par I



Test P = if E then S1 else S2 end if N op (P , e) = N op (E , e) + max {N op (S1, e), N op (S2, e))}



Boucle P = for V in N..M loop S end loop P M −eN N op (P , e) = ei=0 N op (S , f i(e)) où V,M,N sont des variables entières et f est la fonction calculée par S

19

Appel de procédure (complexité) •

Complexité en temps constant (on suppose un passage par addresse quelques soient les paramètres)



Complexité en espace taille des variables locales (espace libéré à la sortie de la procédure)

20