Wywołanie podprogramu, to przekazanie sterowania w programie komputerowym do wybranego podprogramu. Taka operacja definiowana jest w kodzie źródłowym w odpowiedni sposób określony w składni konkretnego języka programowania. Wywołanie podprogramu, w skompilowanym, gotowym programie komputerowym, wiąże się z niejawnym wykonaniem szeregu akcji dodatkowych, takich między innymi jak skojarzenie argumentów zawartych w wywołaniu z odpowiednimi parametrami wyspecyfikowanymi w deklaracji podprogramu, a także umieszczenie na stosie niezbędnego adresu umożliwiającego powrót z podprogramu do miejsca wywołania oraz wiele innych kwestii i szczegółów technicznych.
Rodzaje wywołania
W tych językach, w których wyróżnia się instrukcję i wyrażanie jako odrębne pojęcia składniowe (np. Pascal[1][2], Visual Basic[3], VBA[4], Modula 2[5] i inne), rozróżnić można wywołanie podprogramu:
- w instrukcji wywołania,
- w wyrażeniu, do którego podprogram przekazuje wartość.
Przykład w języku Turbo Pascal[2]:
uses Crt, MyUnit;
var x : integer;
begin
write('x='); readln(x); { 1 }
x:=1+Licz(x); { 2 }
writeln('New x is ',x) { 3 }
end.
W powyższym przykładzie mamy w kolejnych liniach kodu źródłowego następujące wywołania podprogramów:
- wywołanie dwóch podprogramów bibliotecznych
write
ireadln
, w instrukcji wywołania, - wywołanie podprogramu
Licz
pobranego z modułuMyUnit
, w wyrażeniu zawartym w instrukcji przypisania, - wywołanie podprogramu bibliotecznego
writeln
, w instrukcji wywołania,
Wywołanie w wyrażeniu
Natomiast w innych językach, takich jak np. C[6][7][8][9], C++[10][9] i pochodne, Icon[11], Algol 68[12] i inne, wywołanie podprogramu dokonywane jest zawsze w wyrażeniu, nawet jeżeli jest to wywołanie proceduralne w odrębnej linii kodu bez przypisania zwracanej przez podprogram wartości (tj. z jej ignorowaniem). Takie wywołanie bowiem stanowi instrukcję wyrażeniową, na którą składa się wyrażenie zakończone odpowiednim ogranicznikiem instrukcji, tzn. terminatorem lub separatorem, w zależności od przyjętych przez autorów języka rozwiązań.
Przykład w języku C[6][7][8][9]:
#include "stdio.h"
int licz(int x);
int main(void)
{
int x;
scanf("x=%d\n\r", x); /* 1 */
x = 1 + licz(x); /* 2 */
printf("New x is %d", x); /* 3 */
}
W powyższym przykładzie mamy w kolejnych liniach kodu źródłowego następujące wywołania w wyrażeniach:
- wywołanie standardowej funkcji
scanf
w instrukcji wyrażeniowej, wyrażenie składa się wyłącznie z wywołania tej funkcji, - wywołanie niestandardowej funkcji
licz
w instrukcji wyrażeniowej, wyrażenie składa się z operacji przypisania, dodawania i wywołania tej funkcji, - wywołanie standardowej funkcji
printf
w instrukcji wyrażeniowej, wyrażenie składa się wyłącznie z wywołania tej funkcji.
Szczegóły implementacje
Różny sposób implementacji wywołania podprogramu w różnych systemach programowania skutkować może ich niezgodnością i brakiem możliwości programowania hybrydowego. Przykładem takiej niezgodności są różne konwencje zastosowanie dla języka C i Pascal, które dla uzyskania odpowiedniej zgodności wymuszają stosowanie dodatkowych modyfikatorów, powodujących zmianę sposobu kompilacji podprogramu, umożliwiającą zastosowanie podprogramu w innym systemie programowania. Za przykład mogą posłużyć kompilatory firmy Borland serii Turbo, w tym Turbo C[8] i Turbo Pascal[2]. Aby skompilować funkcję C, dostosowaną do konwencji języka Pascal, należy zastosować niestandardowy dla tego języka modyfikator pascal
w deklaracji funkcji.
kompilacja dla systemu: | Turbo C | Turbo Pascal |
---|---|---|
modyfikator w Turbo C | cdecl |
pascal |
odkładanie argumentów na stos | od prawej do lewej | od lewej do prawej |
zdejmowanie argumentów ze stosu | funkcja wywołująca | funkcja wywoływana |
nazwa funkcji przekazywana konsolidatorowi | poprzedzona znakiem podkreślenia "_" | nie poprzedzona znakiem podkreślenia |
nazwa funkcji | bez zmian | zmiana małych liter na wielkie |
Przypisy
- ↑ 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.).
- 1 2 3 Andrzej Marciniak: Borland Pascal 7.0. Poznań: Nakom, 1994, seria: Biblioteka Użytkownika Mikrokomputerów. ISBN 83-85060-53-7. ISSN 0867-6011. (pol.).
- ↑ Podręcznik Visual Basic na Wikibooks
- ↑ John Walkenbach: Excel 2003 PL. Programowanie w VBA.. HELION, 2004. ISBN 837361-504-0. (pol.).
- ↑ Niklaus Wirth: Modula 2. Warszawa: Wydawnictwa Naukowo-Techniczne, 1987, seria: Biblioteka Inżynierii Oprogramowania. ISBN 83-204-0828-8. ISSN 0867-6011. (pol.).
- 1 2 Podręcznik języka C na Wikibooks
- 1 2 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.).
- 1 2 3 4 Jan Bielecki: Turbo C z grafiką na IBM PC. Warszawa: Wydawnictwa Naukowo-Techniczne, 1990, seria: Mikrokomputery. ISBN 83-204-1101-7. (pol.).
- 1 2 3 Jan Bielecki: Od C do C++, programowanie obiektowe w języku C. Warszawa: Wydawnictwa Naukowo-Techniczne, 1990. ISBN 83-204-1332-X. (pol.).
- ↑ Podręcznik języka C++ na Wikibooks
- ↑ Ralph E. Griswold, Madge T. Griswold: Icon. Warszawa: Wydawnictwa Naukowo-Techniczne, 1987, seria: Biblioteka Inżynierii Oprogramowania. ISBN 83-204-0871-7. (pol.).
- ↑ Jan Małuszyński, Krzysztof Pisecki, 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: Algol 68. Wprowadzenie do języka Algol 68. Zmieniony raport o języku algorytmicznym Algol 68. Warszawa: Wydawnictwa Naukowo-Techniczne, 1980, seria: Informatyka. ISBN 83-204-0161-5. (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.).