linguaggio
didattico scientifico
CUPL è un linguaggio prodotto presso la Cornell University nel 1966 a scopi didattici per IBM/360.
Il linguaggio ha un solo tipo di dato, numeri floating point lunghi, strutturabili come scalari, vettori e matrici.
La struttura del
linguaggio è semilibera, nel senso che l’unico vincolo è che ciò che inizia
nella prima colonna è considerato una etichetta (label).
Dato
l’orientamento scientifico di CUPL, oltre alla presenza delle più comuni
funzioni, vi sono funzioni per operare su matrici (DET(mat)
determinante, DOT(mat1,mat2)
prodotto di matrici, INV(mat)
inverso di una matrice, ecc…).
Il linguaggio è
dotato di assegnazione (LET
variabile = ...), salto di
programma ( GO
TO label), condizionale (IF
condizione THEN istruzioni ELSE istruzioni),
in cui condizione
è una semplice relazione fra due dati, o più relazioni connesse tramite AND o OR.
Le iterazioni sono controllate
dall’istruzione PERFORM
label ... che esegue il
blocco di istruzioni compreso fra la riga contenente label
BLOCK e la riga contenente label
END; la tabella sottostante
contiene i vari tipi di PERFORM.
PERFORM
label |
Esegue il blocco label
BLOCK ... label END |
PERFORM
label n TIMES |
Esegue il blocco label
BLOCK ... label END n
volte |
PERFORM
label WHILE relazione |
Esegue il blocco label
BLOCK ... label END
fintanto che relazione è verificata
|
PERFORM
label FOR variab = da TO finoa BY incremento |
Esegue il blocco label
BLOCK ... label END fino a
che
variab raggiunge finoa |
READ e WRITE permettono l’input e l’output dei dati, in particolare READ è associato alla pseudoistruzione *DATA posta in fondo al sorgente del programma che segnala l’inizio dei dati[1]. Il sorgente esposto è stato generato da un programma Icon (v. par. 1.36 ) che ha interpretato un sorgente in linguaggio IT (v. IT par. 1.38 ). Il programma “verifica” limx→0 sen(x)/x = 1, segnalando i vari rapporti, al decrescere di x.
CUPL
and CORC for UNIX by Eric S. Raymond |
COMMENT PROGRAMMA CUPL CHE INTERPRETA
PROGRAMMA IT source.it
LET C10 = 0.5
LET C11 = 0.4 LAB3 LET C2 =
0.
PERFORM LAB19 FOR C1 = C10 BY -0.01 TO C11 LAB19 BLOCK
LET Y1 = SIN(C1)
LET C2 = C2 + (C1 - Y1)
LET Y4 = Y1 / C1
WRITE Y4 LAB19 END
WRITE C2
LET C10 = C10 - 0.1
LET C11 = C11 - 0.1
IF C10 = 0.4 THEN
GO TO LAB3
STOP |
Nel risultato dell’elaborazione qui riportato, Y4 è il rapporto sen(x)/x e C2 contiene la somma di xi-sen(xi); il ciclo è effettuato due volte.
Y4 =
0.958851077
Y4 =
0.960460996
Y4 =
0.962039949
Y4 =
0.963587841
Y4 =
0.965104580
Y4 =
0.966590076
Y4 =
0.968044239
Y4 =
0.969466982
Y4 =
0.970858222
Y4 =
0.972217873
C2 =
0.157189423
Y4 =
0.973545856
Y4 =
0.974842090
Y4 =
0.976106498
Y4 =
0.977339005
Y4 =
0.978539537
Y4 =
0.979708021
Y4 =
0.980844389
Y4 =
0.981948571
Y4 =
0.983020502
Y4
=
0.984060118 C2 = 0.075529983 |
CUPL è un HDL (Hardware Description Language) per programmare I PLD (Programmable Logic Device) ATMEL.
CORC (CORnell Compiler) è un predecessore di CUPL (1962), di cui ne è un sottoinsieme con piccole differenze nelle parole chiavi, realizzato da Richard Conway e William Maxwell. Lo scopo di CORC era di disporre di un semplice linguaggio per calcoli scientifici.
E’ stato sviluppato inizialmente su Burroughs 220, successivamente su CDC
1604 della Control Data Corporation, infine divenne CUPL (1966) su
IBM System/360. Lo sviluppo privilegiò la robustezza del linguaggio
Accetta tipi
di dato numerici, organizzabili in matrici fino a due dimensioni. Variabili e
matrici devono essere dichiarate, ed eventualmente inizializzate, in testa al
programma; il sorgente del programma ha una struttura fissa, ad esempio il
carattere che indica la continuazione è posto in colonna 21 ed il seguito
inizia a colonna 42.
Il linguaggio
dispone delle più comuni funzioni matematiche e trigonometriche, compresa la
generazione di numeri pseudo casuali ed il calcolo del massimo e minimo di una
serie di valori o espressioni, l’assegnazione è LET variabile = ...,
il salto di programma è GO
TO label, l’istruzione
condizionale è IF
condizione THEN GO TO label ELSE GO TO label, in cui condizione
è una relazione fra due dati, o più relazioni connesse tramite AND o OR
(non mescolati); gli operatori di confronto sono EQL, NEQ, LSS, LEQ,
GTR e GEQ.
Le iterazioni sono gestite tramite
l’istruzione REPEAT
label ..., con alcune
varianti, che esegue il blocco di istruzioni compreso fra la riga contenente label
BEGIN e la riga contenente label
END.
REPEAT label espressione
TIMES |
REPEAT
label UNTIL relazione |
REPEAT label FOR variab = e1,
e2, ... (ei,ej,ek),... |
La versione REPEAT ... FOR
è piuttosto sofisticata, potendosi indicare i valori per cui eseguire il ciclo
e anche sequenze di valori caratterizzate da un valore iniziale, un incremento
della variabile e dal valore finale.
L’input
output è realizzato da READ
e WRITE,
i commenti sono introdotti col comando NOTE.
Qui di seguito un esempio di programma Corc che calcola la radice cubica col metodo di Newton. .
TITLE corc Cube Root with Newton
method Y 1.0 N 1000.0 DIFF 0 CICLO BEGIN
LET Y = ((N/(Y * Y))+ 2 * Y)/3 CICLO END ROOTLOOP NOTE
Compute next value REPEAT
CICLO 1 TIMES NOTE
Compute absolute value of difference LET DIFF = Y
* Y * Y - N IF DIFF
GEQ 0 THEN GO TO POSITIVE LET DIFF =
-DIFF POSITIVE IF DIFF
GEQ 0.001 THEN GO TO ROOTLOOP WRITE
N," ",Y |
Il programma è stato interpretato da TXL (v. Txl par. 1.105 ) che ha generato un sorgente in elastiC (v. elastiC par. 1.26 .
CLP (Cornell List Processor) è una
estensione di CORC per simulazione ispirato al SIMSCRIPT, con
l’implementazioni quali l’accesso
ai nastri magnetici e istruzioni per generare reports. CPL introduce un nuovo
tipo di dato, detto entity, le cui caratteristiche principali sono la
creazione dinamica e l’appartenerenza a differenti insiemi, dette liste. Ci
sono inoltre,istruzioni per generare nuove occorrenze di entity (LET I = NEW CAR), per
cancellarle, per inserirle in liste (INSERT CAR(I) FIRST ON STREET).
Anche l’istruzione REPEAT è stata adattata per operare sulle liste. Qui a
lato una serie di semplici
istruzioni, interpretate da un programma elastiC (v. elastiC
1.26
).
LET I = NEW CAR LET J = NEW CAR LET K = NEW CAR LET L = NEW CAR INSERT CAR(J) ON LANE INSERT CAR(K) ON LANE INSERT CAR(I) ON REPAIR INSERT CAR(L) ON LANE REMOVE CAR(J) FROM LANE |
[1]
Si ricordi che all’epoca i programmi, e spesso i dati,
erano su schede perforate, e quindi era del tutto naturale avere in un solo
pacco di schede programma e dati.