BACI
a C--
Syntax
prekladace C--
- C-- vychazi z
C/C++ syntaxe, konstrukce BACI prekladace C-- jsou podmnozinou konstrukci
prekladace C++
- jsou zde pouzita
nektera omezeni a nove typy:
- neexistuji jine
soubory nez standard input (cin),
standard output (cout), a endl.
- k dispozici jsou
pouze jednoduche datove typy z C/C++, a sice int a char, konstanty
(const) jednoduchych typu jsou tez podporovany, vsechny promenne
musi byt deklarovany na zacatku bloku, kde se vyskytnou.
- podporovan typ
string, v BACI jsou vestaveny funkce pro praci s retezci, jako
napr.: stringCopy,
stringCompare, stringConcat,
- lze pouzit pole
(Array),
deklarace vychazi z C++
- podporovany procedury
a funkce, plati standardni pravidla pro pole pusobnosti promennych,
lze pouzit rekurzi, parametry se prenasi hodnotou ci odkazem, beh programu
zacina volanim main()
- ridici konstrukce:
if-else,
switch/case, for, while, do-while, break
a continue, syntaxe standardni podle C/C++
Konstrukce
pro zapis konkurence
cobegin
- seznam procesu
ke spusteni je uzavren do cobegin
bloku, takove bloky nemohou byt vnoreny, musi se vyskytovat
v hlavnim programu.
- prikazy PCODE
prislusejici k vyjmenovanym proceduram v cobegin
bloku jsou prokladany interpretem
v libovolnem "nahodnem" poradi.
- nekolikanasobne
spusteni stejneho programu obsahujici cobegin
blok je obecne nedeterministicke.
- Main program je
pozastaven, dokud vsechny procesy v cobegin bloku neskonci, pak
pokracuje vypocet prikazem za cobegin
blokem
Pr.
cobegin {
proc1( ... ); proc2( ... ); ... ; procN( ... );
}
semafor
- semaphore
je preddefinovany typ v BACI.
- jde o nezapornou
hodnotu promenne typu int,
ke ktere lze pristupovat pouze omezenym
zpusobem
- BACI zna take
podtyp binarysem, jde o binarni semafor, ktere mu lze priradit
pouze hodnoty 0 a 1
- Funkce nad semaforem:
- initialsem
( semaphore, integer_expression ): jediny zpusob, jak inicializovat
semafor
- p ( semaphore)
ci wait
(semaphore):
vyznam:kdyz semaphore
> 0 pak dekrementuj semaphore o1, volajici muze pokracovat, kdyz semaphore
= 0, pak se proces uspi
- v ( semaphore)
ci signal
(semaphore):
vyznam:kdyz semaphore
= 0 a jeden ci vice procesu spi na semaforu, pak nahodne probudime jeden
z procesu.Pokud na semaforu zadny proces neceka, semafor se zvysi o jedna.
V kazdem pripade volajici proces muze pokracovat.
monitor
- BACI podporuje
Hoaruv koncept monitoru s nekterymi omezenimi.
- monitor
je blok zapsany v C-- s dalsimi vlastnostmi
- vsechny funkce
v promenne monitor jsou viditelne z vnejsku, ale promenne v monitor
nejsou pristupne z vnejsku bloku a lze s nimi operovat pomoci funkci
monitoru
- monitor
muze byt v BACI deklarovana pouze na nejvyssi hierarchicke urovni v
programu, monitory nelze vnorovat
- v jednom casovem
okamziku muze byt provadena pouze jedna funkce nebo procedura monitoru
- tak lze pouzit monitor k implementaci vzajemneho vylouceni
- u procedur a funkci
monitoru se pouzivaji 3 konstrukce pro rizeni konkurence: condition
promenne, waitc (cekani na podminku), a signalc (signal
na podminku).
- ke condition
promennym lze pristupovat pouze pres funkce monitoru, condition
promennauz neobsahuje hodnotu; predstavuje "nekde cekat" nebo "neco
na signal"
- void waitc
(condition cond, int prio): proces monitoru je zablokovany a je mu prirazena
priorita prio pro probuzeni. Tato blokovaci akce umozni jinemu
procesu bezet, pokud je nejaky pripraven
- void waitc
(condition cond): ma stejnou semantiku jako waitc, ale cekani
je prirazena implicitni priorita 10
- void signalc
(condition cond): probudi proces cekajici na cond, ktery ma nejvyssi
prioritu; neceka-li zadny, neprovede nic
- void empty
(condition cond): vraci 1 pokud nejsou zadne procesy cekajici na podminku
cond jinak vraci 0
dalsi
konstrukce pro konkurenci:
- atomic
klicove slovo:
pokud je funkce definovana jako atomic,pak je neprerusitelna,
interpret neprerusi atomic
funkci
prepnutim kontextu
- void suspend
( void ): necha volajici vlakno spat
- void revive
( int process_id ): obnovi proces s identifikatorem id.
- int which_proc(
void ): vraci cislo procesu aktualniho vlakna.
- int random
(int range): vraci nahodne generovany integer v rozsahu 0..range-1
Pouziti
BACI
BACI zdrojovy soubor
pripraveny pro C-- prekladac by mel mit priponu .cm. 2 kroky pro spusteni
programu:
- Prelozit ".cm"
soubor, dostaneme PCODE soubor (.pco)
Pouzijeme: bacc [optional_flags] source_filename
Optional_flags:
-h ukaze help
-c vytvori .pob objektovy soubor pro nasledne linkovani
- interpretovat
PCODE soubor (.pco) pro beh programu
Pouzijeme: bainterp [optional_flags] pcode_filename
Optional_flags:
-d vstup do
debuggeru, jednoduchy krok, nastaveni breakpointu
-e ukaze aktivacni zaznam (AR) pri vstupu do kazdeho procesu
-x ukaze AR pri vystupu z kazdeho procesu
-t oznami ukonceni procesu
-h ukaze tento help
-p ukaze PCODE
instrukce jak jsou provadeny
- existuje shell
script baccint, ktery vola prekladac a pak zavola interpret,
predava parametry z prikazove radky interpretu
- pokud pouzivate
syntaxi PASCAL prekladace, pak by zdrojovy soubor mel mit priponu .pm
a program se preklada BACI-Pascal
prekladacem bapas.
Priklad
- nasledujici seznam
vygeneroval C-- BACI prekladac
- cislo napravo
od cisla radky je PCODE offset instrukce zacinajici na prislusne radce
- BACI prekladac
vytvari seznam ze souboru "incr.cm" (stahnete
si)
- seznam je ulozen
do souboru "increment.lst"
- soubor "incremen.pco"
je rovnez vytvoren a pouzivan interpretem
BACI System: C-- to PCODE Compiler,
10:31 21 Oct 1997
Source file: incremen.cm Fri
Sep 8 16:51:00 1995
line pc
1 0 const int m = 5;
2 0 int n;
3 0
4 0 void incr (char id)
5 0 {
6 0 int i;
7 0
8 0 for (i = 1; i <= m; i
= i + 1)
9 14 {
10 14 n = n +1;
11 14 cout id " n =" n
" i =";
12 25 cout i " " id endi;
13 31 }
14 32 }
15 33
16 33 main()
17 34 {
18 34 n = 0;
19 37 cobegin
20 38 {
21 38 incr( 'A' ); incr( 'B'
); incr( 'C');
22 50 }
23 51 cout "The sum is "
n endl;
24 55 }
Nasledujici seznam byl vygenerovan BACI interpretem, interpret
spousti program prelozeny
do "incremen.pco".
Source file: incremen.cm Wed Oct 22
21:18:02 1997
Executing PCODE ...
C n =1 i =A n =1 C2 i =
1 A
C n =4 i =2 C
B n =A n =5 i = 24 A
i =1 B
AC n = n =6 i =3 C6 i =3
A
C n =7 i =4 C
B n =9 i=2 BA n =8
i =4 A
C n =8 i =5 A n =9C
i =5 A
B n =10 i =3 B
B n =11 i =4 B
B n =12 i =4 B
The sum is 12
|