Portée (informatique)
Source: Wikipédia sous licence CC-BY-SA 3.0.
La liste des auteurs de cet article est disponible ici.

En informatique, la portée d'un identifiant est l'étendue au sein de laquelle cet identifiant est lié. Cette portée peut être lexicale ou dynamique.

Portée lexicale

Une portée lexicale est définie par une portion du code source (Le code source (ou les sources voire le source) est un ensemble d'instructions écrites dans un langage de programmation informatique de haut niveau,...). Au sein de cette portion, l'identifiant (En informatique, on appelle identifiants (également appelé parfois en anglais login) les informations permettant à une personne de s'identifier auprès d'un système.) n'a qu'une seule liaison.

Un identifiant à portée globale est lié dans l'ensemble (En théorie des ensembles, un ensemble désigne intuitivement une collection d’objets (les éléments de l'ensemble), « une multitude qui peut être comprise comme un...) du code source (parfois seulement après sa déclaration ou sa définition). Dans de nombreux langages de programmation (La programmation dans le domaine informatique est l'ensemble des activités qui permettent l'écriture des programmes informatiques. C'est une étape importante de la...), toutes les fonctions ont une portée globale (exemple : C). Lorsqu'un identifiant à portée globale désigne une variable (En mathématiques et en logique, une variable est représentée par un symbole. Elle est utilisée pour marquer un rôle dans une formule, un prédicat ou un algorithme. En statistiques, une variable peut aussi...), on parle alors de variable globale. Celles-ci servent (Servent est la contraction du mot serveur et client.) typiquement à stocker des données (Dans les technologies de l'information (TI), une donnée est une description élémentaire, souvent codée, d'une chose, d'une transaction d'affaire, d'un événement, etc.) utiles à de multiples endroit du programme, un cas particulier étant les verrous.

Un identifiant à portée locale n'est lié qu'au sein d'une construction syntaxique du langage, généralement celle où il est déclaré ou défini. De plus, dans la plupart des langages, un identifiant à portée locale va masquer un identifiant de même nom et de portée supérieure, c'est-à-dire soit un identifiant dont la portée locale est une construction englobant celle de l'identifiant masquant, soit un identifiant à portée globale.

Exemple en Scheme :

 
 REPL> (define foo 42)             ; la variable globale foo contient la valeur 42 
 REPL> foo                         ; accès à la variable foo 
 42 
 REPL> (let ((foo -1))             ; ouverture d'une forme let où est définie une variable locale foo qui contient la valeur -1 
 foo)                      ; fin de la forme let, qui renvoit la valeur de la variable foo 
 -1 
 REPL> foo                         ; accès à la variable foo 
 42 
 

Historique

Le principe de portée lexicale (En informatique, la portée lexicale (dite également portée statique), est une méthode pour déterminer la portée d'une variable en fonction de sa position...) a été introduit pour la première fois dans LISP 1.5. Il fut ajouté à Algol 60, dont les descendants sont typiquement à portées uniquement lexicales (C, Pascal). Scheme, qui en fut un promoteur, est un dialecte Lisp qui n'a également de portées que lexicales. Common Lisp, lui, dispose à la fois de portées lexicales, importées de Scheme, et de portées dynamiques.

Portée dynamique (Le mot dynamique est souvent employé désigner ou qualifier ce qui est relatif au mouvement. Il peut être employé comme :)

Une portée dynamique est définie dans une étendue dynamique délimitée par un point (Graphie) d'entrée et un point de sortie pendant l'exécution. La liaison d'un identifiant à portée dynamique masque une liaison précédente au sein de l'étendue dynamique de la forme qui réalise cette nouvelle liaison. Une variable à portée dynamique, appelée variable dynamique, permet donc de propager dans la pile d'appels une modification à un environnement (L'environnement est tout ce qui nous entoure. C'est l'ensemble des éléments naturels et artificiels au sein duquel se déroule la vie humaine. Avec les enjeux écologiques actuels, le terme environnement tend actuellement à...).

Exemple en Common Lisp :

 
 CL-USER> (defvar *foo* 42)        ; définition (Une définition est un discours qui dit ce qu'est une chose ou ce que signifie un nom. D'où la division entre les définitions réelles et les définitions nominales.) d'une variable à portée dynamique *foo* contenant la valeur 42 
 *FOO* 
 CL-USER> (defun return-foo ()     ; définition d'une fonction renvoyant la valeur de *foo* 
 *foo*) 
 RETURN-FOO 
 CL-USER> (return-foo)             ; accès à la variable *foo* 
 42 
 CL-USER> (let ((*foo* -1))        ; ouverture d'une forme let re-liant *foo* à la valeur -1, 
 (return-foo))          ; dont l'exécution constitue l'étendue dynamique de cette liaison 
 -1 
 CL-USER> (return-foo)             ; accès à la variable *foo* 
 42 
 

Et le même exemple en Scheme, sans portée dynamique :

 
 REPL> (define foo 42) 
 REPL> (define (return-foo) 
 foo) 
 REPL> (return-foo) 
 42 
 REPL> (let ((foo -1)) 
 (return-foo))             ; ici l'exécution de return-foo accèdera à la variable foo dans sa portée lexicale 
 42 
 REPL> (return-foo) 
 42 
 

Des langages non fonctionnels supportent aussi une portée dynamique, notamment ceux dérivés de Forth (un langage à pile) dont PostScript. La méthode employée est d'utiliser une seconde ( Seconde est le féminin de l'adjectif second, qui vient immédiatement après le premier ou qui s'ajoute à quelque chose de nature identique. La seconde...) pile (indépendante de la pile des paramètres ou de la pile de retour des fonctions, les deux piles étant souvent communes) contenant pour chaque position empilée une référence à un dictionnaire de variables. Si une variable ne peut être trouvée dans le premier dictionnaire référencé au sommet de la pile, la recherche (La recherche scientifique désigne en premier lieu l’ensemble des actions entreprises en vue de produire et de développer les connaissances scientifiques. Par extension métonymique, la recherche scientifique désigne également le cadre...) se poursuit dans le (ou les) dictionnaires plus bas dans la pile.

Chaque dictionnaire de variables est généralement modélisé par une table de hachage afin d'obtenir un temps (Le temps est un concept développé par l'être humain pour appréhender le changement dans le monde.) de recherche optimal au sein de chaque dictionnaire (le temps de recherche devient quasiment indépendant du nombre (La notion de nombre en linguistique est traitée à l’article « Nombre grammatical ».) de variables stockées dans le dictionnaire). Pour cela, le nom de la variable est converti en une clé de recherche numérique (Une information numérique (en anglais « digital ») est une information ayant été quantifiée et échantillonnée, par opposition à une information dite...) dont tous les bits d'information sont équidistribués à l'aide d'une fonction de hachage; cette clé numérique est alors réduite à l'intervalle de la taille de la table de hachage, pour obtenir l'emplacement où la variable est stockée. Comme des collisions sont possibles, la table de hachage contient à chaque position utilisée à la fois une entrée pour le nom de la variable (afin de pouvoir vérifier par égalité que la bonne variable est stockée à cet endroit). Il existe alors différentes stratégies pour résoudre la collision (Une collision est un choc direct entre deux objets. Un tel impact transmet une partie de l'énergie et de l'impulsion de l'un des corps au second.) de variables partageant la même clé calculée:

  • Augmenter la taille de la table de hachage et redistribuer toutes les variables qui y sont déjà stockées. Cette opération est couteuse lors de l'ajout de variable mais permet de limiter le nombre de collisions.
  • Enchaîner dans une liste les variables partageant la même position dans la table de hachage. La liste de collision peut être externe à la table, ou bien occuper des positions choisies aléatoirement parmi les positions libres dans la table de hachage.
  • Stocker à la position déterminée par la clé de hachage commune, une autre variable telle qu'une référence à une autre table de hachage (contenant toutes les variables partageant la même clé dans la première table), la seconde table utilisant une fonction de hachage distincte (dans ce cas le temps de recherche devient partiellement logarithmique en fonction du nombre total ( Total est la qualité de ce qui est complet, sans exception. D'un point de vue comptable, un total est le résultat d'une addition, c'est-à-dire une somme....) de variables, et non partiellement linéaire).

