Privacy Policy Cookie Policy Terms and Conditions Podprogram - Wikipedia, wolna encyklopedia

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.

Spis treści

[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:

[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:
    • poprzez nazwę z listą argumentów, np. Proc(A, 5); - m. in. Pascal,
    • po słowie kluczowym,
    • inne:
      • Basic : 10 GOSUB 50
      • Jean, JOSS : 1.2 DO PART 3

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.

THIS WEB:

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - be - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - closed_zh_tw - co - cr - cs - csb - cu - cv - cy - da - de - diq - dv - dz - ee - el - eml - en - eo - es - et - eu - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gd - gl - glk - gn - got - gu - gv - ha - haw - he - hi - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mg - mh - mi - mk - ml - mn - mo - mr - ms - mt - mus - my - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - rm - rmy - rn - ro - roa_rup - roa_tara - ru - ru_sib - rw - sa - sc - scn - sco - sd - se - searchcom - sg - sh - si - simple - sk - sl - sm - sn - so - sq - sr - ss - st - su - sv - sw - ta - te - test - tet - tg - th - ti - tk - tl - tlh - tn - to - tokipona - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu

Static Wikipedia 2008 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2007:

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - be - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - closed_zh_tw - co - cr - cs - csb - cu - cv - cy - da - de - diq - dv - dz - ee - el - eml - en - eo - es - et - eu - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gd - gl - glk - gn - got - gu - gv - ha - haw - he - hi - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mg - mh - mi - mk - ml - mn - mo - mr - ms - mt - mus - my - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - rm - rmy - rn - ro - roa_rup - roa_tara - ru - ru_sib - rw - sa - sc - scn - sco - sd - se - searchcom - sg - sh - si - simple - sk - sl - sm - sn - so - sq - sr - ss - st - su - sv - sw - ta - te - test - tet - tg - th - ti - tk - tl - tlh - tn - to - tokipona - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu

Static Wikipedia 2006:

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - be - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - closed_zh_tw - co - cr - cs - csb - cu - cv - cy - da - de - diq - dv - dz - ee - el - eml - en - eo - es - et - eu - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gd - gl - glk - gn - got - gu - gv - ha - haw - he - hi - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mg - mh - mi - mk - ml - mn - mo - mr - ms - mt - mus - my - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - rm - rmy - rn - ro - roa_rup - roa_tara - ru - ru_sib - rw - sa - sc - scn - sco - sd - se - searchcom - sg - sh - si - simple - sk - sl - sm - sn - so - sq - sr - ss - st - su - sv - sw - ta - te - test - tet - tg - th - ti - tk - tl - tlh - tn - to - tokipona - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu