Ingresja

Z Wikipedii, wolnej encyklopedii

Ingresja, punkt wejścia – punkt (miejsce) w podprogramie, od którego rozpoczyna się wykonywanie zawartych w bloku podprogramu instrukcji w wyniku wywołania tego podprogramu. Wywołanie pewnego podprogramu powoduje wykonanie określonych czynności wstępnych, przed wykonaniem instrukcji zawartych w bloku podprogramu zdefiniowanych przez programistę. Między innymi następuje skojarzenie argumentów wyspecyfikowanych w wywołaniu z odpowiadającymi im parametrami wyszczególnionymi w deklaracji podprogramu, a następnie wykonywane jest przeniesienie sterowania do odpowiedniego punku wejścia do podprogramu. W większości języków programowania dostępny jest jeden punkt wejścia do podprogramu, tzn. wykonywanie danego podprogramu rozpoczyna się zawsze od pierwszej instrukcji zawartej w bloku uruchomionego podprogramu. Istnieje jednak grupa języków, w których składni przewidziano możliwość tworzenia wielu punktów wejść do jednego podprogramu.

Ingresje w podprogramie[edytuj | edytuj kod]

Na ogół podprogram to ciąg oznaczonych w określony sposób instrukcji, który umożliwia w instrukcji wywołania bądź w wyrażeniu, przeniesienie sterowania do pierwszej instrukcji tego ciągu, a po jego wykonaniu powrót sterowania do miejsca wywołania. Sposób oznaczania takiego ciągu zależny jest od składni konkretnego języka programowania. Najczęściej jest to pewien identyfikator, choć stosowane są również inne rozwiązania, np. numer wiersza kodu. O ile większość języków programowania umożliwia w takim ciągu umieszczenie wielu instrukcji powrotu, tzn. wielu punktów wyjścia z podprogramu, o tyle stosunkowo niewiele języków zapewnia możliwość definiowania więcej niż jednego punktu wejścia do podprogramu. Możliwość definiowana wielu punktów wejść i wyjść do podprogramu to dodatkowe możliwości dla programisty kontrolowania i sterowania przebiegiem realizacji algorytmu, które jednak mogą powodować zwiększenie złożoności i zaciemnienie czytelności kodu źródłowego[1].

W językach, w których składni jest zawarte definiowanie dodatkowych punktów wejść do podprogramu, często rozróżnia się:

  • ingresję główną – pierwszy punkt wejścia, odpowiadający pierwszej instrukcji w bloku kodu podprogramu
  • ingresje poboczne – dodatkowo zdefiniowane punkty wejść wewnątrz bloku podprogramu.

Deklarowanie ingresji[edytuj | edytuj kod]

Sposób deklarowania ingresji zależny jest od składni konkretnego języka programowania. Dla ingresji głównej nie ma odrębnej deklaracji i wynika ona wprost z definicji podprogramu jako początek bloku kodu tego podprogramu. Dla ingresji pobocznych polega zasadniczo na umieszczeniu w odpowiednim miejscu kodu źródłowego podprogramu deklaracji ingresji o postaci analogicznej z nagłówkiem (prototypem) podprogramu, stosowanym w danym języku programowania. Zwykle stosowane jest jednak, w celu odróżnienia ingresji pobocznej od deklaracji podprogramu, inne słowo kluczowe identyfikujące taką deklarację. Przykładowo w języku PL/I zamiast słowa PROC (deklarującego ingresję główną), stosuje się słowo ENTRY[2].

Metody wywołania ingresji[edytuj | edytuj kod]

W językach programowania wejście do podprogramu następuje w wyniku wykonania instrukcji wywołania, wywołania podprogramu funkcyjnego w wyrażeniu czy też w inny sposób, np. przerwanie, zdarzenie itp. O tym, który podprogram zostanie wykonany, decyduje użycie odpowiedniego oznacznika podprogramu, np. identyfikatora. Wejście do podprogramu w innym punkcie niż punkt główny, tzn. w miejscu ingresji pobocznej, we wszystkich językach realizowane jest identycznie z wejściem do ingresji głównej, z tą różnicą, że należy zastosować oznacznik odpowiedniej ingresji pobocznej z listą argumentów zgodną z deklaracjami parametrów dla tej konkretnej ingresji.

Języki programowania[edytuj | edytuj kod]

W większości języków programowania wysokiego poziomu dostępny jest jeden punkt wejścia do podprogramów. Tak jest m.in. w językach Pascal[3][4], w implementacji Turbo/Borland Pascal[5], C[6][7], Modula-2[8], Clipper[9], Forth[10][4], Icon[11] i wielu innych. Poniżej przedstawiony jest przegląd tych języków, w których można definiować ingresje poboczne.

