Referencja (informatyka)

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacja, szukaj

Referencja w informatyce to wartość, która zawiera informacje o położeniu innej wartości w pamięci lub na innym nośniku danych. W odróżnieniu od wskaźników, zarządzanie referencjami realizowane jest wyłącznie przez kompilator lub interpreter, a programista nie posiada żadnych informacji o konkretnym sposobie implementacji referencji.

Mechanizm referencji jest powszechnie wykorzystywany w językach programowania, gdyż idea jego działania polega m.in. na uniemożliwieniu wykonywania operacji uznawanych za potencjalnie niebezpieczne, które w wypadku błędu programistycznego mogłyby doprowadzić do awarii, zwiększając w ten sposób niezawodność oprogramowania[1]. Referencje nie ograniczają możliwości programisty – wszystkie operacje, które nie bazują na jawnej znajomości organizacji pamięci, mogą być zaimplementowane wyłącznie za ich pomocą. Z tego powodu w wielu językach programowania wysokiego poziomu jest to jedyny mechanizm obsługi pamięci (np. Java[1]). W innych referencje współistnieją ze wskaźnikami (np. C++[1]).

Zastosowania[edytuj | edytuj kod]

Dopełnienie mechanizmu wskaźników[edytuj | edytuj kod]

W niskopoziomowych językach takich, jak C++, referencje są implementowane jako oferująca mniej możliwości, ale bezpieczniejsza odmiana wskaźników. Podobnie jak i one, referencje wskazują tutaj na pewien obszar pamięci z tą różnicą, że nie mogą być modyfikowane. Innymi słowy, już podczas tworzenia zmiennej będącej referencją musimy określić, na co będzie ona wskazywać, a ponadto referencji nie wolno później modyfikować.

Referencje do obiektów[edytuj | edytuj kod]

W wielu językach zmienne obiektowe są jedynie referencjami do obiektów znajdujących się na stercie.

W wielu obiektowych językach wysokiego poziomu (np. Java) programista nie może samodzielnie zarządzać pamięcią. Sposób jej organizacji zależy od implementacji konkretnej maszyny wirtualnej. Wyróżniony jest w niej obszar zwany stertą, w której przechowywane są wszystkie utworzone przez aplikację obiekty. Zmienne obiektowe nie przechowują bezpośrednio obiektów, a jedynie referencje do sterty. Przypisując wartość jednej zmiennej obiektowej do drugiej, lub przekazując ją przez wartość, przekazujemy jedynie referencję, co oznacza, że od tego momentu obie zmienne będą odnosić się do tego samego obiektu, a zmiany stanu wprowadzone za pośrednictwem jednej z nich będą natychmiast widoczne przez drugą.

Dodatkowo, dopuszcza się istnienie pustych referencji (null), które aktualnie nie wskazują na żaden obiekt.

Odśmiecanie pamięci[edytuj | edytuj kod]

Referencje mają kluczowe znaczenie dla algorytmów odśmiecania pamięci. Umożliwiają śledzenie, które obiekty i wartości są wciąż używane przez program, a które mogą być bezpiecznie usunięte. Najprostszą techniką kontroli czasu życia danych na stercie jest zliczanie referencji[2]. Aplikacja utrzymuje specjalny licznik dla każdego obiektu, który przechowuje informacje o liczbie referencji aktualnie na niego wskazujących. Jeśli spadnie on do zera, oznacza to, że nie jest już używany, a przydzielona mu pamięć powinna być zwolniona. Technika ta nie potrafi jednak wykrywać cykli (obiekty A i B posiadają referencje do siebie nawzajem, lecz reszta programu już nie).

Zobacz także[edytuj | edytuj kod]

Przypisy

  1. 1,0 1,1 1,2 Harry Henderson: Encyclopedia of computer science and technology. Facts on File, Inc, 2008, s. 376 - 377. ISBN 9780816063826. (ang.)
  2. Recycling techniques (ang.). The Memory Management Reference. [dostęp 2010-12-08].