Zobacz także: Free variables i bound variables

Zakres zmiennej opisuje, gdzie w tekście programu zmienna może być użyta, podczas gdy zakres (lub czas życia) opisuje, kiedy w wykonaniu programu zmienna ma (znaczącą) wartość. Zakres zmiennej jest w rzeczywistości właściwością nazwy zmiennej, a zasięg jest właściwością samej zmiennej. Nie powinny być one mylone z kontekstem (zwanym także środowiskiem), który jest właściwością programu i zmienia się w zależności od punktu w kodzie źródłowym lub wykonaniu programu – zobacz scope: przegląd. Ponadto, czas życia obiektu może pokrywać się z czasem życia zmiennej, ale w wielu przypadkach nie jest związany z czasem życia zmiennej.

Zakres nazwy zmiennej wpływa na jej zasięg.

Zakres jest ważną częścią rozwiązywania nazw zmiennych. Większość języków definiuje określony zakres dla każdej zmiennej (jak również każdej innej nazwanej jednostki), który może się różnić w obrębie danego programu. Zakres zmiennej jest częścią kodu programu, dla której nazwa zmiennej ma znaczenie i dla której zmienna jest „widoczna”. Wejście w ten zakres zazwyczaj rozpoczyna czas życia zmiennej (jako że wchodzi ona w kontekst), a wyjście z tego zakresu zazwyczaj kończy jej czas życia (jako że wychodzi ona z kontekstu). Na przykład, zmienna z „zakresem leksykalnym” jest znacząca tylko w obrębie pewnej funkcji/podprogramu, lub bardziej szczegółowo w obrębie bloku wyrażeń/wypowiedzi (odpowiednio z zakresem funkcji lub zakresem bloku); jest to statyczna rozdzielczość, wykonywana w czasie parsowania lub kompilacji. Alternatywnie, zmienna o dynamicznym zakresie jest rozwiązywana w czasie wykonywania, na podstawie globalnego stosu wiązań, który zależy od konkretnego przepływu sterowania. Zmienne dostępne tylko w ramach określonych funkcji są określane jako „zmienne lokalne”. Do „zmiennej globalnej”, lub takiej o nieokreślonym zakresie, można odwoływać się w dowolnym miejscu programu.

Extent, z drugiej strony, jest aspektem runtime (dynamicznym) zmiennej. Każde powiązanie zmiennej z wartością może mieć swój własny zakres w czasie wykonywania. Zakres wiązania to część czasu wykonywania programu, podczas której zmienna nadal odnosi się do tej samej wartości lub miejsca w pamięci. Działający program może wchodzić i wychodzić z danego zakresu wiele razy, jak w przypadku zamknięcia.

Bez funkcji garbage collection w języku programowania, zmienna, której zakres trwale przekracza jej zakres, może spowodować wyciek pamięci, w którym pamięć przydzielona dla zmiennej nigdy nie może zostać zwolniona, ponieważ zmienna, która byłaby używana do odniesienia do niej w celach deallokacji, nie jest już dostępna. Jednakże może być dopuszczalne, aby wiązanie zmiennej wykraczało poza jej zakres, jak to ma miejsce w Lisp closures i statycznych zmiennych lokalnych C; gdy wykonanie przejdzie z powrotem do zakresu zmiennej, zmienna może być ponownie użyta. Zmienna, której zakres zaczyna się przed jej zasięgiem, jest niezainicjalizowana i często ma niezdefiniowaną, dowolną wartość (zobacz wild pointer), ponieważ nie została jej jeszcze jawnie nadana konkretna wartość. Zmienna, której zakres kończy się przed jej zakresem może stać się dangling pointer i ponownie zostać uznana za niezainicjalizowaną, ponieważ jej wartość została zniszczona. Zmienne opisane przez dwa poprzednie przypadki mogą być określane jako out of extent lub unbound. W wielu językach błędem jest próba użycia wartości zmiennej, gdy jest ona poza zakresem. W innych językach może to przynieść nieprzewidywalne rezultaty. Takiej zmiennej można jednak przypisać nową wartość, co daje jej nowy zakres.

Dla efektywności wykorzystania przestrzeni, miejsce w pamięci potrzebne dla zmiennej może być przydzielone tylko wtedy, gdy zmienna jest po raz pierwszy użyta i zwolnione, gdy nie jest już potrzebna. Zmienna jest potrzebna tylko wtedy, gdy jest w zakresie, więc rozpoczęcie życia każdej zmiennej, gdy wchodzi w zakres, może dać miejsce nieużywanym zmiennym. Aby uniknąć marnowania takiej przestrzeni, kompilatory często ostrzegają programistów, jeśli zmienna jest zadeklarowana, ale nie jest używana.

Uważa się, że dobrą praktyką programistyczną jest uczynienie zakresu zmiennych tak wąskim, jak to tylko możliwe, aby różne części programu nie wchodziły przypadkowo w interakcje ze sobą, modyfikując wzajemnie swoje zmienne. Zapobiega to również działaniu na odległość. Powszechne techniki, aby to zrobić, to mieć różne sekcje programu używać różnych przestrzeni nazw lub uczynić poszczególne zmienne „prywatnymi” poprzez dynamiczne zakresy zmiennych lub leksykalne zakresy zmiennych.

Wiele języków programowania stosuje zarezerwowaną wartość (często nazywaną null lub nil), aby wskazać nieprawidłową lub niezainicjalizowaną zmienną.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.