PL/I[edytuj | edytuj kod]

W języku PL/I można deklarować wiele punktów wejść do procedur (podprogramów proceduralnych jak i funkcyjnych). Taka deklaracja ingresji pobocznej ma postać:

 lista_ingresji_(identyfikatorów): ENTRY[(lista_parametrów)][lista_fraz];

Należy podkreślić, że każda ingresja może mieć różne parametry i atrybuty wyszczególnione na liście fraz[2].

Fortran[edytuj | edytuj kod]

Deklaracja kolejnego punktu wejścia do podprogramu w Fortranie (Fortran 77)[12], ma postać:

 ENTRY identyfikator_ingresji lista_parametrów

Basic[edytuj | edytuj kod]

W języku Basic, w szczególności starszych wersjach, np. dla komputerów ośmiobitowych, jedyną formą podprogramów były bezparametrowe bloki kodu wywoływane instrukcją GOSUB, identyfikowane numerem wiersza, a powrót następował po napotkaniu instrukcji RETURN. Taki sposób definiowania podprogramów umożliwiał tworzenie wielu punktów wejść:

10 
20 GOSUB 100
30 
40 GOSUB 120
50 
100 REM początek podprogramu
110 
120 REM ingresja poboczna
130 
140 RETURN

Ingresja główna dla tak skonstruowanego podprogramu znajduje się w linii 100, a ingresja poboczna w linii 120, co nie ogranicza możliwości tworzenia większej liczby ingresji pobocznych. W tym przypadku ingresja definiowana jest w wywołaniu, a nie w definicji podprogramu[4].

Asembler[edytuj | edytuj kod]

W języku niskiego poziomu jakim jest asembler, również istnieje możliwość definiowania bezparametrowych podprogramów z wieloma punktami wejść[13], na zasadach analogicznych do języka Basic. Stosuje się do tego instrukcje CALL i RET, które w swej istocie są analogiczne do instrukcji GOSUB i RETURN języka Basic.

Przypisy[edytuj | edytuj kod]

  1. 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
  2. a b Jan Bielecki, Rozszerzony PL/I i JCL w systemie OS/RIAD, Wydawnictwo Naukowe PWN, Warszawa 1986, Seria: Biblioteka Informatyki, ISBN 83-01-06146-4
  3. 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
  4. a b c Mike Duck, Języki mikrokomputerów. Przewodnik dla początkujących. Basic, Pascal, Logo, Prolog, Comal, Forth, Wydawnictwa Naukowo-Techniczne, Warszawa 1988, tłumaczenie: Marcin Turski, ISBN 83-204-0966-7
  5. Andrzej Marciniak, Borland Pascal 7.0, Wyd. Nakom, Poznań 1994, seria: Biblioteka Użytkownika Mikrokomputerów, ISBN 83-85060-53-7, ISSN 0867-6011
  6. Jan Bielecki, Od C do C++, programowanie obiektowe w języku C, Wydawnictwa Naukowo-Techniczne, Warszawa 1990, ISBN 83-204-1332-X
  7. Jan Bielecki, Turbo C z grafiką na IBM PC, Wydawnictwa Naukowo-Techniczne, Warszawa 1990, Seria: Mikrokomputery, ISBN 83-204-1101-7
  8. Niklaus Wirth, Modula-2, Wydawnictwa Naukowo-Techniczne, Warszawa 1987, Seria: Biblioteka Inżynierii Oprogramowania, ISBN 83-204-0828-8
  9. Wojciech Rogowski, Arkadiusz Serodziński, Clipper 5.0, Warszawa: Wydawnictwo PLJ, 1991, ISBN 83-85190-20-1, OCLC 749775734.
  10. Jan Bielecki, Język FORTH, Wydawnictwa Naukowo-Techniczne, Warszawa 1988, Seria: Mikrokomputery, ISBN 83-204-0930-6
  11. Ralph E. Griswold, Madge T. Griswold, Icon, Wydawnictwa Naukowo-Techniczne, Warszawa 1987, Seria: Biblioteka Inżynierii Oprogramowania, ISBN 83-204-0871-7
  12. Ryszard K. Kott, Krzysztof Walczak, Programowanie w języku Fortran 77, Warszawa: Wydawnictwa Naukowo-Techniczne, 1991, ISBN 83-204-1362-1, OCLC 749999902.
  13. Leo J. Scanlon, Assembler 8086/8088/80286, Intersoftland, Warszawa 1992, tłumaczenie: Lucyna Stanikowska, ISBN 83-85515-03-8