Introduzione al REXX


Cos'è il REXX?

Il REXX, dall'inglese REstructurated eXtended eXecutor, è un potente linguaggio di programmazione, sviluppato nei laboratori della IBM da Michael CowliShaw. Il motivo per cui ne parliamo in "Just Warp" è che in tutte le versioni di OS/2 è compreso un interprete REXX. Credo sia dunque importante cercare di comprenderlo e poterne sfruttare le potenzialità.
Molti a questo punto si staranno chiedendo "Ma perché imparare un altro linguaggio quando ne esistono molti altri più diffusi e conosciuti? Chi me lo fa fare?". In questo articolo tenterò di dare una risposta a questo quesito, cercando di convincere i più restii a considerare il REXX in un'ottica differente. Comincerò con una introduzione generale, per poi passare ad un primo, semplice programma REXX, integrato da una minima descrizione di alcune caratteristiche del linguaggio.


Prima di tutto, come già anticipato, il supporto per il REXX è compreso in OS/2, o meglio, vi è completamente integrato. Tale integrazione è resa ancora più sfruttabile dal fatto che il REXX è un linguaggio interpretato: ciò significa che un sorgente non deve essere compilato e linkato, alla stregua di altri linguaggi, per ottenere un eseguibile (con estensione .Com o .Exe), ma è sufficiente creare un semplice file di testo (con estensione .Cmd), contenente le istruzioni, e... digitare il suo nome al prompt dei comandi! L'interprete si incaricherà di eseguire riga per riga il file.
Questa integrazione consente di disporre di un potente tool per realizzare sia semplici procedure di installazione di un programma (una sorta di batch file "di lusso"), sia veri e propri programmi o routine di supporto ad applicazioni esistenti.

Una delle caratteristiche che motivano l'interesse verso il REXX è infatti la sua funzione di linguaggio macro a livello di sistema. Se ad esempio uno sviluppatore realizza un programma di videoscrittura, e vuole permettere all'utente di personalizzarlo tramite macro aggiuntive, non dovrà creare "ex novo" un linguaggio macro (e relativo interprete) specifico per il proprio programma, sarà invece sufficiente "appoggiarsi" al REXX. L'utente a sua volta non dovrà imparare un nuovo linguaggio per ogni applicativo utilizzato, una volta imparato il REXX potrà sfruttare le sue potenzialità non solo per scrivere i propri programmi, ma anche per espandere le applicazioni normalmente utilizzate. Alcuni tra gli esempi più conosciuti nel mondo del software shareware sono Zap-O-Comm (ZOC) e FleetStreet, che consentono di estendere le funzionalità del programma mediante semplici "script" REXX.

"Sì, ma devo pur sempre impararlo questo REXX". A rispondere a questa osservazione ha pensato IBM, facendo in modo che il REXX risultasse il più semplice e intuitivo possibile. Esso è infatti caratterizzato da una flessibilità sconosciuta ad altri linguaggi; presenta l'immediatezza d'uso tipica del famoso BASIC, unita alla maggiore ricchezza dei linguaggi strutturati, quali C e Pascal, solo per citare i più conosciuti.
Le regole veramente nuove da imparare per chi ha già programmato in qualsiasi altro linguaggio sono dunque poche, ma anche ai "novizi" della programmazione il REXX risulterà ugualmente semplice.
Ma vediamo in pratica come si presenta un listato in REXX.


Un semplice programma in REXX

Il seguente listato può essere editato semplicemente aprendo l'Editor di Sistema (o qualsiasi altro editor di file di testo) e salvandolo con estensione .cmd (per esempio come Prova1.cmd). Per eseguirlo, è sufficiente aprire una Sessione OS/2 (a schermo intero o in finestra, è indifferente), posizionarsi sulla directory dove è stato salvato il file e digitarne il nome (l'estensione è facoltativa).
/* Programma di prova in REXX */

SAY
SAY "Questo è un semplice esempio di programmazione REXX."
SAY "Scrivi quello che vuoi, 'fine' per uscire!"
SAY

/*  Inizializza le variabili  */
num = 0
Comando = ''

/*  ripeti il ciclo fino a che non viene immessa la stringa "fine"  */

DO WHILE Comando \= 'fine'

  SAY "Inserisci un comando:"

  /* registra nella variabile Comando quanto inserito da tastiera */
  PARSE PULL Comando .

  IF Comando = "" THEN    /*  nessun comando inserito  */
    SAY "Non hai scritto niente!"

   ELSE
  /*  incrementa il numero di comandi e mostra il contenuto
      della variabile Comando */
  DO
    num = num + 1
    SAY "Hai scritto '"Comando"'"
  END /* DO */

