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, Visual Basic, VBA, Modula 2 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: 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 i readln, w instrukcji wywołania, wywołanie podprogramu Licz pobranego z modułu MyUnit, 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, C++ i pochodne, Icon, Algol 68 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: #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 i Turbo Pascal. Aby skompilować funkcję C, dostosowaną do konwencji języka Pascal, należy zastosować niestandardowy dla tego języka modyfikator pascal w deklaracji funkcji.

+ Modyfikatory zmiany sposobu kompilacji w systemie Turbo C 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 Podręcznik języka C na Wikibooks Podręcznik języka C++ na Wikibooks

Podręcznik Visual Basic na Wikibooks

Bibliografia

Kategoria:Konstrukcje programistyczne

en:Calling convention