Wywołanie podprogramu

Z Wikipedii, wolnej encyklopedii

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[edytuj | edytuj kod]

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:

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:

  1. wywołanie dwóch podprogramów bibliotecznych write i readln, w instrukcji wywołania,
  2. wywołanie podprogramu Licz pobranego z modułu MyUnit, w wyrażeniu zawartym w instrukcji przypisania,
  3. wywołanie podprogramu bibliotecznego writeln, w instrukcji wywołania,

Wywołanie w wyrażeniu[edytuj | edytuj kod]

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:

  1. wywołanie standardowej funkcji scanf w instrukcji wyrażeniowej, wyrażenie składa się wyłącznie z wywołania tej funkcji,
  2. wywołanie niestandardowej funkcji licz w instrukcji wyrażeniowej, wyrażenie składa się z operacji przypisania, dodawania i wywołania tej funkcji,
  3. wywołanie standardowej funkcji printf w instrukcji wyrażeniowej, wyrażenie składa się wyłącznie z wywołania tej funkcji.

Szczegóły implementacje[edytuj | edytuj kod]

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.

Modyfikatory zmiany sposobu kompilacji w systemie Turbo C[8]
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[edytuj | edytuj kod]

  1. 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.).
  2. a b c Andrzej Marciniak: Borland Pascal 7.0. Poznań: Nakom, 1994, seria: Biblioteka Użytkownika Mikrokomputerów. ISBN 83-85060-53-7. ISSN 0867-6011. (pol.).
  3. Podręcznik Visual Basic na Wikibooks
  4. John Walkenbach: Excel 2003 PL. Programowanie w VBA.. HELION, 2004. ISBN 837361-504-0. (pol.).
  5. Niklaus Wirth: Modula 2. Warszawa: Wydawnictwa Naukowo-Techniczne, 1987, seria: Biblioteka Inżynierii Oprogramowania. ISBN 83-204-0828-8. ISSN 0867-6011. (pol.).
  6. a b Podręcznik języka C na Wikibooks
  7. 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.).
  8. a b c d Jan Bielecki: Turbo C z grafiką na IBM PC. Warszawa: Wydawnictwa Naukowo-Techniczne, 1990, seria: Mikrokomputery. ISBN 83-204-1101-7. (pol.).
  9. 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.).
  10. Podręcznik języka C++ na Wikibooks
  11. Ralph E. Griswold, Madge T. Griswold: Icon. Warszawa: Wydawnictwa Naukowo-Techniczne, 1987, seria: Biblioteka Inżynierii Oprogramowania. ISBN 83-204-0871-7. (pol.).
  12. 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[edytuj | edytuj kod]