A PL/1 programozási nyelv

Alprogramok

Alprogramok

Blokkstruktúra

A PL/1 blokkstrukturált nyelv. A program kétféle blokkot tartalmazhat: BEGIN ... END blokkot és alprogramokat. A blokkok egymásba ágyazhatók, de külön fordítási egységet csak alprogramok jelenthetnek.

A BEGIN ... END blokk végrehajtása akkor kezdődik el, amikor a vezérlés a BEGIN-en keresztül belép a blokkba, az alprogramok viszont csak CALL hívás hatására hajtódnak végre. A blokkok deklarációs részt és egy végrehajtható utasítássorozatot tartalmaznak. A blokkstruktúrára itt is ugyanazok a hatásköri szabályok érvényesek, mint az ALGOL 60 nyelvben. A főprogramot a PROCEDURE OPTIONS(MAIN) kulcsszavak azonosítják, amiből minden szerkesztésben csak egy szerepelhet.

A főprogram tehát egy olyan eljárás, amelyben megadjuk a MAIN opciót is:

programnév : PROCEDURE OPTIONS(MAIN); ... programnév : END;

Az egyes fordítási egységek között az EXTERNAL kulcsszóval teremthetjük meg a kapcsolatot.

Eljárások, absztrakt eljárások

Az eljárások és függvények a blokkok egyik fajtája a nyelvben. Minden alprogram egy címkével kezdődik és a PROCEDURE kulcsszóval azonosítjuk. A főprogramot az különbözteti meg az alprogramoktól, hogy paraméter nélküli és az OPTIONS(MAIN) kulcsszó van mögé írva. Egy alprogram akkor lesz függvény, ha van visszatérési értéke, amit a PROCEDURE után írt RETURNS kulcsszó azonosít. Itt a változók típusánál megadott alapértelmezési szabályok használhatók. Ekkor meg kell mondani, milyen típusú a visszatérési érték. Alprogramokat a CALL utasítással hívhatunk. Ha rekurzív hívást is meg akarunk engedni, ezt fel kell tüntetni az alprogram fejrészében a RECURSIVE szóval. Alprogram típusú változó nem definiálható a PL/1-ben. Az alprogramnevek átlapolására nincs lehetőség. A nyelv az operátordefiniálást nem ismeri.

Alprogramok paraméterezése

Minden alprogramnak lehetnek paraméterei. Ezeket a paramétereket a PROCEDURE után zárójelben kell felsorolni, de csak magukat a változóneveket, amilyen névvel hivatkozni fogunk a paraméterre. Az alprogram elején külön deklarálni kell a szokásos módon minden paraméterként megadott változónevet. A híváskor név szerinti paraméterátadás történik.

A paraméterekhez nem rendelhető alapértelmezett érték, de leprogramozható több belépési pont megadásával.

Hívási szabályok:

  • A paraméterlistán és az argumentumlistán ugyanannyi változónak kell szerepelnie.
  • Az argumentumok lehetnek változók, kifejezések és konstansok; a paraméterek csak változók lehetnek.
  • A szubrutin belsejében értéket felvevő paraméterekhez csak változók rendelhetők hozzá.
  • Az összetartozó paramétereknek egyazon típusúnak kell lenniük.
  • A két lista változóinak nevei egymást átfedhetik.
  • Az eljárásfejben minden paraméter típusa deklarálandó, ami implicit nem deklarálódik.
  • Formális paraméternek tömbök, sorozatok és struktúrák is megadhatók. Ha a paraméter tömb, akkor az alprogramban nem kell deklarálni a tömb méretét, függvényekkel lekérdezhető az alsó és felső indexhatár. Ekkor a tömb formális paraméter deklarációjában a * jel használható.
  • Külső alprogramok

    Más fordítási egységben lévő alprogramok hívásakor a fordító nem ellenőrzi a paraméterek típusait. Lehetőség van a külső eljárások deklarálásánál a paraméterek deklarációját is megmondani, viszont a fordító ezt csak a fordítási egységen belül tudja ellenőrizni. Ez érthető is, hiszen a másik fordítási egységgel már csak a szerkesztő kerül kapcsolatba, ahol már ilyen jellegű ellenőrzésre nincs lehetőség.

    Be- és kilépési pontok

    A PL/I alprogram fogalma túllép a többi nyelv alprogramformáin, és a későbbi nyelvek modulfogalmához közelít. Az alprogramoknak ugyanis belépési pontjaik lehetnek, amelyek ugyanúgy meghívhatók, mint maguk az alprogramok. A belépési pontoknak is lehetnek saját formális paramétereik, ugyanakkor közösen használhatják az őket befogadó alprogram változóit. Az ENTRY a STATIC és a CONTROLLED együtt lehetőséget adnak absztrakt objektumok megvalósítására is.

    A belépési pontok az alprogramok részeként adhatók meg. Ezek külön paraméterezéssel is rendelkezhetnek, valamint ugyanúgy hívhatók, mint maguk az alprogramok. Paraméterek használatakor a belépési pont ENTRY kulcsszava mögött (hasonlóan a PROCEDURE kulcsszóhoz) felsoroljuk a változóneveket, majd a következő sorokban deklarálni kell azokat. Ez után a szokásos CALL utasítással hívható meg a belépési pont. Többszörös kilépési pont definiálható a függvényeknél, több RETURN utasítást definiálva. Eljárások esetén szimulálható a többszörös kilépési pont az eljárás végére ugorva (GO TO).

    STACK : PROC(SIZE); DCL SIZE FIXED BIN; DCL S(*) CHAR(1) CTL, N FIXED BIN STATIC INIT (0); ALLOCATE S(SIZE); RETURN; PUSH : ENTRY(X); DCL X CHAR(1); N = N + 1; S(N) = X; RETURN; POP : ENTRY RETURNS (CHAR(1)); N = N - 1; RETURN (S(N+1)); END;

    Globális, lokális változók, eljárások

    Globális változókat az EXTERNAL kulcsszóval deklarálható. Ugyanezzel mondható meg az is, hogy ha egy alprogram külső eljárás vagy függvény. Alapértelmezés szerint minden változó és alprogram INTERNAL, azaz belső használatú. Az EXTERNAL használata ad lehetőséget arra is, hogy egy fordítási egységben globális változót használjunk. De természetesen ekkor a külső eljárások is látni fogják a globális változót.