PEARL

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;

 Sinonimi

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.