PostScript et Forth ont ceci de particulier que tous les dictionnaires (référencés dans la pile de portée) sont eux-même des variables que l'on peut nommer, que l'on peut soit utiliser directement soit rechercher par leur nom recherché lui aussi dans la pile de portée, avant d'en obtenir la référence, qu'on peut alors empiler dans la pile de portée. Il n'y a donc dans ces langages aucun nom de variable réservé, tous les noms d'objets prédéfinis étant en fait référencé dans une pile de portée qui n'est jamais vide (Le vide est ordinairement défini comme l'absence de matière dans une zone spatiale.) mais référence au minimum un premier dictionnaire "système" de portée contenant sa propre référence et son propre nom. De plus il est possible de retirer sélectivement certaines variables de toutes les résolutions ultérieures de portée, en supprimant leur référence dans un des dictionnaires référencés dans la pile de portée (ceci permet de masquer certaines variables d'un niveau de porté donné pour utiliser ensuite la variable définie dans un niveau de portée inférieur). On peut également replacer une des entrées par une autre (la variable définie dans la portée initiale n'y est plus accessible mais sera remplacer par une autre de même nom, mais éventuellement de type différent, ceci pouvant rendre ensuite totalement inaccessible une variable système que l'on veut cacher).

La portée de noms n'est pas réservée aux seuls langages pour le stockage et le référencement (Le référencement est l'action de référencer, c'est-à-dire mentionner quelque chose ou y faire référence.) de valeurs. On la retrouve aussi dans la plupart des systèmes de fichiers hiérarchiques pour présenter des vues différentes des noms de fichiers accessibles. Seuls les anciens systèmes de fichiers très simples, ne comportant qu'un seul dictionnaire de noms de fichiers pour le système tout (Le tout compris comme ensemble de ce qui existe est souvent interprété comme le monde ou l'univers.) entier (et tous les processus hébergés par le système), ne supportent qu'une seule portée pour les noms de fichiers (on peut toutefois les utiliser tels quels pour les étendre, en y stockant sous forme d'un fichier ( Un fichier est un endroit où sont rangées des fiches. Cela peut-être un meuble, une pièce, un bâtiment, une base de données informatique. Par...) des dictionnaires de noms supplémentaires).

  • Par exemple sous Unix et Linux (Au sens strict, Linux est le nom du noyau de système d'exploitation libre, multitâche, multiplate-forme et multi-utilisateur de type UNIX créé par Linus Torvalds, souvent désigné comme le noyau Linux. Par extension, Linux...), les noms de fichiers sont résolus en objets fichiers accessibles au moyen d'une variable de portée (dans ce cas, les répertoires de fichiers sont des dictionnaires), et permettent aussi de référencer le même fichier sous des noms multiples et différents, y compris dans des répertoires multiples et différents.La résolution de portée utilise une variable globale spécifique au processus qui accède au fichier par son nom, modifiable par chroot (chroot est une commande des systèmes d'exploitation UNIX permettant de changer pour un programme le répertoire racine de la machine hôte.) et on référence implicitement ce dictionnaire " racine " en recherchant un nom commençant par "/".
  • Une autre variable contenant la référence à un dictionnaire courant supportant la notion de sous-répertoires et la navigation (La navigation est la science et l'ensemble des techniques qui permettent de :) dynamique d'un niveau de portée à l'autre, à l'aide d'opérations comme chdir. Cette facilité de nommage est supportée par pratiquement tous les systèmes de fichiers des systèmes d'exploitation actuels.
  • Certains systèmes de fichiers permettent d'utiliser plusieurs dictionnaires racines simultanément en leur attribuant à chacun un nom; pour les systèmes de fichiers CPM, DOS (En anatomie, chez les animaux vertébrés parmi lesquels les humains, le dos est la partie du corps consistant en les vertèbres et les côtes. Les dorsaux...) ou Windows (Windows est une gamme de systèmes d'exploitation produite par Microsoft, principalement destinées aux machines compatibles PC. C'est le remplaçant de MS-DOS. Depuis les années 1990, avec la sortie de Windows 95, son...) chaque racine est désignée par une lettre unique (désignant généralement un lecteur ou un volume (Le volume, en sciences physiques ou mathématiques, est une grandeur qui mesure l'extension d'un objet ou d'une partie de l'espace.) contenant les fichiers référencés bien que ce ne soit pas obligatoire); pour chaque lecteur ainsi nommé existe un répertoire courant propre à chaque processus, et chaque processus est aussi associé à un lecteur courant.
  • D'autres systèmes (comme VMS) vont plus loin et ne se limite pas à une seule lettre de lecteur, mais permettent de nommer une quantité (La quantité est un terme générique de la métrologie (compte, montant) ; un scalaire, vecteur, nombre d’objets ou d’une autre manière de dénommer la...) virtuellement infinie de volumes courant, chacun par leur propre nom. Dans ce cas il existe dans chaque processus un dictionnaire des volumes accessibles, dans lequel on trouve soit des fichiers, soit d'autres répertoires, lesquels peuvent être mémorisés dans le contexte (Le contexte d'un évènement inclut les circonstances et conditions qui l'entourent; le contexte d'un mot, d'une phrase ou d'un texte inclut les mots qui l'entourent. Le concept...) d'un processus au sein de son propre dictionnaire de volumes. Cela combine les avantages des deux méthodes de résolution dynamique de portée: hiérarchique, ou contextuelle.
Page générée en 0.163 seconde(s) - site hébergé chez Amen
Ce site fait l'objet d'une déclaration à la CNIL sous le numéro de dossier 1037632
Ce site est édité par Techno-Science.net - A propos - Informations légales
Partenaire: HD-Numérique