END /* DO WHILE */

/*  Scrive quanti comandi sono stati inseriti  */
SAY
SAY "Hai inserito" num "comandi."
SAY "Alla prossima!"

/*  Fine  */

EXIT

I programmatori anche alle prime armi avranno notato la presenza di istruzioni e parole chiave ben note: assegnamenti, variabili, cicli condizionati while e if-then-else sono simili ad quelli di altri linguaggi di programmazione.
Ma vediamo, anche per chi non ha mai programmato, come si presenta un programma REXX, basandoci sul listato sopra riportato.

Prima di tutto, per segnalare che si tratta di un listato REXX e consentire ad OS/2 di richiamare l'interprete è necessario includere un commento nella prima riga del file, non preceduto da spazi.

I commenti

I commenti sono semplici asserzioni o informazioni utili a migliorare la comprensione del listato; essi verranno ignorati dall'interprete al momento di eseguire il programma. Il loro formato è identico a quello del C, ovvero un /* (barra rovesciata e asterisco) per iniziare il commento, e un */ per concluderlo. Apertura e chiusura possono comparire anche su righe differenti, consentendo di inserire commenti lunghi più di una riga. I commenti possono essere nidificati.

Dopo tale commento (può essere anche un semplice /**/), si può cominciare ad inserire le istruzioni REXX.
La prima di esse, "SAY", permette di scrivere sul video una stringa passata come argomento.

Le stringhe

Le stringhe sono delle semplici sequenze di caratteri racchiuse tra apici ('') o doppi apici (""). L'utilizzo dell'uno o dell'altro carattere non fa differenza, l'importante è ricordarsi di non modificarlo alla fine della stringa: verrà infatti considerata errata l'espressione "stringa' o 'stringa", l'interprete segnalerà: Unmatched "/*" or quote.

Le variabili

Le due istruzioni successive inizializzano le due variabili utilizzate dal programma. Non è obbligatorio compiere questa operazione ogni volta, sebbene in questo caso sia necessario per assicurarsi che non contengano valori indesiderati.
Le variabili nel REXX non devono essere dichiarate esplicitamente all'interno del programma, ma possono essere direttamente utilizzate all'occorrenza, come avviene nel BASIC. Il tipo (cioè i valori che può assumere una variabile, ad esempio un carattere, un numero intero, reale, eccetera) viene determinato in base al valore attribuito alla variabile.

I cicli e i blocchi di istruzioni

L'istruzione DO WHILE c ... END permette di eseguire le istruzioni comprese tra il DO e l'END fino a che è verificata la condizione c; in questo caso, viene ripetuto il blocco fino a che Comando non assume il valore "fine". A questo punto si passa all'istruzione che segue il while. Le strutture di controllo verranno comunque approfondite in un eventuale futuro articolo.
È importante invece descrivere i blocchi. Un blocco è una sequenza di istruzioni che si vuole raggruppare, ad esempio, per essere eseguita dopo il verificarsi di una determinata condizione. Viene delimitato dalle parole chiave DO e END. Tutte le istruzioni comprese tra questi delimitatori fanno parte del blocco.
Nel sorgente considerato, il blocco di istruzioni più esterno è quello eseguito da WHILE, che rappresenta un controllo sull'esecuzione del blocco DO ... END nel quale è inserito.
I blocchi possono essere nidificati, ossia all'interno di un blocco ne possono comparire quanti se ne vogliono: occorre dunque prestare attenzione alla corretta disposizione degli END. È a tal proposito consigliabile (anche se non obbligatorio), per rendere più agevole la comprensione del proprio programma, indentare (ossia fare rientrare) ogni blocco di istruzioni di un numero opzionale, ma possibilmente costante all'interno del listato, di spazi, così da evidenziare la struttura dei blocchi di istruzioni realizzati.
È comunque consentito inserire più istruzioni in una singola linea del proprio programma: in questo caso è sufficiente aggiungere un ";" (punto e virgola) alla fine di ogni istruzione. L'uso dei delimitatori, obbligatori in altri linguaggi, nel REXX è invece facoltativo negli altri casi (come ad esempio nel listato preso in considerazione).
Il programma di esempio risulterebbe dunque:

