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:
  1. neexistuji jine soubory nez standard input (cin), standard output (cout), a endl.
  2. 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.
  3. podporovan typ string, v BACI jsou vestaveny funkce pro praci s retezci, jako napr.: stringCopy, stringCompare, stringConcat,
  4. lze pouzit pole (Array), deklarace vychazi z C++
  5. 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()
  6. 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:

  1. Prelozit ".cm" soubor, dostaneme PCODE soubor (.pco)
    Pouzijeme: bacc [optional_flags] source_filename
    Optional_flags:
  2. -h ukaze help
    -c vytvori .pob objektovy soubor pro nasledne linkovani

  3. 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

 

 

mailBox

Karel Tauser

Sranka BACI Stranka ZOS Posledni uprava : 16.11. 2000