Simulazione e realtime
PEARL (Process and Experiment Automation Realtime Language)è un linguaggio per scrivere programmi multitasking e realtime iniziato nel 1977 e successivamente evolutosi fino ad essere standardizzato dal DIN (Deutsches Institut für Normung) come PEARL-90 (1998).
Scopo dichiarato di PEARL è di essere indipendente dall’hardware e facile da imparare.
I tipi di dato sono numeri FIXED e FLOAT, interi e floating point, sono dimensionabili rispettivamente fino a 31 e 53 bit. La gestione delle stringhe è fissa limitata a 255 bytes; il typo Bit può essere espresso in base 2, 4, 8 e 16 ed è corredato di operatori quali >< o CAT per concatenare.
Ogni variabile o oggetto, deve essere esplicitamente dichiarata tramite DECLARE o DCL, si utilizza SPECIFY per riferirsi ad un oggetto già dichiarato, ad esempio per ridefinirne il nome o nelle specificazione delle caratteristiche di un dispositivo di input output. Le costanti sono ottenute tramite dichiarazione con assegnazione di valore iniziale e con attributo protetto (INV): DCL PiGreco INV FLOAT INIT(3.1415);. Le matrici, fino a 4 dimensioni, sono indicate facendo seguire al nome della variabile, le dimensioni racchiuse fra parentesi tonde, con la possibilità di indicarne il range: DCL Dice(1:6) FIXED; ! matrice di 6 elementi.
Fra
i tipi di variabile, visto lo scopo di PEARL, sono presenti CLOCK
e DURATION
per la gestione del tempo e INTERRUPT,
SIGNAL,
SEMA
e BOLT
per la gestione del multitasking. In particolare le variabili SEMA e BOLT gestiscono l’accesso concorrente alle risorse, il primo in modo
esclusivo, tramite le istruzioni REQUEST
e RELEASE,
il secondo per gestire la condivisione di una risorsa, ad esempio un record di
un Data Base, modificabile da un solo processo, ma accessibile in lettura da più
processi contemporaneamente.
I programmi sono strutturati in moduli formati da due parti SYSTEM e PROBLEM; in cui la prima contiene l’indicazione dell’ambiente fisico (interrupt, periferiche di input output).
Le strutture di controllo sono IF ... THEN ... ELSE ... e CASE, FOR e WHILE. L’istruzione FOR prevede una variabile di ciclo, da non dichiarare, un valore da raggiungere ed un’eventuale valore da addizionare alla variabile di ciclo; il blocco di istruzioni di FOR e WHILE è delimitato da REPEAT e END;. Il delimitatore di IF... e CASE è FIN; benché sia accettato per IF anche END;. Il linguaggio prevede istruzione GOTO label.
L’esempio, oltre ad illustrare la struttura di un semplice programma PEARL, esemplifica l’utilizzo dell’input output con la dichiarazione della risorsa fisica utilizzata: terminal: /TYA <->;, la dichiarazione (SPECIFY terminal DATION INOUT ALPHIC;) delle caratteristiche del flusso di dati ed infine l’utilizzo, con un esempio delle evolute possibilità di formattazione previste dal linguaggio; si noti, ad esempio, la possibilità di indicare quante volte uno stesso formato si ripete: ...(2)(A,F(7))....
MODULE Ross;
SYSTEM; terminal: /TYA <->; PROBLEM; SPECIFY terminal DATION INOUT ALPHIC; Ross: TASK; DCL (Num,RossNum) FIXED(31);
RossNum := 0;
! accettato anche RossNum = 0;
PUT 'Quale Numero di Ross? ' TO
terminal BY SKIP,A; GET Num FROM terminal BY SKIP,F(4); FOR i FROM 1 BY 1 TO Num REPEAT RossNum = RossNum + i*i; END; PUT 'Ross Number!',Num,' is ',RossNum TO terminal BY SKIP,(2)(A,F(7)),SKIP; END; MODEND; |
Qui di seguito una sessione di esecuzione del programma in ambiente RTOS-UH di Atari (emulato su Windows).
MODULE PMOD; PROBLEM; SPC Start TASK GLOBAL; Run: TASK MAIN; ACTIVATE
Start; END; MODEND; |
Figura
2.63
‑
1
Il programma permette lo sviluppo di applicazioni
modulari, previa dichiarazione GLOBAL della risorsa che è resa disponibile, sia essa variabile
o procedura o TASK,
e specificazione di GLOBAL
sul modulo che utilizza tale risorsa. Qui a lato il semplice programma che
attiva il TASK Start di Figura 2.63‑2
.
Le istruzioni per gestire i Task sono molteplici: ACTIVATE,
con opzioni, sia temporali che relative alla priorità, TERMINATE, SUSPEND, CONTINUE e PREVENT. La sincronizzazione avviene gestendo variabili di tipo SEMA
o BOLT.
Le
istruzioni matematiche sono complete, mancano, ed è strano per un linguaggio
orientato al multitasking ed alla simulazione, funzioni per generare numeri
casuali.
L’esempio che segue è la determinazione dei divisori di
un numero eseguita da due processi concorrenti.
:
! PE version 1.6-E in RTOS - UH
MODULE
Divisori; SYSTEM;
terminal: /TYA <->; PROBLEM; DCL
Num FIXED(31); ! numero da controllare (Anche DECLARE Num Fixed(31))
DCL Seq FIXED(31) INIT(1); ! progressivo
DECLARE Sem SEMA; !
default initialisation: free
SPC terminal DATION INOUT ALPHIC;
DCL UltimoDiv FIXED(31);
! ultimo divisore GetNum:
PROC RETURNS(FIXED(31));
Seq := Seq+1;
RETURN (Seq);
END; CALC1: TASK;
DCL L1 FIXED(31);
REQUEST Sem; L1=GetNum; RELEASE
Sem;
IF (Num REM L1) == 0 THEN
PUT L1,' ',Num /L1,' A ' TO terminal BY (2)(F(5),A),SKIP;
UltimoDiv = L1; FIN;
END; CALC2: TASK;
DCL S1 FIXED(31);
REQUEST Sem; S1=GetNum; RELEASE
Sem;
IF (Num REM S1) == 0 THEN
PUT S1,' ',Num /S1,' B ' TO terminal BY (2)(F(5),A),SKIP;
UltimoDiv = S1; FIN; END; Orologio:
TASK;
IF Seq * Seq > Num THEN
PREVENT;
! blocca se stesso
PREVENT CALC1;
PREVENT CALC2;
IF UltimoDiv == 1 THEN
PUT 'primo: ',Num TO terminal BY A,F(7),SKIP;
FIN;
PUT 'Fine' TO terminal BY A,SKIP;
FIN;
END; Start: TASK
MAIN GLOBAL;
PUT 'Immettere numero ' TO terminal BY SKIP,A,SKIP;
GET Num FROM terminal BY F(7);
PUT TO terminal BY SKIP;
Seq := 1;
! è accettato anche Seq = 1;
UltimoDiv := 1;
RELEASE Sem;
ALL 0.01 SEC ACTIVATE Orologio;
ALL 0.05 SEC ACTIVATE CALC1;
ALL 0.03 SEC ACTIVATE CALC2; END;
MODEND; |
Nel 1968 PEARL è un linguaggio didattico baseto su catene di Markov, usato
in "Nonpareil, a Machine Level Machine Independent Language for the Study
of Semantics", B. Higman, ULICS Intl Report No ICSI 170, U London (1968).
Negli anni 70 Brian Randell sviluppa un linguaggio
multilivello (citato in "Machine Oriented Higher Level Languages", W.
van der Poel, N-H 1974).
Negli anno 80 PEARL è il nome di un linguaggio
algebrico sviluppato da Constable alla Cornell University.
Nome iniziale del linguaggio PERL.