SAY; SAY "Questo è un semplice esempio di programmazione REXX."; SAY "Scrivi quello che vuoi, 'fine' per uscire!"; num = 0; Comando = ''; DO WHILE Comando \= 'fine'; SAY "Inserisci un comando:"; PARSE PULL Comando .; IF Comando = "" THEN SAY "Non hai scritto niente!"; ELSE; DO; num = num + 1; SAY "Hai scritto '"Comando"'"; END; END; SAY; SAY "Hai inserito" num "comandi."; SAY "Alla prossima!"; EXIT;

Non troppo leggibile a mio avviso...

Continuando con l'analisi dell'esempio, troviamo l'istruzione PARSE PULL Comando ., che consente di leggere quanto inserito da tastiera nella variabile Comando. L'istruzione PULL verrà approfondita in un successivo articolo. Provate per intanto a togliere la parola PARSE o il "." (punto) finale, dopodichè eseguite e inserite delle stringhe che comprendano minuscole, maiuscole e spazi...

If-then-else

L'istruzione successiva è la classica struttura di controllo IF c THEN x ELSE y. Al verificarsi della condizione c (in questo caso, se Comando è uguale alla stringa "fine") viene eseguita l'istruzione x, altrimenti l'istruzione y (in questo caso un blocco di istruzioni).

Fine del programma

Ad ogni stringa immessa il programma incrementerà di uno il valore della variabile num mediante l'assegnamento num = num + 1.
Quando l'utente scriverà "fine", si otterrà l'uscita dal ciclo DO WHILE ... END e verrà mostrato il totale delle stringhe inserite. Si noti che, per poter mostrare il contenuto della variabile num, sono state semplicemente chiuse le virgolette, visualizzando la stringa "Hai inserito", alla quale segue la stampa del valore di num, e ancora una stringa, "comandi.". Per mostrare il contenuto di una variabile a video non è necessario compiere alcuna altra operazione.
Infine l'istruzione EXIT (facoltativa in questo caso) determina l'uscita dal programma.

Per concludere...

Sebbene l'esempio illustrato sia molto banale, vi sarete comunque fatti un'idea della semplicità del REXX.
Se vi saranno richieste sull'argomento, cercherò di illustrarvi alcune fra le numerosissime altre caratteristiche di questo linguaggio che non ho potuto trattare in questo articolo. In particolare ho tralasciato le funzionalità dell'istruzione PARSE e PULL, così come non ho descritto le numerose strutture di controllo di cui il REXX dispone, le subroutine, le funzioni, gli stem, la gestione dello stack...

È a riguardo molto apprezzato qualsiasi tipo di richiesta, critica o semplice suggerimento, che potete farmi pervenire in Matrix Fidonet (2:331/341.75), OS2Net (81:439/211.75) o in e-mail (tm527784@dsi.unimi.it). Non essendo un esperto programmatore REXX potrei tra le altre cose aver commesso qualche errore grossolano: in tal caso confido nella vostra lungimiranza e comprensione... .

Per darvi la possibilità di addentrarvi maggiormente nella programmazione in REXX, sono riportati alla fine dell'articolo alcuni documenti che trattano la maggior parte delle sue funzioni.

Spero comunque di avere illustrato con sufficiente chiarezza l'idea di fondo su cui si basa il REXX: rendere disponibile un semplice ma potente strumento a livello di sistema, senza dover spendere del tempo per studiare gli intricati aspetti di altri linguaggi di programmazione.

Attendo vostri commenti e vi saluto.

Marco Turchetto

Riferimenti

Per iniziare con la programmazione in REXX può essere sufficiente consultare la documentazione on-line fornita insieme al sistema operativo (Informazioni sul REXX nella cartella Informazioni presente sulla Scrivania).
Viene offerta una essenziale guida su come iniziare a programmare in REXX, fornendo, oltre a una trattazione degli argomenti di base, anche un riferimento alle funzioni disponibili e alla gestione di librerie esterne.

Altro ottimo riferimento è il "REXX SourceBook" di Dirk Terrell (e-mail terrell@astro.ufl.edu), un file .INF (visualizzabile quindi mediante l'utility di sistema View.exe) contenente numerose informazioni riguardanti il REXX. Il livello di approndimento è decisamente maggiore della guida compresa in OS/2, per cui chi fosse intenzionato ad approfondire ulteriormente gli aspetti della programmazione in REXX può trovare interessanti spunti in questa guida (al momento disponibile solo in inglese). Vengono inoltre riportati alcuni indrizzi Internet (ftp, gopher o www) dove reperire ulteriori informazioni.

Pagina
precedente
Home Page Sommario Pagina
successiva