I databehandling er omfanget ( omfanget av engelsk) til en identifikator det omfanget som denne identifikatoren er knyttet til. Dette omfanget kan være leksisk eller dynamisk.
Et leksikalt omfang er definert av en del av kildekoden. Innenfor denne delen har identifikatoren bare en lenke.
En global identifikator er koblet gjennom kildekoden (noen ganger bare etter erklæringen eller definisjonen). I mange programmeringsspråk har alle funksjoner et globalt omfang (eksempel: C). Når en identifikator med globalt omfang betegner en variabel, snakker vi om en global variabel . Disse brukes vanligvis til å lagre nyttelastdata på flere steder i programmet, en spesiell sak er låser.
En identifikator med lokalt omfang er bare knyttet sammen i en syntaktisk konstruksjon av språket, vanligvis den der det er erklært. Når en identifikator med lokalt omfang betegner en variabel, snakker vi om en lokal variabel . Dessuten skjuler en identifikator med lokalt omfang på de fleste språk alle mulige identifikatorer med samme navn, men med større omfang. Å erklære samme identifikator to ganger i samme omfang kan betraktes som en feil eller en ny erklæring, avhengig av språk og kontekst.
Eksempel i skjema :
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 renvoie la valeur de la variable foo -1 REPL> foo ; accès à la variable foo 42Prinsippet om leksikalt omfang ble først introdusert i LISP 1.5. Det ble lagt til Algol 60, hvis etterkommere vanligvis bare er leksikale stenger ( C , Pascal ). Ordningen , som var en promotor, er en Lisp-dialekt som også bare har leksikale omfang. Common Lisp har både leksikale omfang, importert fra skjema, og dynamiske omfang.
Et dynamisk omfang er definert i et dynamisk omfang avgrenset av et inngangspunkt og et utgangspunkt under kjøretiden. Binding av en dynamisk avgrenset identifikator skjuler en tidligere binding innenfor den dynamiske omfanget av formen som gjør denne nye bindingen. En variabel med dynamisk omfang, kalt en dynamisk variabel, brukes derfor til å spre en modifikasjon til et miljø i samtalestakken.
Eksempel i Common Lisp:
CL-USER> (defvar *foo* 42) ; définition 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* 42Og det samme eksemplet i skjema, uten dynamisk omfang:
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) 42Ikke-funksjonelle språk støtter også dynamisk omfang, spesielt de som kommer fra Forth (et stakkespråk ) inkludert PostScript . Metoden som benyttes er å bruke en andre stabel (uavhengig av stakken av parametere eller stakken for retur av funksjoner, de to stakkene er ofte vanlige) som inneholder for hver stablet posisjon en referanse til en ordliste med variabler. Hvis en variabel ikke kan bli funnet i den første ordboken det refereres til øverst i bunken, fortsetter søket i ordboken (e) lavere i bunken.
Hver ordliste med variabler er vanligvis modellert av en hash-tabell for å oppnå en optimal søketid i hver ordbok (søketiden blir nesten uavhengig av antall variabler som er lagret i ordboken). For å gjøre dette konverteres navnet på variabelen til en numerisk søketast, hvor alle informasjonsbiter blir fordelt ved hjelp av en hash-funksjon; denne talltasten blir deretter redusert til intervallet for størrelsen på hash-tabellen, for å oppnå stedet der variabelen er lagret. Ettersom kollisjoner er mulige, inneholder hashtabellen på hver posisjon som brukes en oppføring for navnet på variabelen (for å kunne sjekke med likeverd at den riktige variabelen er lagret der). Det er da forskjellige strategier for å løse kollisjonen av variabler som deler den samme beregnede nøkkelen:
PostScript og Forth er unike ved at alle ordbøkene (referert i omfangstakken) selv er variabler som kan navngis, som enten kan brukes direkte eller søkes etter navn, også søkt i stabstakken, før du får referansen, som kan deretter stables i stabstakken. Det er derfor ikke noe reservert variabelnavn på disse språkene, alle de forhåndsdefinerte objektnavnene refereres faktisk til i en stabel med omfang som aldri er tom, men i det minste refererer til en første "system" -ordbok med omfang som inneholder sin egen referanse og sitt eget navn. I tillegg er det mulig å selektivt fjerne visse variabler fra alle etterfølgende avgrensningsoppløsninger, ved å slette referansen i en av ordbøkene det er referert til i avgrensningsstakken (dette gjør det mulig å skjule visse variabler av et gitt omfangsnivå for senere bruk av variabelen definert i et lavere omfang). Du kan også erstatte en av oppføringene med en annen (variabelen som er definert i det opprinnelige omfanget, er ikke lenger tilgjengelig der, men vil bli erstattet av en annen med samme navn, men muligens av en annen type, da dette kan gjøre fullstendig utilgjengelig for systemvariabel som vi ønsker å skjule).
Navneskop er ikke bare reservert for språk for lagring og referanse til verdier. Det finnes også i de fleste hierarkiske filsystemer for å presentere forskjellige visninger av tilgjengelige filnavn. Bare eldre, veldig enkle filsystemer, med bare én ordliste med filnavn for hele systemet (og alle prosesser som er vert for systemet), støtter bare ett omfang for filnavn (på kan imidlertid bruke dem som for å utvide dem, ved å lagre ordbøker med ekstra navn som en fil).