next up previous contents
Next: Implémentation Up: Les langages de programmation Previous: Les langages de programmation

Environnement lexical et environnement dynamique

L'environnement lexical d'une fonction (ou d'un bloc) est l'environnement dans lequel cette fonction (ou bloc) apparaît (c'est-à-dire l'environnement issu des définitions et déclarations des blocs et fonctions englobants).

L'environnement dynamique est l'environnement au moment de l'appel de cette fonction. Pour presque tous les langages de programmation, un nom qui n'est pas local à une procédure réfère à sa valeur dans l'environnement lexical.gif.

Exemple:

module M
  var int a=0;
  var int x;
  function F();
  begin
     return a;
  end f;
  procedure G();
  var a;
  begin
     a=1;
     x=f();
  end g;
begin
  G();
end;
avant l'appel de F() dans G() on est dans la situation :

tabular101

et dans l'environnement dynamique de F, la variable a sera a tex2html_wrap_inline2512 , alors que dans l'environnement lexical a sera a tex2html_wrap_inline2514 (M est le seul bloc englobant F). La valeur de a sera donc celle de l'environnement lexical 0 et donc après le retour de F, la variable x sera égale à 0, alors que si F était évalué dans l'environnement dynamique x serait égal à 1.

Il paraît raisonnable de considérer qu'un programme ne doit pas dépendre du nom des variables; en conséquence, si on fait un renommage ``cohérent'' des variables, le programme doit donner les mêmes résultats. Soit le résultat du renommage de a de G en b:

module m
  var int a=0;
  var int x;
  function f();
  begin
     return a;
  end f;
  procedure g();
  var b;
  begin
     a=1;
     x=f();
  end g;
begin
  g();
end;
Si f était évalué dans l'environnement dynamique, la valeur de x sera 1. Comme on le voit, si un programme ne dépend pas du nom donné aux variables, une fonction ne peut être évaluée que dans son environnement lexical.

Cette règle doit aussi s'appliquer aux fonctions passées en paramètre.

Exemple:

module
   var a;
   procedure P();
      var x,y,z;
      procedure Q();
          var x;  
          procedure R();
              var y;
          begin
             ... P(); ...
          end R;
      begin
         ... R();...
      end Q;
   begin
     ... Q();
   end P;
begin
  ...P();
end module
L'exécution donnera en numérotant les appels:
  1. avec l'appel de P() dans M et avant l'appel de P() dans R:

    tabular108

    de façon claire, a tex2html_wrap_inline2514 , y tex2html_wrap_inline2536 , x tex2html_wrap_inline2538 et z tex2html_wrap_inline2540 sont accessibles; l'environnement lexical de R tex2html_wrap_inline2542 est l'environnement provenant de M, P tex2html_wrap_inline2542 , Q tex2html_wrap_inline2542 ;

  2. après l'appel de P:

    tabular121

    a tex2html_wrap_inline2514 , x tex2html_wrap_inline2576 ,y tex2html_wrap_inline2576 et z tex2html_wrap_inline2576 sont accessibles; l'environnement lexical est celui de M, alors que l'environnement dynamique serait celui de l'appel (M, P tex2html_wrap_inline2542 , Q tex2html_wrap_inline2542 , R tex2html_wrap_inline2542 )

  3. après l'appel de Q() :

    tabular137

    a tex2html_wrap_inline2514 , x tex2html_wrap_inline2620 ,y tex2html_wrap_inline2576 et z tex2html_wrap_inline2576 sont accessibles


next up previous contents
Next: Implémentation Up: Les langages de programmation Previous: Les langages de programmation


Mon Oct 20 14:02:48 MET 1997