Pascal-FC
Nyelvi elemek
Általánosságban elmondható, hogy a párhuzamos Pascal (továbbiakban Pascal-FC) az eredeti Pascal nyelvi elemeivel nagy hasonlóságot mutatnak, így ebben a dokumentumban csak az érdekességekre és a különbségekre szeretnék kitérni:
Azonosítók:
A Pascal-FC forrásszinten a kis, -és nagybetűk között nem tesz különbséget.
Az azonosítók betűvel kezdődnek, betűket és számje gyeket tartalmaznak, de aláhúzásjel nem lehet bennük.
Konstansok:
A konstansok az eredeti Pascalban megadott szabályok szerint viselkednek egy kivétellel: nincsen string konstans. Vannak azonban integer, real és character konstansok.
Megjegyzések:
A megjegyzések (* és *), vagy { és } közé zárt karaktersorozatok.
Változók deklarációja:
A változók deklarációjában azonosítók listája áll, melyet a típus azonosítója követ.
Vezérlési szerkezetek
Értékadás:
Az értékadás a bal oldalon álló változónak értékül adja a jobb oldalon álló kifejezés értékét. Nem különbözik a standard Pascalban megszokottaktól.
Üres utasítás:
Bevezették az üres utasítást (null), mint alternatívát Pascal empty utasítására.
Szekvencia:
Az egymás után le írt utasítások sorozatát pontosvesszővel kell elválasztani.
Elágazások:
Az IF, illetve a CASE utasítások viselkedése és szintaktikája teljesen megegyezik a Pascalban megszokottakkal:
IF:
Szintaxis :
IF Kifejezés THEN Utasítás END;
vagy
IF Kifejezess THEN IgazAg ELSE HamisAg END;
vagy
IF Kif1 THEN Ag1 ELSIF Kif2 THEN Ag2 ELSE EgyikSemAg END;
CASE:
Szintaxis:
CASE Kifejezess OF Eset1: Ag1 | ... | EsetN: AgN END;
vagy
CASE Kifejezess OF Eset1: Ag1 | ... | EsetN: AgN ELSE EgyikSemAg END;
Ciklusok:
For:
A for utasítás csak annyiban tér el a standard Pascalos for-tól, hogy nincs lehetőségünk a downto használatára:
FOR Változó:=Kezdő TO Vég DO Utasítás END;
While:
Szintaxisa teljesen azonos a Pascal while utasításéval:
WHILE Kifejezess DO Utasítás END;
Repeat:
A Repeat ciklus szintaxisát kibővítették a FOREVER kulcsszóval, amely a végtelen ciklust valósítja meg. REPEAT Utasítás UNTIL Boolean_kifejezés;
vagy
REPEAT Utasítás UNTIL FOREVER;
Alprogramok
A Pascal-FC-ben az al programoknak két fajtája van: az eljárások (procedure) és függvényhívások(function). A deklarációk sorrendje (ami az eredeti Pascalban label, const, type, var, procedure és function volt) a Pascal-FC-ben nem kötött, továbbá a nyelv támogatja az előre hivatkozást.
Formailag mind az eljárások, mind pedig a függvényhívások teljesen megegyeznek az eredeti Pascalban megadottakkal.
Eljárás (Procedure):
Szintaxis:
PROCEDURE Eljárás(Paraméterek)
BEGIN
...
END Eljárás;
Függvény (Function):
Szintaxis:
PROCEDURE Függvény(Paraméterek): EredményTípus
BEGIN
...
END Függvény
Paraméterátadás:
A formális paramétereket a Pascalban megszokott módon kétféle módon adhatjuk át: cím szerint és érték szerint. Az érték szerint átadott paraméter valójában lokális változó, amely kezdőértékét az aktuális paraméter - mint kifejezés - értékéből kapja. A cím szerinti paraméterátadást a paraméterlista megfelelő paramétere elé helyezett var kulcsszóval jelezhetjük, ekkor az aktuális paraméternek változónak vagy rekord mezejének kell lennie és minden hivatkozás a formális paraméterre ezt a változót vagy mezőt fogja használni. A formális paraméterek felsorolhatók egyenként vagy - ha az egymás utániak típusa megegyezik - csoportosítva is. A cím szerinti átadást külön jelezni kell, az alapértelmezést, az érték szerintit nem.
Szintaxis:
Parameter1, ..., ParaméterN: KözösTípus;
vagy
Parameter1: Tipus1; ...; ParaméterN: TípusN;
vagy
VAR VáltozóParaméter: Típus;
Típusok
Beépített típusok:
A beépített típusok a következők:
- előjeles egész szám – itt lehetőségünk van a 10-től különböző számrendszerben is dolgozni
- valós szám (REAL)
- karakter (CHAR)
- sztring (STRING)
- logikai (BOOLEAN)
- bitset (BITSET)
- condition (CONDITION)
- szemafor (SEMAPHORE)
- szinkron (SYNCHRONOUS)
Típuskonstrukció:
A Pascal-FC nem támogatja a file típust, filekezelésre a standard input és outputot lehet csak használni.
További eltérések mutatkoznak a standard Pascalhoz képest: egyrészt nincs lehetőségünk altípus(subrange), halmaz(set) és mutató(pointer) típusok létrehozására, viszont bejön néhány új típus, amelyekről később még lesz szó. Így a type kulcsszóval a következő típusokat hozhatjuk létre:
- saját típus (más, már meglévő típusból származtatva)
- felsorolási típus
- tömb típus
- rekord típus
Felsorolási típus:
A felsorolási típusok definíciójában konstans azonosítók felsorolásával jelölhető ki a típusértékek halmaza. Az első konstanshoz tartozó típusérték a nulla, a többi konstanshoz a felsorolás sorrendjében eggyel növekvő típusérték rendelődik hozzá. Megegyezik a standard Pascal felsorolási típusával.
Szintaxis:
TípusNév = (Konstans1, ..., KonstansN);
Tömb típus:
Az elemek típusa azonos, számukat a definíció rögzíti. Az elemekre indexeléssel lehet hivatkozni. Szintaxis:
Típus = ARRAY [IndexTartomany] OF BázisTípus;
Rekord típus:
A rekord előre meghatározott számú mezőből áll, amelyek típusa egymástól független. A rekord definíciója a mezőkhöz azonosítókat - szelektor okat - rendel hozzá, ezeknek láthatósági köre a rekordra korlátozódik. Szintaxis:
Típus = RECORD
Mező1, Mező2: Típus1;
...MezőN: TípusN;
END;
A nyelv támogatja az unió típust is, amikor mezők - vagy mezők csoportjai - a rekordnak ugyanarra a részterületére, egymás fölé definiálódnak. Ezt is rekord formájában kell megadni:
Típus = RECORD
CASE Field: Típus OF
Eset1: Mező11: Típus11; ...; Mező1N: Típus1N; |
... |
EsetN: MezőN1: TípusN1; ...; MezőNN: TípusNN;
END;
END;
Sablonok
A Pascal-FC nem támogatja a sablonokat (generic).
Kivételkezelés
A nyelv nem támogatja a kivételek kezelését. A futás közben fellépő hibák hibaüzenetet okoznak.
Objektum-orientáltság
A nyelv nem támogatja az objektum-orientáltságot.
Helyességbizonyítás
A nyelv nem támogatja a helyességbizonyítást.
Párhuzamosság
Tekintve, hogy a Pascal-FC a standard Pascal párhuzamos kiterjesztettje, ezért a párhuzamosságot támogató eszközökben nincs hiány.
Párhuzamos utasítás:
A főprogram szokványos, szekvenciális végrehajtását ágaztathatjuk több felé a párhuzamos utasítássokkal, amelyek kezdetét a COBEGIN, végét a COEND jelzi, és a két kulcsszó közt elhelyezkedő utasítások ezáltal párhuzamosan hajtódnak végre. Ez azonban nem “igazi” párhuzamosság, a végrehajtás csak egy szálon fut, de a sorrend nem meghatározott. Igazi párhuzamosságra a párhuzamos utasításokon belül aktivált processzek lesznek alkalmasak.
Process:
A párhuzamosság alapja a process a Pascal-FC-ben. Készíthetünk belőle saját process típust, amiből aztán valahány példányt, változót származtatunk, vagy rögtön egy adott process objektumot is deklarálhatunk. A processzek aktiválása csak párhuzamos utasításban történhet, és ekkor válik szét fizikailag a vezérlés.
Processzek deklarálását csak a globális deklarációs részben tehetjük meg.
Process típus deklaráció:
Szintaxis:
process type azon[args] provides
entry;
end;
és
process type azon[args]
entry;
deklarációk;
begin
ut1;
...
utk;
end;
Így csak egy típusazonosító jön létre, amelyet később használhatunk változók vagy típusok deklarálására, de rekord eleme nem lehet.
Process objektum deklaráció:
Szintaxis:
process azon[args] provides
entry;
end;
és
process azon[args]
entry;
deklarációk;
begin
ut1;
...
utk;
end;
Így egy processz-azonosító jön létre, amelyet később aktiválhatunk.
Process aktiválása:
Csak párhuzamos utasításon belül történhet, és a párhuzamos utasítás addig nem ér véget, amíg az összes belőle elindított process nem terminált.
Szintaxis:
processz_azon(aktuális paraméterek);
Szemafor:
A típusok felsorolásánál volt szó egy új típusról, a szemaforról (semaphore). Csak a globális deklarációs részben hozható létre, és paraméterként csak cím szerint adhatók át. Négy műveletet végezhetünk velük:
- wait(s) - megállít
- signal(s) - továbbenged
- initial(s, v) - alapértéket állít be, itt v egy pozitív egész szám
- writeln(s) - kiírja az értékét
Monitor:
A monitor segítségével teljesen önálló életet élő kis “programo[ka]t” lehet megvalósítani a főprogramon belül, ahol a végrehajtásnál garantált a kölcsönös kizárás. Kiváló eszköz lehet ezért a monitor a párhuzamos környezetben megvalósítandó típusok implementálására, hiszen így nem kell gondot fordítani a szinkronizálásra, holtpontkérdésre. A monitor, mint önálló egység vagy objektum rendelkezik egy azonosítóval, export listával (az elfogadott, végrehajtható eljárások listája), deklarációs résszel és törzzsel. A főprogram és más processzek számára csak az export-lista látszik, így ennek segítségével érhetik el a monitor által biztosított szolgáltatásokat. Egyszerre felmerült igények esetén a monitor FIFO sorrendben szolgálja ki a kérelmező processzeket.
Monitorhívás szintaktikája:
monitor_azonosító.exportált_eljárás_azonosító(paraméterek);
Condition típus:
Olyan beépített típus a Pascal-FC-ben, amely egy FIFO sort valósít meg, így megkönnyíti a monitorok kezelését. Condition típusú változót csak monitor deklarációs részén belül hozhatunk létre, és a deklaráció után üres sor az értéke. Három művelete van:
delay(c) - megállít egy processzt
resume(c) - folytatja egy process végrehajtását úgy, hogy annak előnye lesz
empty(c) - kiüríti a sort
Csatorna (channel):
A típusok felsorolásánál volt szó egy új típusról, a csatornáról (channel). Deklarációja :
type csat_típus = channel of type;
Ezzel a típussal szinkron kommunikációt valósíthatunk meg. Két process adott típusú (a csatorna típus alapja) üzeneteket tud váltani segítségével. A program végrehajtása mindkét szál esetében felfüggesztődik addig, amíg a másik oldali szál fel nem készült a küldésre/fogadásra.
A csatorna erősen típusos, de a condition, csatorna, szemafor és process típus küldése és fogadása nem definiált a nyelvben.
Csak a globális deklarációs részben, azaz csak a főprogramban szabad deklarálni. Tömb vagy rekord része is lehet, és cím szerint paraméterként is átadható.
Műveletei:
? – receive (csat_típus ! kif)
! – send (csat_típus ? valt)
Szinkron típus (synchronous):
A nyelv egy új típussal, a szinkron típussal szolgál. Konstans nincs belőle, de változót vagy mást típus készíthetünk belőle. A felhasználó, programozó számára komoly jelentősége nincs, mivel a nyelv minden program globális deklarációs részénél automatikusan deklarál egy ilyen változót, amit a csatornaműveleteknél használ.
Szelektív várakoztatás:
A szelektív várakoztatással különböző feltételek teljesülésére várhatunk:
- csatorna művelet
- sokszoros csatorna művelet
- process belépés
- időtúllépés
- terminálás
Az időtúllépésre vagy terminálásra várakozás kölcsönösen kizárják egymást. Minden feltételnek van egy “guard”-nak nevezett előfeltétele, amely megszabja, hogy melyik ág nyitott, mely feltételek teljesülésére várhatunk valójában. Ha nincs nyitott ág, akkor hibaüzenetet kapunk. Több nyitott ág és egyidőben teljesült feltétel esetén alapértelmezés szerint nincs meghatározva a végrehajtás sorrendje, de megadhatjuk azt a őri kulcsszó segítségével. Amennyiben az lese ágat meghatároztuk a várakozás végén, és a nyitott ágak között nincs teljesült várakozási feltétel, úgy az lese ág végrehajtódik. lese ág nélkül az első teljesült feltétel ága, vagy a timeout ág hajtódik végre.
Szintaktika:
[pri] select
alternatíva1;
or
alternatíva2;
...
else
utn1;
utnm;
end;
Szabványos könyvtárak
A nyelv nem ad lehetőséget és nem támogatja a szabványos könyvtárak használatát.