Zmienna nakładana[1], zmienna absolutna[2], nakładanie zmiennych[3] – konstrukcja programistyczna dostępna w określonym języku programowania lub w jego konkretnej implementacji, umożliwiająca deklarowanie różnych zmiennych, w tym samym obszarze pamięci (dokładnie w tym samym, lub w wybranym fragmencie wspólnym). Takie postępowanie umożliwia odwoływanie się do danej zawartej w pamięci na wiele sposobów, tzn. różną interpretację ciągu bitów zawartych w tym obszarze lub fragmencie pewnego obszaru. W ten sposób danej zapisanej w pewnym obszarze pamięci można przypisać kilka różnych typów danych.
Cel stosowania zmiennych nakładanych
Jak podano wyżej taka konstrukcja umożliwia odwoływanie się do danej zawartej w pewnym obszarze (lub fragmencie obszaru) pamięci jak do danych różnych typów.
Przykład w języku Turbo Pascal[2] (wspólny fragment obszaru pamięci):
var lancuch:string[5];
dlugosc:byte absolute lancuch;
W powyższym przykładzie zmienna dlugosc
, typu całkowitoliczbowego o długości 1 bajt, zostanie umieszczona począwszy od tego samego adresu, co zmienna lancuch
typu łańcuchowego, o długości 5 znaków (zmienna taka zajmuje 6 bajtów). Jeżeli w kodzie źródłowym zostanie użyte odwołanie do danej zawartej w pamięci pod tym adresem, poprzez identyfikator lancuch
, to dana taka zostanie zinterpretowana jak łańcuch znaków, o długości zgodnej z liczbą zapisaną w pierwszym bajcie pamięci zmiennej lancuch
. Jeżeli natomiast takie odwołanie nastąpi za pomocą zmiennej nałożonej dlugosc
, to nastąpi odwołanie tylko do fragmentu tego obszaru pamięci (pierwszego bajta), w którym przechowywana jest przez implementację długość aktualna łańcucha znaków i zgodnie z oczekiwaniami dana taka, która zostanie zinterpretowana jako dana liczbowa, pozwoli zbadać programiście aktualną długość łańcucha. Ponadto przypisując takiej danej nową wartość można dokonać szybkiego obcięcia łańcucha.
Przykład w języku Turbo Pascal dla danych zadeklarowanych wyżej – obcięcie łańcucha[2]:
lancuch:="Alamo"; writeln(lancuch); { wypisanie słowa "Alamo" }
dlugosc:=3; writeln(lancuch); { wypisanie słowa "Ala" }
Taki sposób postępowania umożliwiać może (o ile implementacja nie dokonuje odpowiedniej kontroli, bądź kontrolę taką można wyłączyć odpowiednią dyrektywą kompilatora) "wydłużenie" łańcucha znaków i rozciągnięcia go na dane zawarte w pamięci za zmienną lancuch
. Korzystanie jednak w programowaniu z takich efektów ubocznych, zdecydowanie nie jest jednak zalecane przez literaturę przedmiotu[4].
Innym, prostym przykładem nakładania zmiennych, jest implementacja w Turbo Pascalu niedostępnego mechanizmu[2] zawartego w języku C[5], traktowania danych znakowych jak liczb całkowitych, bez użycia konwersji lub funkcji standardowej.
Przykład w języku Turbo Pascal (wspólny cały obszar – dokładne nałożenie zmiennych):
var znak:char;
kod:byte absolute znak;
Porównanie z innymi konstrukcjami
Powyższe efekty, w zakresie interpretowania tej samej danej, jako danych różnych typów, można uzyskać stosując także inne metody:
- referencja
- referencja wymaga korzystania z nieco bardziej kosztownego pamięciowo i czasowo, mechanizmu odwołań pośrednich, za pomocną zmiennych wskaźnikowych; kilka zmiennych wskaźnikowych ale o różnych typach bazowych, wskazujących na ten sam adres implementuje przedmiotowy mechanizm
- konwersja
- wymagane jest wbudowanie w implementację mechanizmu zmiany interpretacji bądź w razie konieczności przekształcenia danych pewnego typu na dane innego typu, do niektórych języków programowania wprowadzony jest operator konwersji
- podprogramy
- jest najbardziej uniwersalną metodą, ale wymaga zaprogramowania odpowiednich podprogramów, w tym podprogramów konwersji, niektóre języki oferują podprogramy wbudowane, lub implementacje oferują odpowiednie podprogramy standardowe.
Sposoby realizacji
W różnych językach programowania, bądź ich implementacjach, dostępne są różne mechanizmy, umożliwiające realizację nakładania zmiennych, o różnych możliwościach i sposobach realizacji.
Nakładanie zmiennych
To najprostsza metoda realizacji przedmiotowej konstrukcji. Polega na umieszczeniu w deklaracji zmiennej nakładanej odpowiedniej informacji dla translatora, jak ma zostać umieszczona w pamięci dana zmienna. Najczęściej stosuje się odniesienie poprzez identyfikator do wcześniej zdefiniowanej zmiennej, na którą ma zostać nałożona właśnie deklarowana zmienna. Czasem możliwe jest też podanie wprost adresu pamięci, od którego obszar danej zmiennej ma się rozpoczynać, Było to dość często wykorzystywane w czasach, gdy prym jeszcze wiodły systemy operacyjne DOS, pracujące w trybie rzeczywistym procesora, gdzie programy bezpośrednio komunikowały się ze sprzętem poprzez ustalone adresy pamięci. Zmienna nakładana dostępna jest m.in. w takich językach i systemach programowania, jak:
- Turbo Pascal[2] – dyrektywa
absolute
- PL/I[1][3] – atrybut
DEFINED
(bądź skrótDEF
) ewentualnie połączony z modyfikatoremPOSITION
(skrótPOS
) - PL/M[6] – fraza
AT
.
Unia
Unia jest strukturą danych, której pola są rozmieszczane, począwszy od tego samego miejsca w pamięci. Odwołanie do danej w pamięci, w różny sposób, wymaga selekcji odpowiednich pól unii. Unie dostępne są w takich językach programowania jak, np. C[5], C++[7].
Rekord z wariantami
Rekord zawierający kilka wariantów, które są również rozmieszczane począwszy od tego samego miejsca w pamięci, także implementuje powyższy mechanizm, z koniecznością selekcji odpowiednich pól rekordu. Jednak takie podejście może ograniczać możliwość odwołania do innego wariantu niż aktualny, przy włączonej kontroli przez translator. Przykładowe języki to Pascal[8], Modula 2[9], Ada[10], Algol 68[4][11][4].
Inne konstrukcje
W Fortranie 77[12] nakładanie zmiennych realizowane jest przez instrukcję EQUIVALENCE
. Instrukcja ta jest instrukcją bierną. Postać instrukcji:
EQUIVALENCE (lista_zmiennych_1) [,(lista_zmiennych_2)[...]]
Każda z list zmiennych definiuje jeden wspólny obszar, w którym rozmieszczone zostaną zmienne wyspecyfikowanie na danej liście. Elementy listy są rozdzielone przecinkami.
Przykład – zdefiniowane trzech obszarów nakładania zmiennych:
EQUIVALENCE (A, B, C),(TEST, LITERA), (FA, FX, FY, ZK)
Zobacz też
Przypisy
- 1 2 Jan Bielecki, Rozszerzony PL/I i JCL w systemie OS/RIAD, Państwowe Wydawnictwo Naukowe, Warszawa 1986, Seria: Biblioteka Informatyki, ISBN 83-01-06146-4
- 1 2 3 4 5 Andrzej Marciniak, Borland Pascal 7.0, Wyd. Nakom, Poznań 1994 r., seria: Biblioteka Użytkownika Mikrokomputerów ISBN 83-85060-53-7, ISSN 0867-6011
- 1 2 Programowanie w języku PL/1 OS JS, M.I. Auguston, Anna Ignatowicz (tłum.), Warszawa: Państwowe Wydawnictwo Naukowe, 1988, ISBN 83-01-07463-9, OCLC 749883472 .
- 1 2 3 Michael Marcotty, Henry Ledgord, W kręgu języków programowania, tłumaczenie: Krystyna Jerzykiewicz, Wydawnictwa Naukowo-Techniczne, Warszawa 1980, Seria: Biblioteka Inżynierii Oprogramowania, ISBN 83-204-1342-7
- 1 2 Brian W. Kernighan, Dennis M. Ritche, Język C, Wydawnictwa Naukowo-Techniczne, Warszawa 1988, Seria: Biblioteka Inżynierii Oprogramowania, ISBN 83-204-1067-3
- ↑ Jan Bielecki, PL/M język programowania mikroprocesorów, Wydawnictwa Komunikacji i Łączności, Warszawa 1987, Seria: Elektronizacja, zeszyt 25
- ↑ Jan Bielecki, Od C do C++, programowanie obiektowe w języku C, Wydawnictwa Naukowo-Techniczne, Warszawa 1990, ISBN 83-204-1332-X
- ↑ Michał Iglewski, Jan Madey, Stanisław Matwin, Pascal. Język wzorcowy – Pascal 360., Wydawnictwa Naukowo-Techniczne, Warszawa 1984, wydanie trzecie – zmienione, Seria: Biblioteka Inżynierii Oprogramowania, ISBN 83-204-0597-1
- ↑ Niklaus Wirth, Modula 2, Wydawnictwa Naukowo-Techniczne, Warszawa 1987, Seria: Biblioteka Inżynierii Oprogramowania, ISBN 83-204-0828-8
- ↑ A. Nico Habermann, Dewayne E. Perry, Ada dla zaawansowanych, Wydawnictwa Naukowo-Techniczne, Warszawa 1989 r., seria: Biblioteka Inżynierii Oprogramowania, ISBN 83-204-1058-4
- ↑ Jan Małuszyński, Krzysztof Pisecki, Algol 68. Wprowadzenie do języka Algol 68, A. van Wijngaarden, B.J. Mailloux, J.E.L. Peck, C.H.A. Koster, M. Sintzoff, .H. Lindsey, L.G.L.T. Meertens, R.G. Fisker, w tłumaczeniu Jana Małuszyńskiego i Krzysztofa Piseckiego, Zmieniony raport o języku algorytmicznym Algol 68, Wydawnictwa Naukowo-Techniczne, Warszawa 1980, Seria: Informatyka, ISBN 83-204-0161-5
- ↑ Ryszard K. Kott , Krzysztof Walczak , Programowanie w języku Fortran 77, Warszawa: Wydawnictwa Naukowo-Techniczne, 1991, ISBN 83-204-1362-1, OCLC 749999902 .