Deklaracja (informatyka)
Deklaracja – konstrukcja programistyczna w określonym języku programowania, służąca związaniu z określonym identyfikatorem jego znaczenia i atrybutów.
Elementy podlegające deklarowaniu
W różnych językach programowania wymagania dotyczące deklaracji określonych obiektów programowych są bardzo zróżnicowane. Deklarowaniu ogólnie podlegać mogą:
- zmienne
- parametry podprogramów
- moduły (biblioteki, pakiety, itp.)
- podprogramy (procedury, funkcje)
- etykiety
- klasy
- stałe
- typy
- literały
- inne elementy, specyficzne dla konkretnego języka programowania
W nomenklaturze informatycznej, czasem od deklaracji rozróżnia się definicję w odniesieniu do takich elementów jak między innymi:
- typów
- stałych
- literałów
- podprogramów
- klas
przy czym deklaracja i definicja może występować razem, lub oddzielnie w różnych miejscach kodu źródłowego.
Miejsce deklaracji
Deklaracje w kodzie źródłowym, zwykle musi poprzedzać pierwsze użycie danego identyfikatora w definiowanym algorytmie. Deklaracja stanowi więc informację dla translatora, która nie generuje kodu wykonywalnego (lecz często powoduje rezerwację pamięci).
Składnia większości języków programowania narzuca umieszczanie deklaracji w określonym miejscu kodu źródłowego. Jest to albo specjalna sekcja programu (modułu, podprogramu, pakietu), albo początek określonego bloku (czyli wszystkie deklaracje muszą zostać umieszczone w tekście programu przed pierwszą instrukcją danego bloku).
Rodzaje deklaracji
Deklaracje mogą być:
- niejawne
- jawne
- kompletne
- częściowe
Deklaracje niejawne
Deklaracje niejawne występują w językach programowania, które umożliwiają użycie identyfikatora bez jego jawnej deklaracji. W tym przypadku translator musi posiadać mechanizm przypisania do identyfikatora atrybutów na podstawie określonych metod:
- domyślnej
- niejawnej
- kontekstowej
Deklaracje niejawne mogą prowadzić do błędów, np. błąd literowy w identyfikatorze spowoduje utworzenie nowej zmiennej, a tym samym błąd w działaniu programu.
Deklaracje jawne
Deklaracje jawne mogą być kompletne lub częściowe. W przypadku deklaracji częściowych mogą wystąpić następujące przypadki:
- niesymetryczna struktura atrybutów (np. w deklaracji wystąpienie atrybutu EXTERNAL może oznaczać obiekt zewnętrzny (zmienną, procedurę itp.) zdefiniowany w innym module, a brak jego specyfikacji oznacza obiekt wewnętrzny (tworzony daną deklaracją w danym module), przy czym brak jest możliwości jawnej specyfikacji atrybutu przeciwstawnego dla EXTERNAL (np. o nazwie INTERNAL),
- aparat atrybutów domyślnych, obowiązują tu zasady uzupełniania atrybutów według metod jak dla deklaracji niejawnych (np. mogą istnieć atrybuty EXTERNAL i INTERNAL, przy czym brak jawnej specyfikacji któregokolwiek z tych dwóch przeciwstawnych atrybutów oznaczać będzie wystąpienie jednego z nich, np. INTERNAL).
Przykłady deklaracji
deklaracje zmiennych
Deklaracja zmiennej może zawierać oprócz samej deklaracji, także inicjalizację zmiennej, tj. nadanie zmiennej wartości początkowej.
Deklaracje występują[1][2][3]:
- poza funkcją, klasą, metodą – dla zmiennych globalnych
- na początku instrukcji blokowej { } dla zmiennych lokalnych.
- jako wyrażenie w dalszych częściach instrukcji blokowej { } dla zmiennych lokalnych (nie w języku C)
int global_var; main() { int y; ... { int z=1; getch(); int x=5; /*nie w języku C*/ ... } ... }
Deklaracje występują w programie lub podprogramie w specyfikacji bloku, zawartej pomiędzy nagłówkiem (program, procedure, function, unit (Turbo Pascal)), a słowem rozpoczynającym instrukcję grupującej danego bloku (begin)[4][5].
program Przykład; var globar_var; ... procedure Licz(); var local_var; begin
end; {procedure} begin
end. {program}
Deklaracja ma postać instrukcji DECLARE (lub skrótowe DCL) I może wystąpić w dowolnym miejscu wnętrza bloku (w PL/1 takim blokiem jest albo procedura od nagłówka PROCEDURE do słowa END albo instrukcja blokowa BEGIN … END) i dotyczy obiektów dostępnych w danym bloku. Język ma bardzo rozbudowaną składnię atrybutów i rozbudowany mechanizm atrybutów domyślnych i deklaracji niejawnych[6][7].
Przykład: PROC; ... /* użyto zmiennej X zadeklarowanej dalej */ X=1; ... /* deklaracja w bloku może wystąpić po użyciu identyfikatora lecz deklarowana zmienna dostępna jest od początku bloku */ DCL X FIXED DECIMAL(5,0); ... END Przykład;
deklaracje etykiet
{Pascal} program DclLabel; label Etykieta; … begin … Etykieta: …; … goto Etykieta; … end.
deklaracje modułów
Turbo Pascal[5]:
program DclUnit; uses Crt, Graph, MyUnit; ... begin ... Write('Użyto procedury modułu Crt'); ... end.
Modula 2[8]:
MODULE DclUnit; FROM InOut IMPORT Read, Write, ...; ... Write('Użyto procedury modułu InOut'); ... END DclUnit.
deklaracje podprogramów
Deklaracja podprogramu ma postać nagłówka podprogramu definiującego oprócz identyfikatora przypisanego podprogramowi, także inne, wymagane przez dany język programowania elementy, jak np. parametry. Może także zawierać opcjonalne frazy i modyfikatory, np. dotyczące rozmieszczenia w pamięci, czy sposobu pobrania podprogramu zewnętrznego z biblioteki.
W języku C[1][2][3], C++[3] deklaracje podprogramów (nazywane prototypem) umieszcza się najczęściej w plikach nagłówkowych, definiujących określone moduły.
/* prototyp funkcji trunc */ int trunc(double x);
Deklaracje podprogramów stosuje się, gdy podprogram ma być wywołany, a nie został jeszcze zdefiniowany[4][5].
{ Pascal } procedure Proc_1; forward; procedure Proc_2; begin … {wywołanie procedury, która nie została jeszcze zdefiniowana, wymagana była deklaracja} Proc_1; … end; … {Późniejsza definicja procedury} procedure Proc_1; begin … end;
Deklarację wyprzedzającą podprogramu stosuje tak jak w Pascalu. W Delphi deklaracje występują także w modułach (stanowiących rozszerzenie Delphi w stosunku do Pascala) w sekcji interface.
{ Delphi } unit Przykład; interface { deklaracja podprogramu dostępnego w innych modułach i programach } function trunc(x : real): integer; implementation { definicja zadeklarowanego wyżej podprogramu ponieważ parametr i wartość zwracana zostały zdefiniowane w deklaracji podporgramu w sekcji interface, nie jest wymagane ich powtórzenie } function trunc; begin …
Przypisy
- ↑ a b Brian W. Kernighan, Dennis M. Ritche: Język C. Warszawa: Wydawnictwa Naukowo-Techniczne, 1988, seria: Biblioteka Inżynierii Oprogramowania. ISBN 83-204-1067-3. (pol.).
- ↑ a b Jan Bielecki: Turbo C z grafiką na IBM PC. Warszawa: Wydawnictwa Naukowo-Techniczne, 1990, seria: Mikrokomputery. ISBN 83-204-1101-7. (pol.).
- ↑ a b c Jan Bielecki: Od C do C++, programowanie obiektowe w języku C. Warszawa: Wydawnictwa Naukowo-Techniczne, 1990. ISBN 83-204-1332-X. (pol.).
- ↑ a b c Michał Iglewski, Jan Madey, Stanisław Matwin: Pascal. Język wzorcowy – Pascal 360. Wyd. trzecie – zmienione. Warszawa: Wydawnictwa Naukowo-Techniczne, 1984, seria: Biblioteka Inżynierii Oprogramowania. ISBN 83-85060-53-7. ISSN 0867-6011. (pol.).
- ↑ a b c d Andrzej Marciniak: Borland Pascal 7.0. Poznań: Nakom, 1994, seria: Biblioteka Użytkownika Mikrokomputerów. ISBN 83-85060-53-7. ISSN 0867-6011. (pol.).
- ↑ Jan Bielecki: Rozszerzony PL/I i JCL w systemie OS/RIAD. Warszawa: Państwowe Wydawnictwo Naukowe, 1986, seria: Biblioteka Informatyki. ISBN 83-01-06146-4. (pol.).
- ↑ M. I. Auguston i inni: Programowanie w języku PL/1 OS JS. Warszawa: Państwowe Wydawnictwo Naukowe, 1988. ISBN 83-01-07463-9. (pol.).
- ↑ Niklaus Wirth: Modula 2. Warszawa: Wydawnictwa Naukowo-Techniczne, 1987, seria: Biblioteka Inżynierii Oprogramowania. ISBN 83-204-0828-8. ISSN 0867-6011. (pol.).
Bibliografia
- Michael Marcotty, Henry Ledgord, tłumaczenie: Krystyna Jerzykiewicz: W kręgu języków programowania. Warszawa: Wydawnictwa Naukowo-Techniczne, 1980, seria: Biblioteka Inżynierii Oprogramowania. ISBN 83-204-1342-7. (pol.).
- John E. Nicholls: Struktura języków programowania. Warszawa: Wydawnictwa Naukowo-Techniczne, 1980, seria: Informatyka. ISBN 83-204-0246-8. (pol.).