Podprogram
Z Wikipedii
Podprogram (inaczej funkcja lub procedura) - termin związany z programowaniem proceduralnym. Podprogram to wydzielona część programu wykonująca jakieś operacje. Podprogramy stosuje się, aby uprościć program główny i zwiększyć czytelność kodu.
[edytuj] Rodzaje podprogramów
W pewnych językach programowania dzieli się podprogramy na funkcje i procedury:
- Funkcja ma wykonywać obliczenia i zwracać jakąś wartość, nie powinna natomiast mieć żadnego innego wpływu na działanie programu (np. funkcja obliczająca pierwiastek kwadratowy)
- Procedura natomiast nie zwraca żadnej wartości, a zamiast tego wykonuje pewne działania (np. procedura czyszcząca ekran)
Podział ten występuje w językach takich jak Pascal i Ada. W pozostałych językach (m. in. w C i C++) nie ma już takiego rozróżnienia i funkcją jest każdy podprogram, niezależnie od tego czy zwraca jakieś wartości i czy ma wpływ na program.
[edytuj] Podprogram w asemblerze
W języku Asembler podprogram to wydzielona część kodu, do którego przy wywołaniu wykonuje się skok z odłożeniem adresu powrotu na stos, ewentualnie skok bezwarunkowy, a argumenty wywołania są albo odkładane na stos albo umieszczane bezpośrednio w rejestrach. Wartość wynikowa zwracana jest najczęściej w wyznaczonym rejestrze procesora - np. eax dla procesorów zgodnych z architekturą I386.
[edytuj] Podprogramy wewnętrzne
Różne języki programowania umożliwiają także definiowanie podprogramów wewnętrznych, tzn. podprogramu w innym podprogramie nadrzędnym. Do takich języków należą między innymi Pascal, PL/1, i inne. Nie ma takich możliwości np. w języku C.
[edytuj] Terminologia dotycząca podprogramów
Twórcy języków programowania stosują różne terminologie i oznaczenia podprogramów:
- w wielu językach programowania, a szczególnie tych, w których występuje tylko jeden rodzaj podprogramu, np. tylko funkcje, nie ma specjalnego oznaczenia (słowa kluczowego) podprogramu, przykładem jest język C i C++,
- procedury:
- PROCEDURE, np. Pascal, Ada, Algol, PL/1 (możliwość stosowania skrótu PROC), PROC - Comal,
- SUBROUTINE, np. Fortran, lub w skróconej postaci SUB, np. Basic i Visual Basic,
- PART, np. Jean, JOSS, (oznaczenie podprogramu PART stosuje się przy wywoływaniu podprogramu ale nie stosuje się do jego definiowania),
- PERFORM, np. Cobol,
- funkcje:
- FUNCTION, np. Pascal, Ada, Visual Basic i inne,
- PROCEDURE … RETURNS(typ) - PL/1, typ PROCEDURE – Algol.
[edytuj] Korutyny
Rzadziej stosowanym rodzajem podprogramów jest korutyna. Korutytny występują najczęściej parami i stanowią dwa „równorzędne” podprogramy – sterowanie zostaje przekazywane pomiędzy korutynami wielokrotnie, przy czym wywołanie danej korutyny powoduje wykonywanie instrukcji od miejsca ostatniego zakończenia (ostatniego punktu wyjścia), a nie od początku.
[edytuj] Rodziny podprogramów
Istnieją języki programowania, w których można definiować całą rodzinę podprogramów z jednakową nazwą dla wywołania różnych podprogramów. Do takich języków należą PL/1 i Ada. Nowsze języki umożliwiają zastosowanie takiego mechanizmu poprzez dopuszczenie przeciążenia nazw.
Przykład w PL/1:
DCL A GENERIC (PR1 WHEN(FLOAT), PR2 WHEN(CHAR), PR3 WHEN(FLOAT, CHAR), PR4 WHEN(LABEL));
W powyższym przykładzie wywołanie procedury A spowoduje w rzeczywistości wywołanie jednej z procedur PR1 .. PR4 w zależności od argumentów wywołania procedury A.
[edytuj] Metody wywołania podprogramu
Wartościową cechą podprogramu jest możliwość wielokrotnego jego wywołania. Wywołanie podprogramu może być:
- funkcyjne – w wyrażeniu, do którego podprogram zwraca obliczoną wartość,
- poprzez nazwę z listą argumentów, np. A=B+Func(C); lub
- wielokrotne (zagłębione), np. L=Trim(Copy(Delete(‘ Ala ‘,3,1),3));
oczywiście taka forma wywołania dotyczy tylko podprogramów mających cechy funkcji, tzn. zwracających wartość,
- proceduralne:
Konkretne implementacje języków często dopuszczają wywołanie funkcji w postaci proceduralnej, tzn. poza wyrażeniami. W tym przypadku zwracana przez podprogram wartość jest ignorowana – np. jest tak w Borland Pascalu.
[edytuj] Podprogramy w językach programowania
[edytuj] Podprogram w C
int funkcja(/* argumenty */) { // instrukcje do wykonania (ciało funkcji) return (/* wyrażenie */); }
[edytuj] Podprogram w Pascalu
Jako procedura:
procedure Procedura( {argumenty} ); begin { instrukcje do wykonania } end;
Jako funkcja:
function Funkcja( {argumenty} ) : integer; { typ wartości funkcji } begin { instrukcje do wykonania (ciało funkcji) } end;
[edytuj] Podprogram w Asemblerze
(składnia intelowska)
call podprogram ; wywołanie podprogramu ; ... podprogram: ; instrukcje podprogramu mov eax, 10h mov ebx, 34h int 21h ret ; powrót funkcji
[edytuj] Podprogram w PHP
function nazwapodprogramu($wejscie) { // wywołanie podprogramu, w PHP5 możliwe określenie klasy bazowej zmiennej $wejscie // zawartość podprogramu return $wyjscie; // zwrócenie wartości } // koniec podprogramu
[edytuj] Podprogram w języku Jean (oraz JOSS)
W języku Jean (oraz JOSS) każda instrukcja poprzedzona jest etykietą składającą się z dwóch części (liczby całkowite): PART.STEP. Wszystkie instrukcja poprzedzone jednakową etykietą PART tworzą bezparametrową procedurę.
1.1 DEMAND N 1.2 DEMAND A(I) FOR I=1(1)N 1.3 SET T=0 1.4 LET SUM(A,B)=A+B 1.5 DO PART 2 FOR I=1(1)N 1.6 TYPE T 2.1 SET T=SUM(T,A(I)) IF A(I)>0 2.2 SET T=T+1 DO PART 1
Ponadto w języku Jean można definiować funkcje w postaci prostych wyrażeń (podobnie jak w języku Basic):
4.1 LET SINX(X,A)=X+SIN(A)
[edytuj] Podprogram w języku BASIC
W języku Basic (wersje wczesne na komputery 8-bitowe) podprogramem jest ciąg instrukcji rozpoczynający się od wiersza o określonym numerze a zakończony instrukcją RETURN. Wywołanie podprogramu ma formę instrukcji skoku do określonego wiersza. Innym rodzajem podprogramu w Basicu jest definicja funkcji w formie wyłącznie prostego wyrażenia zawartego w jednej linii programu. W późniejszych wersjach Basicu wprowadzono definiowanie parametryzowanych podprogramów (SUB).
10 DEF SUM(X,Y)=X+Y 20 GOSUB 50 30 PRINT "WYNIK: ", A 40 END 50 A=SUM(1,2) 60 RETURN
[edytuj] Podprogram w PL/1
W języku PL/1 podprogram definiowany jest w postaci procedury. Podobnie jak danym, procedurom nadaję się różne atrybuty, wśród których można użyć frazy RETURNS(typ), która nadaje procedurze właściwości funkcji określając równocześnie typ zwracanej wartości.
Charakterystyczną cechę podprogramu w PL/1 jest to, że oprócz – występującej w większości języków programowania – możliwości zdefiniowania wielu punktów wyjść podprogramu (instrukcja RETURN i END), istnieje możliwość wyspecyfikowania wielu punktów wejść (zwanych w nomenklaturze PL/1 ingresjami) do podprogramu i to z różnymi parametrami i atrybutami.
/* ingresja główna – początek procedury */ nazwa: PROC (parametry) opcje i atrybuty; deklaracje instrukcje … /* ingresja poboczna – kolejny punkt wejścia do procedury */ nazwa_1: ENTRY (parametry) opcje i atrybuty; deklaracje instrukcje … /* ingresja poboczna – kolejny punkt wejścia do procedury */ nazwa_n: ENTRY (parametry) opcje i atrybuty; deklaracje instrukcje … END [nazwa];
[edytuj] Podprogram w języku Prolog
Podprogram w języku Prolog (Turbo Prolog) ma charakterystyczną postać, wynikającą z właściwości tego języka logiki. Nagłówek podprogramu deklarowany jest w sekcji PREDICATES, natomiast definicja podprogramu znajduje się w sekcji CLAUSES i może składać się z wielu faktów i reguł. Podprogram w tym języku jest więc zawsze predykatem, nawet jeśli ma on charakter czysto operacyjny (np. instrukcje wejścia-wyjścia, graficzne itp.).
Przykład:
PREDICATES rodzic(symbol, symbol) ojciec(symbol, symbol) … CLAUSES rodzic(Adam, Janusz). rodzic(Adam, Katarzyna). rodzic(Anna, Piotr). … ojciec(Przodek, Potomek) :- rodzic(Przodek, Potomek), mężczyzna(Przodek). …
[edytuj] Podprogram w języku Forth
Również charakterystyczna składnia języka Forth wyróżnia postać podprogramu w tym języku na tle innych języków programowania. W języku Forth definiujemy słowa. Słowo może być podprogramem do którego argumenty przekazywane są za pośrednictwem stosu (ale słowo może też być zmienną, stałą, nazwą słownika itd.). W poniższym przykładzie definiowany jest trywialny przykład podprogramu POW_3 w języku Forth, który powoduje podniesienie do 3 potęgi argumentu. Jak widać argument (liczba 5) podawany jest przed wywołaniem podprogramu – umieszczony zostaje na stosie – na którym Forth wykonuje operacje: w tym przypadku dwukrotne skopiowanie argumentu i dwukrotne mnożenie. Napis w nawiasie jest komentarzem. Wynik operacji również zostaje umieszczony na stosie i może być wykorzystany do dalszych obliczeń lub zapamiętany w zmiennej.
( POW_3, a -- b ) : POW_3 DUP DUP * * ; 5 POW_3
[edytuj] Podprogram w Logo
- Procedura:
to square :side reperat 4 [fd :side rt 90] end
- Zmienna z listą poleceń:
make "inst [fd 40 rt 90] run :inst
[edytuj] Podprogram w języku Snobol
* FUNCKJA ODWRACAJĄCA KOLEJNOŚĆ * ZNAKÓW W NAPISIE DEFINE('REV(X)C') :(K.REV) REV X LEN(1).C= :F(RETURN) REV=REV(X) C :(RETURN) K.REV
[edytuj] Podprogram w języku S
- procedura:
Sub nazwa(parametry) deklaracje Enter instrukcje Leave
- funkcja:
Def nazwa(parametry) as typ deklaracje Enter instrukcje Leave
[edytuj] Podprogram w języku Comal
xx PROC nazwa(parametry) instrukcje yy ENDPROC nazwa gdzie xx i yy to numery wierszy. Wywołanie: zz EXEC nazwa(argumenty)
[edytuj] Podprogram w języku MCPL
FUN name : [P, …, Pn] => Clist [: … : P, …, Pxn => Clist-x] .
MATH | EVERY [(args)] : P, …, Pn => Clist [: … : P, …, Pxn => Clist-x] .
Język posiada także mechanizmy umożliwiające definiowanie korutyn.